aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2017-08-19 19:47:51 +0300
committerJussi Pakkanen <jpakkane@gmail.com>2017-09-04 22:47:12 +0300
commit72a6683c6f564afa8f8d7e96b0238961aa867f00 (patch)
treeb6c7828fcaaf52472626bb55efb1cad4ba7bad40 /mesonbuild/interpreter.py
parente94a9c8fcfa4776e09c9cabfe01de705ce34b735 (diff)
downloadmeson-72a6683c6f564afa8f8d7e96b0238961aa867f00.zip
meson-72a6683c6f564afa8f8d7e96b0238961aa867f00.tar.gz
meson-72a6683c6f564afa8f8d7e96b0238961aa867f00.tar.bz2
Permit overriding find_program from the cross file.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py46
1 files changed, 37 insertions, 9 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 72df3c7..d71ce1f 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -1317,7 +1317,7 @@ permitted_kwargs = {'add_global_arguments': {'language'},
'custom_target': {'input', 'output', 'command', 'install', 'install_dir', 'build_always', 'capture', 'depends', 'depend_files', 'depfile', 'build_by_default'},
'declare_dependency': {'include_directories', 'link_with', 'sources', 'dependencies', 'compile_args', 'link_args', 'version'},
'executable': exe_kwargs,
- 'find_program': {'required'},
+ 'find_program': {'required', 'native'},
'generator': {'arguments', 'output', 'depfile'},
'include_directories': {'is_system'},
'install_data': {'install_dir', 'install_mode', 'sources'},
@@ -1963,13 +1963,22 @@ class Interpreter(InterpreterBase):
break
self.coredata.base_options[optname] = oobj
- @permittedKwargs(permitted_kwargs['find_program'])
- def func_find_program(self, node, args, kwargs):
- if not args:
- raise InterpreterException('No program name specified.')
- required = kwargs.get('required', True)
- if not isinstance(required, bool):
- raise InvalidArguments('"required" argument must be a boolean.')
+ def program_from_cross_file(self, prognames):
+ bins = self.environment.cross_info.config['binaries']
+ for p in prognames:
+ if hasattr(p, 'held_object'):
+ p = p.held_object
+ if isinstance(p, mesonlib.File):
+ continue # Always points to a local (i.e. self generated) file.
+ if not isinstance(p, str):
+ raise InterpreterException('Executable name must be a string.')
+ if p in bins:
+ exename = bins[p]
+ extprog = dependencies.ExternalProgram(exename)
+ progobj = ExternalProgramHolder(extprog)
+ return progobj
+
+ def program_from_system(self, args):
# Search for scripts relative to current subdir.
# Do not cache found programs because find_program('foobar')
# might give different results when run from different source dirs.
@@ -1992,8 +2001,27 @@ class Interpreter(InterpreterBase):
progobj = ExternalProgramHolder(extprog)
if progobj.found():
return progobj
- if required and not progobj.found():
+
+ @permittedKwargs(permitted_kwargs['find_program'])
+ def func_find_program(self, node, args, kwargs):
+ if not args:
+ raise InterpreterException('No program name specified.')
+ required = kwargs.get('required', True)
+ if not isinstance(required, bool):
+ raise InvalidArguments('"required" argument must be a boolean.')
+ progobj = None
+ if self.build.environment.is_cross_build():
+ use_native = kwargs.get('native', False)
+ if not isinstance(use_native, bool):
+ raise InvalidArguments('Argument to "native" must be a boolean.')
+ if not use_native:
+ progobj = self.program_from_cross_file(args)
+ if progobj is None:
+ progobj = self.program_from_system(args)
+ if required and (progobj is None or not progobj.found()):
raise InvalidArguments('Program "%s" not found or not executable' % exename)
+ if progobj is None:
+ return ExternalProgramHolder(dependencies.ExternalProgram('nonexistingprogram'))
return progobj
def func_find_library(self, node, args, kwargs):