在现代 CMake 中设置全局选项?

Posted

技术标签:

【中文标题】在现代 CMake 中设置全局选项?【英文标题】:Setting global options in modern CMake? 【发布时间】:2019-07-30 12:15:39 【问题描述】:

我正在使用 cmake 构建我的库,其中包括 google-test 的子目录(子模块)。作为 CI 管道的一部分,我正在运行 msan(clang 内存清理程序),这需要我使用一些特殊选项 (-fsanitize=memory -stdlib=libc++ -L/path/to/libc++/lib -I/path/to/libc++/include ...) 构建整个项目(包括 google 测试)。

现在,我只是使用 CMAKE_CXX_FLAGS 和全局 include_directories 来设置所有 lib/include 路径。但是,这违反了“现代 cmake”准则。这是对全局变量的适当使用,还是有另一种方法可以使用目标使其正常工作?我可以为我的库执行此操作,但它不会传播到 google-test 并且我收到链接错误。

【问题讨论】:

add_compile_options 将选项添加到当前项目和所有子目录。 google-test 是如何添加到你的项目中的?我想有一个“根”CMakeLists.txt 可以执行 add_subdirectory(google-test) 和 add_subdirectory(your_project),它看起来不是这样吗? 是的,没错。但是,这就像使用我的全局变量,绕过目标等等。大多数人建议远离这些全局设置器(对于 include_directories 也是如此)。这是规则的例外,还是我错过了什么? 我认为这只是适当使用全局变量的情况。与CMAKE_BUILD_TYPE=Debug 为所有(!)文件设置-g -Og 相同,您也这样做。我什至可以看到CMAKE_BUILD_TYPE=msanitize 【参考方案1】:

您正在寻找的选项的现代 cmake 用法是 add_compile_options() 以及 target_include_directories,您可以在其中为指定的目标项目指定公共和私有包含。

希望这会有所帮助。

【讨论】:

我可以将编译选项和包含目录添加到我的库中,但我还需要对 google-test 执行此操作,这是我的问题。我不想修改 google-test 的 CMakeLists.txt 文件,并且从我的库的 CMakeLists 中设置 google 的选项对我来说看起来也好不了多少。 你的意思是说你也想用一些特定的编译器选项来编译 gtest? 是的,完全正确。整个代码库必须使用 libc++ 和 msan 编译才能工作 (github.com/google/sanitizers/wiki/MemorySanitizerLibcxxHowTo) 我猜你必须用他们不那么现代的 cmake 脚本构建 gtest,然后用现代 cmake 构建你的代码。你不需要每次构建你的代码库时都构建 gtest。我会推荐本文中的子模块方法:cliutils.gitlab.io/modern-cmake/chapters/testing/… 我认为 OP 指的是this guideline,它说:Avoid the *add_compile_options()* command.

以上是关于在现代 CMake 中设置全局选项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中设置 highchart 全局选项

vue.js基础__ mixins 选项

VS2013中设置全局属性

为啥无法在 IdentityServer 中设置选项?

当我只有两个选项时,如何在选择选项中设置默认值?

Android - 如何在代码中设置首选项