Skip to content

Commit

Permalink
ExternalProgram: add cmd_array to complete the offfering
Browse files Browse the repository at this point in the history
In case of python and especially in the case of pyInstaller
where the python command is meson.exe runpython, it should
not be full path to be used but cmd_array.

Fixing #13834
  • Loading branch information
dabrain34 committed Nov 13, 2024
1 parent b3f9b9d commit f26bb39
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 1 deletion.
5 changes: 5 additions & 0 deletions docs/yaml/objects/external_program.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,8 @@ methods:
```meson
run_command(find_program('foo'), 'arg1', 'arg2')
```
- name: cmd_array
returns: list[str]
description: Returns an array containing the command(s) for the program.
since: 1.7.0
13 changes: 12 additions & 1 deletion mesonbuild/interpreter/interpreterobjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,8 @@ def __init__(self, ep: _EXTPROG, interpreter: 'Interpreter') -> None:
self.methods.update({'found': self.found_method,
'path': self.path_method,
'version': self.version_method,
'full_path': self.full_path_method})
'full_path': self.full_path_method,
'cmd_array': self.cmd_array_method})

@noPosargs
@noKwargs
Expand All @@ -645,6 +646,16 @@ def _full_path(self) -> str:
assert path is not None
return path

@noPosargs
@noKwargs
@FeatureNew('ExternalProgram.cmd_array', '1.7.0')
def cmd_array_method(self, args: T.List[TYPE_var], kwargs: TYPE_kwargs) -> T.List[str]:
if not self.found():
raise InterpreterException('Unable to get the path of a not-found external program')
cmd = self.held_object.get_command()
assert cmd is not None
return cmd

@noPosargs
@noKwargs
@FeatureNew('ExternalProgram.version', '0.62.0')
Expand Down
13 changes: 13 additions & 0 deletions test cases/common/26 find program/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,16 @@ assert(not prog.found(), 'Program should not be found')

prog = find_program('test_subdir.py', dirs : ['/nonexistent', meson.current_source_dir() / 'scripts'])
assert(prog.found(), 'Program should be found')

prog = find_program('print-version.py')
if build_machine.system() != 'cygwin'
assert(prog.cmd_array() != [prog.full_path()])
endif

if build_machine.system() == 'windows'
prog = find_program('cmd.exe')
assert(prog.cmd_array() == [prog.full_path()])
else
prog = find_program('ld')
assert(prog.cmd_array() == [prog.full_path()])
endif

0 comments on commit f26bb39

Please sign in to comment.