3

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

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

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

或者,作为 Meson 本身是一个 Python 程序,是否有可能以更直接的方式做同样的事情?

4

2 回答 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++ 编译目标的依赖项,因此可以保证先生成代码,然后再编译。

于 2019-02-19T04:44:36.420 回答
1

根据介子背后的关键设计考虑之一:

Meson 的设计方式使得实现语言永远不会在构建定义中公开。这使得用任何其他编程语言重新实现 Meson 成为可能(甚至可能很容易)。

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

于 2019-02-18T22:38:15.150 回答