Add if_found kwarg to subdir().

pull/2698/head
Jussi Pakkanen 7 years ago
parent dad5779d3c
commit 5bc1009109
  1. 8
      docs/markdown/Reference-manual.md
  2. 13
      docs/markdown/snippets/if-found.md
  3. 8
      mesonbuild/interpreter.py
  4. 11
      test cases/common/165 subdir if_found/meson.build
  5. 1
      test cases/common/165 subdir if_found/subdir/meson.build

@ -1019,7 +1019,7 @@ has one argument the others don't have:
### subdir() ### subdir()
``` meson ``` meson
void subdir(dir_name) void subdir(dir_name, ...)
``` ```
Enters the specified subdirectory and executes the `meson.build` file Enters the specified subdirectory and executes the `meson.build` file
@ -1032,6 +1032,12 @@ current build file and in all subsequent build files executed with
Note that this means that each `meson.build` file in a source tree can Note that this means that each `meson.build` file in a source tree can
and must only be executed once. and must only be executed once.
This function has one keyword argument.
- `if_found` takes one or several dependency objects and will only
recurse in the subdir if they all return `true` when queried with
`.found()`
### subproject() ### subproject()
``` meson ``` meson

@ -0,0 +1,13 @@
# Added `if_found` to subdir
Added a new keyword argument to the `subdir` command. It is given a
list of dependency objects and the function will only recurse in the
subdirectory if they are all found. Typical usage goes like this.
d1 = dependency('foo') # This is found
d2 = dependency('bar') # This is not found
subdir('somedir', if_found : [d1, d2])
In this case the subdirectory would not be entered since `d2` could
not be found.

@ -1374,6 +1374,7 @@ permitted_kwargs = {'add_global_arguments': {'language'},
'shared_library': shlib_kwargs, 'shared_library': shlib_kwargs,
'shared_module': shmod_kwargs, 'shared_module': shmod_kwargs,
'static_library': stlib_kwargs, 'static_library': stlib_kwargs,
'subdir': {'if_found'},
'subproject': {'version', 'default_options'}, 'subproject': {'version', 'default_options'},
'test': {'args', 'env', 'is_parallel', 'should_fail', 'timeout', 'workdir', 'suite'}, 'test': {'args', 'env', 'is_parallel', 'should_fail', 'timeout', 'workdir', 'suite'},
'vcs_tag': {'input', 'output', 'fallback', 'command', 'replace_string'}, 'vcs_tag': {'input', 'output', 'fallback', 'command', 'replace_string'},
@ -2477,7 +2478,7 @@ to directly access options of other subprojects.''')
self.build.man.append(m) self.build.man.append(m)
return m return m
@noKwargs @permittedKwargs(permitted_kwargs['subdir'])
def func_subdir(self, node, args, kwargs): def func_subdir(self, node, args, kwargs):
self.validate_arguments(args, 1, [str]) self.validate_arguments(args, 1, [str])
if '..' in args[0]: if '..' in args[0]:
@ -2486,6 +2487,11 @@ to directly access options of other subprojects.''')
raise InvalidArguments('Must not go into subprojects dir with subdir(), use subproject() instead.') raise InvalidArguments('Must not go into subprojects dir with subdir(), use subproject() instead.')
if self.subdir == '' and args[0].startswith('meson-'): if self.subdir == '' and args[0].startswith('meson-'):
raise InvalidArguments('The "meson-" prefix is reserved and cannot be used for top-level subdir().') raise InvalidArguments('The "meson-" prefix is reserved and cannot be used for top-level subdir().')
for i in mesonlib.extract_as_list(kwargs, 'if_found'):
if not hasattr(i, 'found_method'):
raise InterpreterException('Object used in if_found does not have a found method.')
if not i.found_method([], {}):
return
prev_subdir = self.subdir prev_subdir = self.subdir
subdir = os.path.join(prev_subdir, args[0]) subdir = os.path.join(prev_subdir, args[0])
if os.path.isabs(subdir): if os.path.isabs(subdir):

@ -0,0 +1,11 @@
project('subdir if found', 'c')
found_dep = declare_dependency()
not_found_dep = dependency('nonexisting', required : false)
subdir('nonexisting_dir', if_found : not_found_dep)
variable = 3
subdir('subdir', if_found : found_dep)
assert(variable == 5, 'Subdir was not properly entered.')
Loading…
Cancel
Save