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

How to launch an external Python program from Meson?

在构建我的项目之前,我必须使用 Meson 构建系统通过 Python 脚本生成一个 C++ 源文件。

这是正确的方法吗,即将 Python 视为通用外部命令?

# meson.build
r = run_command('python', 'arg1', 'arg2', 'arg3')
if r.returncode() != 0
  error('Error message')
endif

或者,介子本身就是一个Python程序,有没有可能以更直接的方式做同样的事情?

根据介子后面的key design considerations之一:

Meson has been designed in such a way that the implementation language is never exposed in the build definitions. This makes it possible (and maybe even easy) to reimplement Meson in any other programming language.

因此,即使在 Python 中实现了介子,用户可能会忘记这一点并专注于所提供的功能,正如您所发现的那样,可以使用 run_command[ 进行扩展=17=]函数。

为了使您的构建定义更加健壮,您可以尝试首先使用 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() or custom_target()。这样,您可以将代码生成目标用作实际c++编译目标的依赖项,因此可以保证先生成代码,然后再编译。