1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
# SPDX-License-Identifier: Apache-2.0
# Copyright 2012-2017 The Meson development team
from __future__ import annotations
import os.path, subprocess
import textwrap
import typing as T
from ..mesonlib import EnvironmentException
from ..linkers import RSPFileSyntax
from .compilers import Compiler
from .mixins.islinker import BasicLinkerIsCompilerMixin
if T.TYPE_CHECKING:
from ..dependencies import Dependency
from ..envconfig import MachineInfo
from ..environment import Environment
from ..mesonlib import MachineChoice
cs_optimization_args: T.Dict[str, T.List[str]] = {
'plain': [],
'0': [],
'g': [],
'1': ['-optimize+'],
'2': ['-optimize+'],
'3': ['-optimize+'],
's': ['-optimize+'],
}
class CsCompiler(BasicLinkerIsCompilerMixin, Compiler):
language = 'cs'
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice,
info: 'MachineInfo', runner: T.Optional[str] = None):
super().__init__([], exelist, version, for_machine, info)
self.runner = runner
@classmethod
def get_display_language(cls) -> str:
return 'C sharp'
def get_always_args(self) -> T.List[str]:
return ['/nologo']
def get_linker_always_args(self) -> T.List[str]:
return ['/nologo']
def get_output_args(self, fname: str) -> T.List[str]:
return ['-out:' + fname]
def get_link_args(self, fname: str) -> T.List[str]:
return ['-r:' + fname]
def get_werror_args(self) -> T.List[str]:
return ['-warnaserror']
def get_pic_args(self) -> T.List[str]:
return []
def get_dependency_compile_args(self, dep: Dependency) -> T.List[str]:
# Historically we ignored all compile args. Accept what we can, but
# filter out -I arguments, which are in some pkg-config files and
# aren't accepted by mcs.
return [a for a in dep.get_compile_args() if not a.startswith('-I')]
def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str],
build_dir: str) -> T.List[str]:
for idx, i in enumerate(parameter_list):
if i[:2] == '-L':
parameter_list[idx] = i[:2] + os.path.normpath(os.path.join(build_dir, i[2:]))
if i[:5] == '-lib:':
parameter_list[idx] = i[:5] + os.path.normpath(os.path.join(build_dir, i[5:]))
return parameter_list
def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]:
return []
def get_pch_name(self, header_name: str) -> str:
return ''
def sanity_check(self, work_dir: str, environment: 'Environment') -> None:
src = 'sanity.cs'
obj = 'sanity.exe'
source_name = os.path.join(work_dir, src)
with open(source_name, 'w', encoding='utf-8') as ofile:
ofile.write(textwrap.dedent('''
public class Sanity {
static public void Main () {
}
}
'''))
pc = subprocess.Popen(self.exelist + self.get_always_args() + [src], cwd=work_dir)
pc.wait()
if pc.returncode != 0:
raise EnvironmentException('C# compiler %s cannot compile programs.' % self.name_string())
if self.runner:
cmdlist = [self.runner, obj]
else:
cmdlist = [os.path.join(work_dir, obj)]
pe = subprocess.Popen(cmdlist, cwd=work_dir)
pe.wait()
if pe.returncode != 0:
raise EnvironmentException('Executables created by Mono compiler %s are not runnable.' % self.name_string())
def needs_static_linker(self) -> bool:
return False
def get_debug_args(self, is_debug: bool) -> T.List[str]:
return ['-debug'] if is_debug else []
def get_optimization_args(self, optimization_level: str) -> T.List[str]:
return cs_optimization_args[optimization_level]
class MonoCompiler(CsCompiler):
id = 'mono'
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice,
info: 'MachineInfo'):
super().__init__(exelist, version, for_machine, info, runner='mono')
def rsp_file_syntax(self) -> 'RSPFileSyntax':
return RSPFileSyntax.GCC
class VisualStudioCsCompiler(CsCompiler):
id = 'csc'
def get_debug_args(self, is_debug: bool) -> T.List[str]:
if is_debug:
return ['-debug'] if self.info.is_windows() else ['-debug:portable']
else:
return []
def rsp_file_syntax(self) -> 'RSPFileSyntax':
return RSPFileSyntax.MSVC
|