姬長信(Redy)

c – 在跨平台cmake项目中设置编译器标志的…


我想编写一个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这样的命令允许我用附加(CMAKE_CXX_FLAGS“Foo”)替换set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} Foo”)?
>我已多次阅读,首先不应手动设置CMAKE_CXX_FLAGS和类似变量,但我不确定使用哪种其他机制.
>最重要的是:我在这里的方式,我需要为每个编译器和配置单独的构建目录理想情况下,我想将其转换为同一目录中的多个目标,以便我可以例如调用make foo_debug_clang.

所以我的问题是

> a)有没有更好的方法来编写解决我的“痛点”的cmake脚本?
解决上述问题?
> b)是否有类似于如何建立此类项目的现代最佳实践?

我在互联网上找到的大多数参考资料要么过时,要么只显示一些简单的例子.我目前正在使用cmake3.8,但如果这有什么不同,我对更新版本的答案更感兴趣.