使用CMake在GCC和Clang / LLVM之间切换

我有一些使用CMake构建的项目,我希望能够轻松地使用GCC或Clang / LLVM来编译它们。 我相信(如果我错了,请纠正我)要使用Clang,我需要设置以下内容:

    SET (CMAKE_C_COMPILER             "/usr/bin/clang")
    SET (CMAKE_C_FLAGS                "-Wall -std=c99")
    SET (CMAKE_C_FLAGS_DEBUG          "-g")
    SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_CXX_COMPILER             "/usr/bin/clang++")
    SET (CMAKE_CXX_FLAGS                "-Wall")
    SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
    SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_AR      "/usr/bin/llvm-ar")
    SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
    SET (CMAKE_NM      "/usr/bin/llvm-nm")
    SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
    SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

有没有简单的方法在这些和默认的GCC变量之间进行切换,最好是作为系统范围的变化而不是项目特定的变量(即不是将它们添加到项目的CMakeLists.txt中)?

另外,使用clang而不是gcc编译时,是否需要使用llvm-*程序而不是系统默认值? 有什么不同?


CMake在检测到C和C ++编译器使用时CXX环境变量CCCXX

$ export CC=/usr/bin/clang
$ export CXX=/usr/bin/clang++
$ cmake ..
-- The C compiler identification is Clang
-- The CXX compiler identification is Clang

编译器特定的标志可以通过将其放入系统范围的CMake文件并将CMAKE_USER_MAKE_RULES_OVERRIDE变量指向它来覆盖。 使用以下内容创建文件~/ClangOverrides.txt

SET (CMAKE_C_FLAGS_INIT                "-Wall -std=c99")
SET (CMAKE_C_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_C_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_C_FLAGS_RELEASE_INIT        "-O4 -DNDEBUG")
SET (CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

SET (CMAKE_CXX_FLAGS_INIT                "-Wall")
SET (CMAKE_CXX_FLAGS_DEBUG_INIT          "-g")
SET (CMAKE_CXX_FLAGS_MINSIZEREL_INIT     "-Os -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELEASE_INIT        "-O4 -DNDEBUG")
SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")

后缀_INIT将使CMake用给定的值初始化相应的*_FLAGS变量。 然后以下面的方式调用cmake:

$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt ..

最后强制使用LLVM binutils,设置内部变量_CMAKE_TOOLCHAIN_PREFIXCMakeFindBinUtils模块支持这个变量:

$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..

综合起来,你可以编写一个shell包装器来设置环境变量CCCXX ,然后用提到的变量覆盖调用cmake。


Ubuntu上的系统范围C ++更改:

sudo apt-get install clang
sudo update-alternatives --config c++

将打印这样的东西:

  Selection    Path              Priority   Status
------------------------------------------------------------
* 0            /usr/bin/g++       20        auto mode
  1            /usr/bin/clang++   10        manual mode
  2            /usr/bin/g++       20        manual mode

然后,只需选择铿锵声++。


您可以使用选项命令:

option(USE_CLANG "build application with clang" OFF) # OFF is the default

然后在if()s中包装clang编译器设置:

if(USE_CLANG)
    SET (...)
    ....
endif(USE_CLANG)

这样它就会在gui配置工具中显示为cmake选项。

为了使系统在整个系统范围内,您当然可以使用环境变量作为默认值,或者留在Ferruccio的答案中。

链接地址: http://www.djcxy.com/p/24453.html

上一篇: Switching between GCC and Clang/LLVM using CMake

下一篇: Compile other external libraries (without CMakeLists.txt) with CMake