处理具有多种构建类型的介子构建选项

时间:2018-11-22 05:36:06

标签: c++ build meson-build

已经阅读过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)检查是否受支持?

2 个答案:

答案 0 :(得分:1)

  

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

预期的最佳实践是根据需要使用loginUser(user: any) { return this.http.post(this.loginUrl, user) .subscribe((response: any) => { if(response) { localStorage.setItem('access_token', response.success.token); return true; } }); } 来设置/更改“ buildtype”选项。您不必“一劳永逸”。但是,当然,您仍然可以使用几个不同的构建树(例如,“调试”和“发布”)来加快该过程。

  

如何在Meson脚本中有条件地设置可移植样式的构建选项?

讨论meson configure时,您可以使用特殊值b_ndebug,该值恰好满足您的要求。另外,您还应考虑到['b_ndebug=if-release'] 中的几个GNU样式的命令行参数始终是可移植的,这是由于内部特定于编译器的替代。如果我没记错的话,它们包括:meson-D-I-L

但是,通常不建议在脚本中更改“ buildtype”选项(-l除外,这本应由default_options覆盖),meson setup/configure故意缺乏{ {1}}功能。

  

是否可以让内置的便携式样式生成选项(例如b_sanitize)检查是否受支持?

AFAIK,否,除了您上面使用的meson。但是,如果底层编译器不支持某些构建选项,例如set_option(),则它将自动设置为void,因此使用它不会破坏任何内容。

答案 1 :(得分:-1)

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

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

project('myproj', ['cpp'], default_options : myopts)