diff options
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/backend/ninjabackend.py | 6 | ||||
-rw-r--r-- | mesonbuild/build.py | 36 | ||||
-rw-r--r-- | mesonbuild/compilers/cython.py | 8 | ||||
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 11 |
4 files changed, 54 insertions, 7 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 844c612..7c97ca3 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1598,9 +1598,11 @@ class NinjaBackend(backends.Backend): args += self.build.get_global_args(cython, target.for_machine) args += self.build.get_project_args(cython, target.subproject, target.for_machine) + ext = opt_proxy[OptionKey('language', machine=target.for_machine, lang='cython')].value + for src in target.get_sources(): if src.endswith('.pyx'): - output = os.path.join(self.get_target_private_dir(target), f'{src}.c') + output = os.path.join(self.get_target_private_dir(target), f'{src}.{ext}') args = args.copy() args += cython.get_output_args(output) element = NinjaBuildElement( @@ -1622,7 +1624,7 @@ class NinjaBackend(backends.Backend): ssrc = os.path.join(gen.get_subdir(), ssrc) if ssrc.endswith('.pyx'): args = args.copy() - output = os.path.join(self.get_target_private_dir(target), f'{ssrc}.c') + output = os.path.join(self.get_target_private_dir(target), f'{ssrc}.{ext}') args += cython.get_output_args(output) element = NinjaBuildElement( self.all_outputs, [output], diff --git a/mesonbuild/build.py b/mesonbuild/build.py index b5fa8ea..1498415 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -37,7 +37,7 @@ from .mesonlib import ( ) from .compilers import ( Compiler, is_object, clink_langs, sort_clink, lang_suffixes, - is_known_suffix, detect_static_linker + is_known_suffix, detect_static_linker, detect_compiler_for ) from .linkers import StaticLinker from .interpreterbase import FeatureNew @@ -833,8 +833,40 @@ class BuildTarget(Target): # If all our sources are Vala, our target also needs the C compiler but # it won't get added above. - if ('vala' in self.compilers or 'cython' in self.compilers) and 'c' not in self.compilers: + if 'vala' in self.compilers and 'c' not in self.compilers: self.compilers['c'] = compilers['c'] + if 'cython' in self.compilers: + key = OptionKey('language', machine=self.for_machine, lang='cython') + if key in self.option_overrides_compiler: + value = self.option_overrides_compiler[key] + else: + value = self.environment.coredata.options[key].value + + try: + self.compilers[value] = compilers[value] + except KeyError: + # TODO: it would be nice to not have to do this here, but we + # have two problems to work around: + # 1. If this is set via an override we have no way to know + # before now that we need a compiler for the non-default language + # 2. Because Cython itself initializes the `cython_language` + # option, we have no good place to insert that you need it + # before now, so we just have to do it here. + comp = detect_compiler_for(self.environment, value, self.for_machine) + + # This is copied verbatim from the interpreter + if self.for_machine == MachineChoice.HOST or self.environment.is_cross_build(): + logger_fun = mlog.log + else: + logger_fun = mlog.debug + logger_fun(comp.get_display_language(), 'compiler for the', self.for_machine.get_lower_case_name(), 'machine:', + mlog.bold(' '.join(comp.get_exelist())), comp.get_version_string()) + if comp.linker is not None: + logger_fun(comp.get_display_language(), 'linker for the', self.for_machine.get_lower_case_name(), 'machine:', + mlog.bold(' '.join(comp.linker.get_exelist())), comp.linker.id, comp.linker.version) + if comp is None: + raise MesonException(f'Cannot find required compiler {value}') + self.compilers[value] = comp def validate_sources(self): if not self.sources: diff --git a/mesonbuild/compilers/cython.py b/mesonbuild/compilers/cython.py index 513f079..34ddff1 100644 --- a/mesonbuild/compilers/cython.py +++ b/mesonbuild/compilers/cython.py @@ -68,6 +68,11 @@ class CythonCompiler(Compiler): 'Python version to target', ['2', '3'], '3', + ), + OptionKey('language', machine=self.for_machine, lang=self.language): coredata.UserComboOption( + 'Output C or C++ files', + ['c', 'cpp'], + 'c', ) }) return opts @@ -76,4 +81,7 @@ class CythonCompiler(Compiler): args: T.List[str] = [] key = options[OptionKey('version', machine=self.for_machine, lang=self.language)] args.append(f'-{key.value}') + lang = options[OptionKey('language', machine=self.for_machine, lang=self.language)] + if lang.value == 'cpp': + args.append('--cplus') return args diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 4d4e5da..2d04d2d 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -1241,9 +1241,14 @@ external dependencies (including libraries) must go to "dependencies".''') args = [a.lower() for a in args] langs = set(self.coredata.compilers[for_machine].keys()) langs.update(args) - if ('vala' in langs or 'cython' in langs) and 'c' not in langs: - if 'vala' in langs: - FeatureNew.single_use('Adding Vala language without C', '0.59.0', self.subproject) + # We'd really like to add cython's default language here, but it can't + # actually be done because the cython compiler hasn't been initialized, + # so we can't actually get the option yet. Because we can't know what + # compiler to add by default, and we don't want to add unnecessary + # compilers we don't add anything for cython here, and instead do it + # When the first cython target using a particular language is used. + if 'vala' in langs and 'c' not in langs: + FeatureNew.single_use('Adding Vala language without C', '0.59.0', self.subproject) args.append('c') success = True |