【发布时间】:2018-02-07 20:44:55
【问题描述】:
我想编写一个 cmake 文件,在调试和发布版本中为 clang++、g++ 和 MSVC 设置不同的编译器选项。 我目前正在做的事情看起来像这样:
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest /W4")
# Default debug flags are OK
set(CMAKE_CXX_FLAGS_RELEASE "{CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z -Wall -Wextra -Werror")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} some other flags")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
else()
# nothing special for gcc at the moment
endif()
endif()
但是我有几个问题:
- 首先是琐碎的:有没有像appen 这样的命令可以让我用
append(CMAKE_CXX_FLAGS "Foo")替换set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} Foo")? - 我读过很多遍,一开始不应该手动设置
CMAKE_CXX_FLAGS和类似的变量,但我不确定要使用什么其他机制。 - 最重要的是:按照我在这里的方式,我需要为每个编译器和配置创建一个单独的构建目录 理想情况下,我想将其转换为在同一个目录中拥有多个目标,这样我就可以例如致电
make foo_debug_clang。
所以我的问题是
- a) 是否有更好的方法来编写解决我的“痛点”的 cmake 脚本? 解决上述几点?
- b) 对于如何建立此类项目,是否存在类似公认的现代最佳实践?
我可以在互联网上找到的大多数参考资料要么已过时,要么仅显示琐碎的示例。我目前使用 cmake3.8,但如果这有什么不同,我对更新版本的答案更感兴趣。
【问题讨论】:
-
@AI.G.谢谢你。是否还有单独的调试集并将其发布给我必须通过另一个级别的 if_else 来解决这个问题?我对生成器表达式进行了一些实验,但我觉得这变得更不可读了。
-
在我看来,您可以使用肮脏的生成器表达式或
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} --flags")的相当冗长的语法。在这种情况下(考虑到这两种情况都不令人满意),您可以尝试编写一些辅助函数,将脏代码包装成更令人赏心悦目的东西。 -
I've read multiple times, that one should not manually set CMAKE_CXX_FLAGS- 第一次听说这个。虽然在项目中设置此变量的 cached 版本可能会给用户带来不便(但在某些情况下很有用),但将标志附加到非缓存变量并没有错。I need a separate build directory for each compiler- 这在 CMake 和它使用的许多构建工具(例如 MSVC)中都是不可避免的。对于多个配置的单个构建目录,multiconfig 构建工具(如 MSVC)能够以这种方式工作。 -
整个问题对我来说似乎“过于宽泛”,因为点 1,2 与 3 的相关性较弱。可能是,专门询问 3,并添加 1,2 作为旁注(所以 1,2不需要在答案中描述)?