我有许多使用 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-*程序而不是系统默认值?有什么不同?
llvm-*
CMake 尊重环境变量CC,并CXX在检测到要使用的 C 和 C++ 编译器时:
CC
CXX
$ export CC=/usr/bin/clang $ export CXX=/usr/bin/clang++ $ cmake .. -- The C compiler identification is Clang -- The CXX compiler identification is Clang
编译器特定的标志可以通过将它们放入一个make覆盖文件并将CMAKE_USER_MAKE_RULES_OVERRIDE变量指向它来覆盖。创建一个~/ClangOverrides.txt包含以下内容的文件:
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 "-O3 -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 "-O3 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "-O2 -g")
后缀_INIT将使 CMake*_FLAGS用给定的值初始化相应的变量。cmake然后通过以下方式调用:
_INIT
*_FLAGS
cmake
$ cmake -DCMAKE_USER_MAKE_RULES_OVERRIDE=~/ClangOverrides.txt ..
最后要强制使用 LLVM binutils,设置内部变量_CMAKE_TOOLCHAIN_PREFIX. 这个变量被CMakeFindBinUtils模块认可:
_CMAKE_TOOLCHAIN_PREFIX
CMakeFindBinUtils
$ cmake -D_CMAKE_TOOLCHAIN_PREFIX=llvm- ..
将所有这些放在一起,您可以编写一个 shell 包装器,它设置环境变量CC,CXX然后cmake使用提到的变量覆盖进行调用。
另请参阅有关 make 覆盖文件的CMake 常见问题解答。