7

阅读了 Meson 网站页面(通常质量很高)后,我仍然不确定处理不同构建类型的不同选项的预期最佳实践。

所以要指定一个调试版本:

meson [srcdir] --buildtype=debug

或者指定发布版本:

meson [srcdir] --buildtype=release

但是,如果我只想b_sanitize=address为调试版本和发布版本添加(或其他任意复杂的参数集)b_ndebug=true,我会这样做:

meson [srcdir] --buildtype=debug -Db_sanitize=address ...
meson [srcdir] --buildtype=release -Db_ndebug=true ...

但是,在命令行上添加一堆自定义参数更麻烦,对我来说,将其放在 meson.build 文件中似乎更整洁。所以我知道我可以设置一些内置选项:

project('myproject', ['cpp'],
        default_options : ['cpp_std=c++14',
                           'b_ndebug=true'])

但它们是无条件设置的。

所以条件看起来像这样:

if get_option('buildtype').startswith('release')
    add_project_arguments('-DNDEBUG', language : ['cpp'])
endif

这是一种方法,但是,由于它是可移植的,因此似乎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

是否可以让内置的便携式构建选项(例如b_sanitize)检查它们是否受支持?

4

2 回答 2

1

我仍然不确定为不同构建类型处理不同选项的预期最佳实践

预期的最佳实践是根据需要使用meson configure设置/更改“构建类型”选项。你不必“一次又一次地”做这件事。但是,当然,您仍然可以拥有几个不同的构建树(例如,“调试”和“发布”)来加快进程。

如何在 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,因此使用它不应该破坏任何东西。

于 2019-02-09T06:17:21.547 回答
-3

项目不必是第一行,因此您可以检查构建类型并为您的项目生成构建选项列表。类似(未经测试):

if get_option('buildtype').startswith('release')
    myopts = [ 'b_ndebug=true' ]
endif

project('myproj', ['cpp'], default_options : myopts)
于 2019-01-11T13:01:34.707 回答