Skip to content

Commit 17307ad

Browse files
committed
local_program: Allow passing arguments to interpreter
1 parent 08532eb commit 17307ad

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

docs/yaml/functions/local_program.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ kwargs:
3636
after those targets have been built.
3737
3838
interpreter:
39-
type: external_program
39+
type: external_program | array[external_program | str]
4040
description: |
4141
When the program is a [[@custom_tgt]], Meson cannot derive the interpreter
4242
from the file's "shebang" (`#!`) line before it's built. If needed, this
4343
argument allows specifying an interpreter for the script.
44+
If arguments are needed for the interpreter, an array can be passed where
45+
the first element is the interpreter program and the rest are strings.

mesonbuild/interpreter/interpreter.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,7 +1801,7 @@ def func_find_program(self, node: mparser.BaseNode, args: T.Tuple[T.List[mesonli
18011801
'local_program',
18021802
DEPENDS_KW,
18031803
DEPEND_FILES_KW,
1804-
KwargInfo('interpreter', (ExternalProgram, NoneType), default=None),
1804+
KwargInfo('interpreter', (NoneType, ExternalProgram, ContainerTypeInfo(list, (ExternalProgram, str))), default=None),
18051805
)
18061806
def func_local_program(self, node: mparser.BaseNode, args: T.Tuple[T.Union[mesonlib.FileOrString, build.Executable, build.CustomTarget, build.CustomTargetIndex]],
18071807
kwargs: kwtypes.LocalProgram) -> build.LocalProgram:
@@ -1810,7 +1810,7 @@ def func_local_program(self, node: mparser.BaseNode, args: T.Tuple[T.Union[meson
18101810
def _local_program_impl(self, exe: T.Union[mesonlib.FileOrString, build.Executable, build.CustomTarget, build.CustomTargetIndex],
18111811
depends_: T.Optional[T.List[T.Union[build.BuildTarget, build.CustomTarget, build.CustomTargetIndex]]] = None,
18121812
depend_files_: T.Optional[T.List[mesonlib.FileOrString]] = None,
1813-
interpreter: T.Optional[ExternalProgram] = None) -> build.LocalProgram:
1813+
interpreter: T.Optional[T.Union[ExternalProgram, T.List[ExternalProgram, str]]] = None) -> build.LocalProgram:
18141814
if isinstance(exe, build.CustomTarget):
18151815
if len(exe.outputs) != 1:
18161816
raise InvalidArguments('CustomTarget used as LocalProgram must have exactly one output.')
@@ -1824,11 +1824,17 @@ def _local_program_impl(self, exe: T.Union[mesonlib.FileOrString, build.Executab
18241824
if interpreter:
18251825
if not isinstance(exe, (build.CustomTarget, build.CustomTargetIndex)):
18261826
raise InvalidArguments('The "interpreter" argument can only be used when the first argument is a custom target.')
1827+
if isinstance(interpreter, list):
1828+
interpreter, args = interpreter[0], interpreter[1:]
1829+
if not isinstance(interpreter, ExternalProgram) or any(not isinstance(a, str) for a in args):
1830+
raise InvalidArguments('Interpreter must be an ExternalProgram followed by strings.')
1831+
else:
1832+
args = []
18271833
if not interpreter.found():
18281834
raise InvalidArguments(f'Specified interpreter program {interpreter.description()!r} not found.')
18291835
target = exe.target if isinstance(exe, build.CustomTargetIndex) else exe
18301836
depends.append(target)
1831-
cmd = interpreter.get_command() + [self.backend.get_target_filename(exe)]
1837+
cmd = interpreter.get_command() + args + [self.backend.get_target_filename(exe)]
18321838
prog = ExternalProgram(exe.name, command=cmd, silent=True)
18331839
return build.LocalProgram(prog, self.project_version, depends, depend_files)
18341840
return build.LocalProgram(exe, self.project_version, depends, depend_files)

test cases/common/285 local program/meson.build

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,6 @@ assert(prog5.found())
6363
if host_machine.system() != 'windows'
6464
test('test-prog5', prog5)
6565
endif
66+
67+
prog6 = local_program(prog_ct, interpreter: [python3, '-B'])
68+
test('test-prog6', prog6)

0 commit comments

Comments
 (0)