Jet*_*ype 7 c++ build meson-build
阅读了 Meson 站点页面(通常是高质量的)后,我仍然不确定处理不同构建类型的不同选项的预期最佳实践。
因此,要指定调试版本:
meson [srcdir] --buildtype=debug
Run Code Online (Sandbox Code Playgroud)
或者指定发布版本:
meson [srcdir] --buildtype=release
Run Code Online (Sandbox Code Playgroud)
但是,如果我只想b_sanitize=address为调试版本和b_ndebug=true发布版本添加(或其他任意复杂的参数集),我会这样做:
meson [srcdir] --buildtype=debug -Db_sanitize=address ...
meson [srcdir] --buildtype=release -Db_ndebug=true ...
Run Code Online (Sandbox Code Playgroud)
然而,在命令行上添加一堆自定义参数更麻烦,对我来说,把它放在 meson.build 文件中似乎更简洁。所以我知道我可以这样设置一些内置选项:
project('myproject', ['cpp'],
default_options : ['cpp_std=c++14',
'b_ndebug=true'])
Run Code Online (Sandbox Code Playgroud)
但它们是无条件设置的。
所以一个条件看起来像这样:
if get_option('buildtype').startswith('release')
add_project_arguments('-DNDEBUG', language : ['cpp'])
endif
Run Code Online (Sandbox Code Playgroud)
这是一种方法,但是,似乎b_ndebug=true更喜欢这种方法add_project_arguments('-DNDEBUG'),因为它是可移植的。
如何在 Meson 脚本中有条件地设置可移植样式的构建选项?
另外,b_sanitize=address设置没有任何测试编译器是否支持它。我希望它首先检查它是否受支持(例如,因为库可能丢失):
if meson.get_compiler('cpp').has_link_argument('-fsanitize=address')
add_project_arguments('-fsanitize=address', language : ['cpp'])
add_project_link_arguments('-fsanitize=address', language : ['cpp'])
endif
Run Code Online (Sandbox Code Playgroud)
是否可以检查内置的便携式构建选项(例如b_sanitize)是否受支持?
我仍然不确定处理不同构建类型的不同选项的最佳实践
预期的最佳实践是根据meson configure需要设置/更改“buildtype”选项。你不必“一次性地、永远地”做这件事。但是,当然,您仍然可以拥有几个不同的构建树(例如“调试”和“发布”)来加速该过程。
如何在 Meson 脚本中有条件地设置可移植式构建选项?
说到b_ndebug,您可以使用特殊值:['b_ndebug=if-release'],它正是您想要的。另外,您应该考虑到,由于内部编译器特定的替换,中的几个 GNU 样式命令行参数meson 始终是可移植的。如果我没记错的话,这些包括:-D、-I和。-L-l
然而,一般来说,不鼓励更改脚本内的“buildtype”选项(除了default_options,它应该被 覆盖meson setup/configure),并且meson故意缺乏set_option()功能。
是否可以让内置的便携式构建选项(例如 b_sanitize)检查它们是否受支持?
AFAIK,不,除非has_argument()你在上面使用过。但是,如果b_sanitize底层编译器不支持某些构建选项,例如 ,那么它将自动设置为 void,因此使用它不会破坏任何内容。