aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2018-10-04 20:52:08 -0400
committerJohn Ericson <git@JohnEricson.me>2019-06-09 13:13:25 -0400
commit07777e15d47dbddaf849d24b3a30c85745c533ca (patch)
treef472472ed511498c329b4e13e19b1585e1afb621 /mesonbuild/interpreter.py
parent32e827dcdc451e1c5dde952cf08e4b654eac7057 (diff)
downloadmeson-07777e15d47dbddaf849d24b3a30c85745c533ca.zip
meson-07777e15d47dbddaf849d24b3a30c85745c533ca.tar.gz
meson-07777e15d47dbddaf849d24b3a30c85745c533ca.tar.bz2
Purge `is_cross` and friends without changing user interfaces
In most cases instead pass `for_machine`, the name of the relevant machines (what compilers target, what targets run on, etc). This allows us to use the cross code path in the native case, deduplicating the code. As one can see, environment got bigger as more information is kept structured there, while ninjabackend got a smaller. Overall a few amount of lines were added, but the hope is what's added is a lot simpler than what's removed.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py137
1 files changed, 66 insertions, 71 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 7c17e1c..5dddb22 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -21,7 +21,7 @@ from . import optinterpreter
from . import compilers
from .wrap import wrap, WrapMode
from . import mesonlib
-from .mesonlib import FileMode, MachineChoice, Popen_safe, listify, extract_as_list, has_path_sep
+from .mesonlib import FileMode, MachineChoice, PerMachine, Popen_safe, listify, extract_as_list, has_path_sep
from .dependencies import ExternalProgram
from .dependencies import InternalDependency, Dependency, NotFoundDependency, DependencyException
from .interpreterbase import InterpreterBase
@@ -738,7 +738,7 @@ class BuildTargetHolder(TargetHolder):
return r.format(self.__class__.__name__, h.get_id(), h.filename)
def is_cross(self):
- return self.held_object.is_cross()
+ return not self.held_object.environment.machines.matches_build_machine(self.held_object.for_machine)
@noPosargs
@permittedKwargs({})
@@ -1696,8 +1696,10 @@ class ModuleHolder(InterpreterObject, ObjectHolder):
data=self.interpreter.build.data,
headers=self.interpreter.build.get_headers(),
man=self.interpreter.build.get_man(),
- global_args=self.interpreter.build.global_args,
- project_args=self.interpreter.build.projects_args.get(self.interpreter.subproject, {}),
+ #global_args_for_build = self.interpreter.build.global_args.build,
+ global_args = self.interpreter.build.global_args.host,
+ #project_args_for_build = self.interpreter.build.projects_args.build.get(self.interpreter.subproject, {}),
+ project_args = self.interpreter.build.projects_args.host.get(self.interpreter.subproject, {}),
build_machine=self.interpreter.builtin['build_machine'].held_object,
host_machine=self.interpreter.builtin['host_machine'].held_object,
target_machine=self.interpreter.builtin['target_machine'].held_object,
@@ -1847,10 +1849,7 @@ class MesonMain(InterpreterObject):
native = True
if not isinstance(native, bool):
raise InterpreterException('Type of "native" must be a boolean.')
- if native:
- clist = self.interpreter.coredata.compilers
- else:
- clist = self.interpreter.coredata.cross_compilers
+ clist = self.interpreter.coredata.compilers[MachineChoice.BUILD if native else MachineChoice.HOST]
if cname in clist:
return CompilerHolder(clist[cname], self.build.environment, self.interpreter.subproject)
raise InterpreterException('Tried to access compiler for unspecified language "%s".' % cname)
@@ -2085,7 +2084,7 @@ class Interpreter(InterpreterBase):
# have the compilers needed to gain more knowledge, so wipe out old
# inferrence and start over.
machines = self.build.environment.machines.miss_defaulting()
- machines.build = environment.detect_machine_info(self.coredata.compilers)
+ machines.build = environment.detect_machine_info(self.coredata.compilers.build)
self.build.environment.machines = machines.default_missing()
assert self.build.environment.machines.build.cpu is not None
assert self.build.environment.machines.host.cpu is not None
@@ -2237,10 +2236,10 @@ class Interpreter(InterpreterBase):
def get_variables(self):
return self.variables
- def check_cross_stdlibs(self):
- if self.build.environment.is_cross_build():
- props = self.build.environment.properties.host
- for l in self.coredata.cross_compilers.keys():
+ def check_stdlibs(self):
+ for for_machine in MachineChoice:
+ props = self.build.environment.properties[for_machine]
+ for l in self.coredata.compilers[for_machine].keys():
try:
di = mesonlib.stringlistify(props.get_stdlib(l))
if len(di) != 2:
@@ -2248,7 +2247,7 @@ class Interpreter(InterpreterBase):
% l)
projname, depname = di
subproj = self.do_subproject(projname, 'meson', {})
- self.build.cross_stdlibs[l] = subproj.get_variable_method([depname], {})
+ self.build.stdlibs.host[l] = subproj.get_variable_method([depname], {})
except KeyError:
pass
except InvalidArguments:
@@ -2729,7 +2728,7 @@ external dependencies (including libraries) must go to "dependencies".''')
mlog.log('Project version:', mlog.bold(self.project_version))
self.add_languages(proj_langs, True)
if not self.is_subproject():
- self.check_cross_stdlibs()
+ self.check_stdlibs()
@permittedKwargs(permitted_kwargs['add_languages'])
@stringArgs
@@ -2786,37 +2785,38 @@ external dependencies (including libraries) must go to "dependencies".''')
raise Exception()
def add_languages(self, args, required):
+ success = self.add_languages_for(args, required, MachineChoice.BUILD)
+ success &= self.add_languages_for(args, required, MachineChoice.HOST)
+ return success
+
+ def add_languages_for(self, args, required, for_machine: MachineChoice):
success = True
- need_cross_compiler = self.environment.is_cross_build()
for lang in sorted(args, key=compilers.sort_clink):
lang = lang.lower()
- if lang in self.coredata.compilers:
- comp = self.coredata.compilers[lang]
- cross_comp = self.coredata.cross_compilers.get(lang, None)
+ clist = self.coredata.compilers[for_machine]
+ machine_name = for_machine.get_lower_case_name()
+ if lang in clist:
+ comp = clist[lang]
else:
try:
- (comp, cross_comp) = self.environment.detect_compilers(lang, need_cross_compiler)
+ comp = self.environment.detect_compiler_for(lang, for_machine)
if comp is None:
raise InvalidArguments('Tried to use unknown language "%s".' % lang)
comp.sanity_check(self.environment.get_scratch_dir(), self.environment)
- if cross_comp:
- cross_comp.sanity_check(self.environment.get_scratch_dir(), self.environment)
except Exception:
if not required:
- mlog.log('Compiler for language', mlog.bold(lang), 'not found.')
+ mlog.log('Compiler for language',
+ mlog.bold(lang), 'for the', machine_name,
+ 'machine not found.')
success = False
continue
else:
raise
- mlog.log('Native', comp.get_display_language(), 'compiler:',
+ mlog.log(comp.get_display_language(), 'compiler for the', machine_name, 'machine:',
mlog.bold(' '.join(comp.get_exelist())), comp.get_version_string())
self.build.ensure_static_linker(comp)
- if need_cross_compiler:
- mlog.log('Cross', cross_comp.get_display_language(), 'compiler:',
- mlog.bold(' '.join(cross_comp.get_exelist())), cross_comp.get_version_string())
- self.build.ensure_static_cross_linker(cross_comp)
- langs = self.coredata.compilers.keys()
+ langs = self.coredata.compilers[for_machine].keys()
if 'vala' in langs:
if 'c' not in langs:
raise InterpreterException('Compiling Vala requires C. Add C to your project languages and rerun Meson.')
@@ -2935,14 +2935,9 @@ external dependencies (including libraries) must go to "dependencies".''')
)
def _find_cached_dep(self, name, kwargs):
- # Check if we want this as a cross-dep or a native-dep
- # FIXME: Not all dependencies support such a distinction right now,
- # and we repeat this check inside dependencies that do. We need to
- # consolidate this somehow.
- if self.environment.is_cross_build() and kwargs.get('native', False):
- for_machine = MachineChoice.BUILD
- else:
- for_machine = MachineChoice.HOST
+ # Check if we want this as a build-time / build machine or runt-time /
+ # host machine dep.
+ for_machine = MachineChoice.BUILD if kwargs.get('native', False) else MachineChoice.HOST
identifier = dependencies.get_dep_identifier(name, kwargs)
cached_dep = self.coredata.deps[for_machine].get(identifier)
@@ -3097,10 +3092,7 @@ external dependencies (including libraries) must go to "dependencies".''')
# cannot cache them. They must always be evaluated else
# we won't actually read all the build files.
if dep.found():
- if self.environment.is_cross_build() and kwargs.get('native', False):
- for_machine = MachineChoice.BUILD
- else:
- for_machine = MachineChoice.HOST
+ for_machine = MachineChoice.BUILD if kwargs.get('native', False) else MachineChoice.HOST
self.coredata.deps[for_machine].put(identifier, dep)
return DependencyHolder(dep, self.subproject)
@@ -3849,45 +3841,47 @@ different subdirectory.
env = self.unpack_env_kwarg(kwargs)
self.build.test_setups[setup_name] = build.TestSetup(exe_wrapper, gdb, timeout_multiplier, env)
- def get_argdict_on_crossness(self, native_dict, cross_dict, kwargs):
+ # TODO make cross agnostic, just taking into account for_machine
+ # TODO PerMachine[T], Iterator[T]
+ def get_argdict_on_crossness(self, dicts_per_machine: PerMachine, kwargs) -> typing.Iterator:
for_native = kwargs.get('native', not self.environment.is_cross_build())
if not isinstance(for_native, bool):
raise InterpreterException('Keyword native must be a boolean.')
- if for_native:
- return native_dict
+ if self.environment.is_cross_build():
+ if for_native:
+ return iter([dicts_per_machine[MachineChoice.BUILD]])
+ else:
+ return iter([dicts_per_machine[MachineChoice.HOST]])
else:
- return cross_dict
+ if for_native:
+ return iter([dicts_per_machine[MachineChoice.BUILD],
+ dicts_per_machine[MachineChoice.HOST]])
+ else:
+ return iter([])
@permittedKwargs(permitted_kwargs['add_global_arguments'])
@stringArgs
def func_add_global_arguments(self, node, args, kwargs):
- argdict = self.get_argdict_on_crossness(self.build.global_args,
- self.build.cross_global_args,
- kwargs)
- self.add_global_arguments(node, argdict, args, kwargs)
+ for argdict in self.get_argdict_on_crossness(self.build.global_args, kwargs):
+ self.add_global_arguments(node, argdict, args, kwargs)
@permittedKwargs(permitted_kwargs['add_global_link_arguments'])
@stringArgs
def func_add_global_link_arguments(self, node, args, kwargs):
- argdict = self.get_argdict_on_crossness(self.build.global_link_args,
- self.build.cross_global_link_args,
- kwargs)
- self.add_global_arguments(node, argdict, args, kwargs)
+ for argdict in self.get_argdict_on_crossness(self.build.global_link_args, kwargs):
+ self.add_global_arguments(node, argdict, args, kwargs)
@permittedKwargs(permitted_kwargs['add_project_arguments'])
@stringArgs
def func_add_project_arguments(self, node, args, kwargs):
- argdict = self.get_argdict_on_crossness(self.build.projects_args,
- self.build.cross_projects_args,
- kwargs)
- self.add_project_arguments(node, argdict, args, kwargs)
+ for argdict in self.get_argdict_on_crossness(self.build.projects_args, kwargs):
+ self.add_project_arguments(node, argdict, args, kwargs)
@permittedKwargs(permitted_kwargs['add_project_link_arguments'])
@stringArgs
def func_add_project_link_arguments(self, node, args, kwargs):
- argdict = self.get_argdict_on_crossness(self.build.projects_link_args,
- self.build.cross_projects_link_args, kwargs)
- self.add_project_arguments(node, argdict, args, kwargs)
+ for argdict in self.get_argdict_on_crossness(self.build.projects_link_args, kwargs):
+ self.add_project_arguments(node, argdict, args, kwargs)
def add_global_arguments(self, node, argsdict, args, kwargs):
if self.is_subproject():
@@ -3940,7 +3934,8 @@ different subdirectory.
self.print_extra_warnings()
def print_extra_warnings(self):
- for c in self.coredata.compilers.values():
+ # TODO cross compilation
+ for c in self.coredata.compilers.host.values():
if c.get_id() == 'clang':
self.check_clang_asan_lundef()
break
@@ -4091,13 +4086,10 @@ Try setting b_lundef to false instead.'''.format(self.coredata.base_options['b_s
if not args:
raise InterpreterException('Target does not have a name.')
name, *sources = args
- if self.environment.is_cross_build():
- if kwargs.get('native', False):
- is_cross = False
- else:
- is_cross = True
+ if kwargs.get('native', False):
+ for_machine = MachineChoice.BUILD
else:
- is_cross = False
+ for_machine = MachineChoice.HOST
if 'sources' in kwargs:
sources += listify(kwargs['sources'])
sources = self.source_strings_to_files(sources)
@@ -4128,9 +4120,9 @@ Try setting b_lundef to false instead.'''.format(self.coredata.base_options['b_s
kwargs = {k: v for k, v in kwargs.items() if k in targetclass.known_kwargs}
kwargs['include_directories'] = self.extract_incdirs(kwargs)
- target = targetclass(name, self.subdir, self.subproject, is_cross, sources, objs, self.environment, kwargs)
+ target = targetclass(name, self.subdir, self.subproject, for_machine, sources, objs, self.environment, kwargs)
- if is_cross:
+ if not self.environment.machines.matches_build_machine(for_machine):
self.add_cross_stdlib_info(target)
l = targetholder(target, self)
self.add_target(name, l.held_object)
@@ -4157,18 +4149,21 @@ This will become a hard error in the future.''', location=self.current_node)
def get_used_languages(self, target):
result = {}
for i in target.sources:
- for lang, c in self.coredata.compilers.items():
+ # TODO other platforms
+ for lang, c in self.coredata.compilers.host.items():
if c.can_compile(i):
result[lang] = True
break
return result
def add_cross_stdlib_info(self, target):
+ if target.for_machine != MachineChoice.HOST:
+ return
for l in self.get_used_languages(target):
props = self.environment.properties.host
if props.has_stdlib(l) \
and self.subproject != props.get_stdlib(l)[0]:
- target.add_deps(self.build.cross_stdlibs[l])
+ target.add_deps(self.build.stdlibs.host[l])
def check_sources_exist(self, subdir, sources):
for s in sources: