ExternalProgram: add cmd_array to complete the offfering

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
pull/13845/head
Stéphane Cerveau 4 months ago
parent b3f9b9dc06
commit f26bb39087
  1. 5
      docs/yaml/objects/external_program.yaml
  2. 13
      mesonbuild/interpreter/interpreterobjects.py
  3. 13
      test cases/common/26 find program/meson.build

@ -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

@ -618,7 +618,8 @@ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
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
@ -645,6 +646,16 @@ class _ExternalProgramHolder(ObjectHolder[_EXTPROG]):
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')

@ -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
Loading…
Cancel
Save