如何从Meson启动外部Python程序?

3
在构建项目之前,我需要通过一个Python脚本使用Meson构建系统生成一个C++源文件。这是正确的方式吗?也就是说,将Python视为通用的外部命令?
# meson.build
r = run_command('python', 'arg1', 'arg2', 'arg3')
if r.returncode() != 0
  error('Error message')
endif

或者说,既然Meson本身就是一个Python程序,那么有没有更直接的方法来做同样的事情呢?

2个回答

2
为了使您的构建定义更加健壮,您可以首先使用find_program()查找Python可执行文件。如果无法找到Python,这将以详细的原因停止构建(您可以通过传递required: false作为参数来更改此行为)。
然后,为了确保如果您的参数是文件或目录时没有路径问题,请确保将它们用files()包装起来。
总之:
python_exe = find_program('python3', 'python')
params = files('file1', 'dir/file2')

r = run_command(python_exe, params, 'arg1', 'arg2')
if r.returncode() != 0
    error('Error message')
endif

您也可以考虑通过python来定义您的代码生成,使用实际的构建目标,例如generator()custom_target()。这样,您可以将代码生成目标用作实际c++编译目标的依赖项,因此,保证了先生成代码,然后才编译的顺序。

1
这是一种更便携的方法:https://mesonbuild.com/Python-3-module.html#find_python - TingPing
真的,尽管它似乎已经被弃用了。他们建议使用Python模块中的find_installation()。而且它很好用,因为它有一些方便的功能! - barsoosayque
@barsoosayque:难道不应该是:r = run_command(python_exe, params, 'arg1', 'arg2') - Pietro

1
根据Meson背后的key design considerations之一:

Meson的设计使得实现语言从未暴露在构建定义中。这使得在任何其他编程语言中重新实现Meson成为可能(甚至可能很容易)。

因此,即使Meson是用Python实现的,用户也可以忘记这一点,专注于提供的功能,正如您发现的那样,可以使用run_command函数进行扩展。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接