blob: 863e240897c4400e4def0831df4c35c3a5066162 [file]
# SPDX-License-Identifier: Apache-2.0
# Copyright 2012-2017 The Meson development team
from __future__ import annotations
import os.path
import textwrap
import typing as T
from ..linkers import RSPFileSyntax
from .compilers import Compiler
from .mixins.islinker import BasicLinkerIsCompilerMixin
if T.TYPE_CHECKING:
from ..dependencies import Dependency
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,
env: Environment, runner: T.Optional[str] = None):
super().__init__([], exelist, version, for_machine, env)
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_source_code(self) -> str:
return textwrap.dedent('''
public class Sanity {
static public void Main () {
}
}
''')
def _sanity_check_run_with_exe_wrapper(self, command: T.List[str]) -> T.List[str]:
if self.runner:
return [self.runner] + command
return command
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,
env: Environment):
super().__init__(exelist, version, for_machine, env, 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