在构建我的项目之前,我必须使用 Meson 构建系统通过 Python 脚本生成 C++ 源文件。
这是正确的方法吗,即将 Python 视为通用的外部命令?
# meson.build
r = run_command('python', 'arg1', 'arg2', 'arg3')
if r.returncode() != 0
error('Error message')
endif
或者,作为 Meson 本身是一个 Python 程序,是否有可能以更直接的方式做同样的事情?
在构建我的项目之前,我必须使用 Meson 构建系统通过 Python 脚本生成 C++ 源文件。
这是正确的方法吗,即将 Python 视为通用的外部命令?
# meson.build
r = run_command('python', 'arg1', 'arg2', 'arg3')
if r.returncode() != 0
error('Error message')
endif
或者,作为 Meson 本身是一个 Python 程序,是否有可能以更直接的方式做同样的事情?
为了使您的构建定义更加健壮,您可以尝试首先使用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++ 编译目标的依赖项,因此可以保证先生成代码,然后再编译。
根据介子背后的关键设计考虑之一:
Meson 的设计方式使得实现语言永远不会在构建定义中公开。这使得用任何其他编程语言重新实现 Meson 成为可能(甚至可能很容易)。
因此,即使介子是在 Python 中实现的,用户可能会忘记这一点并专注于提供的功能,正如您所发现的,这些功能可以使用run_command函数进行扩展。