【问题标题】:Handling Meson build options with multiple buildtypes处理具有多种构建类型的介子构建选项
【发布时间】:2019-02-09 18:38:55
【问题描述】:

阅读了 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)是否受支持?

【问题讨论】:

  • 原来meson -Dcpp_args=-ffoo 甚至不适用于交叉编译器的情况,但是可以在交叉编译器文件中指定 cpp_args,这增加了问题的复杂性。
  • 是否可以为可执行文件指定构建类型(调试/发布)或必须为项目指定? (如果可以只为可执行文件指定是否也适用于依赖库的选项?)
  • @Nic30g 最好有整个项目的构建类型......但如果你有一个可执行文件的解决方案,我也想听听。跨度>

标签: c++ build meson-build


【解决方案1】:

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

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

如何在 Meson 脚本中有条件地设置便携式构建选项?

谈到b_ndebug,您可以使用特殊值:['b_ndebug=if-release'],这正是您想要的。此外,您应该考虑到,由于内部编译器特定的替换,meson 中的几个 GNU 样式命令行参数始终是可移植的。如果我没记错的话,这些包括:-D-I-L-l

但是,一般来说,不鼓励在脚本中更改“buildtype”选项(default_options 除外,它会被meson setup/configure 覆盖),并且meson 故意缺少set_option() 功能。

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

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

【讨论】:

  • 1.这很不幸.. 用例是设置一个 IDE 将构建类型设置为“调试”并构建,无论 build-debug 目录是否已经存在,以及将构建类型设置为“发布”并构建。所以meson configure 没有提供我在问题中建议的命令行介子方式。您必须将所有特定于构建类型的选项放入命令行,而不是放入文件中。对我来说,文件作为项目模板比命令行更容易。
  • 2.谢谢,['b_ndebug=if-release'] 很好,但不幸的是没有一概而论。我希望 b_lto 仅对版本启用,但没有 if-release 选项。因此b_ndebug 可以进入文件,但b_lto 必须保留在命令行中。
  • 不确定您所说的“始终便携”是什么意思,因为meson -Dfoo 不会调用gcc -Dfoo
  • 对于它的价值,问题中所写的if cc.has_link_argument('-fsanitize=address') 确实有效,介子输出:Compiler for C supports link arguments -fsanitize=address: NO
  • 哦,我明白你现在所说的“始终可移植”是什么意思:在介子脚本中,add_project_arguments('-DNDEBUG', language: 'cpp') 导致 MSVC 等的 cl /DNDEBUG
【解决方案2】:

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

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

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

【讨论】:

  • "错误:第一个语句必须是对项目的调用" :(
猜你喜欢
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2021-01-12
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多