aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/build.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/build.py')
-rw-r--r--mesonbuild/build.py36
1 files changed, 34 insertions, 2 deletions
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: