aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNomura <nomura.rh@gmail.com>2023-08-02 22:34:39 +0200
committerXavier Claessens <xclaesse@gmail.com>2023-08-04 14:46:39 -0400
commit50baf3c626267252a2d943a49d8e7c0402e23218 (patch)
tree3b50e104ec4cf1d484693e5ef903b6147ef8b3c2
parent183e4b8e903c6c4c057d09549e669d6292478a4e (diff)
downloadmeson-50baf3c626267252a2d943a49d8e7c0402e23218.zip
meson-50baf3c626267252a2d943a49d8e7c0402e23218.tar.gz
meson-50baf3c626267252a2d943a49d8e7c0402e23218.tar.bz2
Add default_options argument to find_program()
-rw-r--r--docs/markdown/snippets/find_program_default_options.md4
-rw-r--r--docs/yaml/functions/find_program.yaml10
-rw-r--r--mesonbuild/interpreter/interpreter.py15
-rw-r--r--mesonbuild/interpreter/kwargs.py1
-rw-r--r--test cases/common/265 default_options in find_program/meson.build5
-rw-r--r--test cases/common/265 default_options in find_program/subprojects/dummy.wrap5
-rw-r--r--test cases/common/265 default_options in find_program/subprojects/dummy/dummy.c3
-rw-r--r--test cases/common/265 default_options in find_program/subprojects/dummy/meson.build6
-rw-r--r--test cases/common/265 default_options in find_program/subprojects/dummy/meson_options.txt1
9 files changed, 45 insertions, 5 deletions
diff --git a/docs/markdown/snippets/find_program_default_options.md b/docs/markdown/snippets/find_program_default_options.md
new file mode 100644
index 0000000..2cf9822
--- /dev/null
+++ b/docs/markdown/snippets/find_program_default_options.md
@@ -0,0 +1,4 @@
+## find_program() now supports the 'default_options' argument
+
+In a similar fashion as dependency(), find_program() now also allows you to set default
+options for the subproject that gets built in case of a fallback.
diff --git a/docs/yaml/functions/find_program.yaml b/docs/yaml/functions/find_program.yaml
index 537bbc5..3153bd3 100644
--- a/docs/yaml/functions/find_program.yaml
+++ b/docs/yaml/functions/find_program.yaml
@@ -113,3 +113,13 @@ kwargs:
type: list[str]
since: 0.53.0
description: extra list of absolute paths where to look for program names.
+
+ default_options:
+ type: list[str] | dict[str | bool | int | list[str]]
+ since: 1.3.0
+ description: |
+ An array of default option values
+ that override those set in the subproject's `meson.options`
+ (like `default_options` in [[project]], they only have
+ effect when Meson is run for the first time, and command line
+ arguments override any default options in build files)
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py
index 4ef78e8..95a6e1d 100644
--- a/mesonbuild/interpreter/interpreter.py
+++ b/mesonbuild/interpreter/interpreter.py
@@ -1619,6 +1619,7 @@ class Interpreter(InterpreterBase, HoldableObject):
# the host machine.
def find_program_impl(self, args: T.List[mesonlib.FileOrString],
for_machine: MachineChoice = MachineChoice.HOST,
+ default_options: T.Optional[T.Dict[OptionKey, T.Union[str, int, bool, T.List[str]]]] = None,
required: bool = True, silent: bool = True,
wanted: T.Union[str, T.List[str]] = '',
search_dirs: T.Optional[T.List[str]] = None,
@@ -1627,7 +1628,7 @@ class Interpreter(InterpreterBase, HoldableObject):
args = mesonlib.listify(args)
extra_info: T.List[mlog.TV_Loggable] = []
- progobj = self.program_lookup(args, for_machine, required, search_dirs, extra_info)
+ progobj = self.program_lookup(args, for_machine, default_options, required, search_dirs, extra_info)
if progobj is None:
progobj = self.notfound_program(args)
@@ -1671,6 +1672,7 @@ class Interpreter(InterpreterBase, HoldableObject):
return progobj
def program_lookup(self, args: T.List[mesonlib.FileOrString], for_machine: MachineChoice,
+ default_options: T.Optional[T.Dict[OptionKey, T.Union[str, int, bool, T.List[str]]]],
required: bool, search_dirs: T.List[str], extra_info: T.List[mlog.TV_Loggable]
) -> T.Optional[T.Union[ExternalProgram, build.Executable, OverrideProgram]]:
progobj = self.program_from_overrides(args, extra_info)
@@ -1686,7 +1688,7 @@ class Interpreter(InterpreterBase, HoldableObject):
if wrap_mode != WrapMode.nofallback and self.environment.wrap_resolver:
fallback = self.environment.wrap_resolver.find_program_provider(args)
if fallback and wrap_mode == WrapMode.forcefallback:
- return self.find_program_fallback(fallback, args, required, extra_info)
+ return self.find_program_fallback(fallback, args, default_options, required, extra_info)
progobj = self.program_from_file_for(for_machine, args)
if progobj is None:
@@ -1695,18 +1697,19 @@ class Interpreter(InterpreterBase, HoldableObject):
prog = ExternalProgram('python3', mesonlib.python_command, silent=True)
progobj = prog if prog.found() else None
if progobj is None and fallback and required:
- progobj = self.find_program_fallback(fallback, args, required, extra_info)
+ progobj = self.find_program_fallback(fallback, args, default_options, required, extra_info)
return progobj
def find_program_fallback(self, fallback: str, args: T.List[mesonlib.FileOrString],
+ default_options: T.Dict[OptionKey, T.Union[str, int, bool, T.List[str]]],
required: bool, extra_info: T.List[mlog.TV_Loggable]
) -> T.Optional[T.Union[ExternalProgram, build.Executable, OverrideProgram]]:
mlog.log('Fallback to subproject', mlog.bold(fallback), 'which provides program',
mlog.bold(' '.join(args)))
sp_kwargs: kwtypes.DoSubproject = {
'required': required,
- 'default_options': {},
+ 'default_options': default_options or {},
'version': [],
'cmake_options': [],
'options': None,
@@ -1722,6 +1725,7 @@ class Interpreter(InterpreterBase, HoldableObject):
REQUIRED_KW,
KwargInfo('dirs', ContainerTypeInfo(list, str), default=[], listify=True, since='0.53.0'),
KwargInfo('version', ContainerTypeInfo(list, str), default=[], listify=True, since='0.52.0'),
+ DEFAULT_OPTIONS.evolve(since='1.3.0')
)
@disablerIfNotFound
def func_find_program(self, node: mparser.BaseNode, args: T.Tuple[T.List[mesonlib.FileOrString]],
@@ -1733,7 +1737,8 @@ class Interpreter(InterpreterBase, HoldableObject):
return self.notfound_program(args[0])
search_dirs = extract_search_dirs(kwargs)
- return self.find_program_impl(args[0], kwargs['native'], required=required,
+ default_options = kwargs['default_options']
+ return self.find_program_impl(args[0], kwargs['native'], default_options=default_options, required=required,
silent=False, wanted=kwargs['version'],
search_dirs=search_dirs)
diff --git a/mesonbuild/interpreter/kwargs.py b/mesonbuild/interpreter/kwargs.py
index 13b7430..2a1cd61 100644
--- a/mesonbuild/interpreter/kwargs.py
+++ b/mesonbuild/interpreter/kwargs.py
@@ -232,6 +232,7 @@ class Summary(TypedDict):
class FindProgram(ExtractRequired, ExtractSearchDirs):
+ default_options: T.Dict[OptionKey, T.Union[str, int, bool, T.List[str]]]
native: MachineChoice
version: T.List[str]
diff --git a/test cases/common/265 default_options in find_program/meson.build b/test cases/common/265 default_options in find_program/meson.build
new file mode 100644
index 0000000..99d8425
--- /dev/null
+++ b/test cases/common/265 default_options in find_program/meson.build
@@ -0,0 +1,5 @@
+project('test default_options in find_program')
+
+dummy_exe = find_program('dummy', default_options: ['subproject_option=true'])
+
+test('test_dummy', dummy_exe)
diff --git a/test cases/common/265 default_options in find_program/subprojects/dummy.wrap b/test cases/common/265 default_options in find_program/subprojects/dummy.wrap
new file mode 100644
index 0000000..0c03eec
--- /dev/null
+++ b/test cases/common/265 default_options in find_program/subprojects/dummy.wrap
@@ -0,0 +1,5 @@
+[wrap-file]
+directory = dummy
+
+[provide]
+program_names = dummy \ No newline at end of file
diff --git a/test cases/common/265 default_options in find_program/subprojects/dummy/dummy.c b/test cases/common/265 default_options in find_program/subprojects/dummy/dummy.c
new file mode 100644
index 0000000..a51103c
--- /dev/null
+++ b/test cases/common/265 default_options in find_program/subprojects/dummy/dummy.c
@@ -0,0 +1,3 @@
+int main(void) {
+ return 0;
+} \ No newline at end of file
diff --git a/test cases/common/265 default_options in find_program/subprojects/dummy/meson.build b/test cases/common/265 default_options in find_program/subprojects/dummy/meson.build
new file mode 100644
index 0000000..b644130
--- /dev/null
+++ b/test cases/common/265 default_options in find_program/subprojects/dummy/meson.build
@@ -0,0 +1,6 @@
+project('dummy', 'c')
+
+if get_option('subproject_option')
+ dummy_exe = executable('dummy', 'dummy.c')
+ meson.override_find_program('dummy', dummy_exe)
+endif
diff --git a/test cases/common/265 default_options in find_program/subprojects/dummy/meson_options.txt b/test cases/common/265 default_options in find_program/subprojects/dummy/meson_options.txt
new file mode 100644
index 0000000..c91a24a
--- /dev/null
+++ b/test cases/common/265 default_options in find_program/subprojects/dummy/meson_options.txt
@@ -0,0 +1 @@
+option('subproject_option', type: 'boolean', value: false)