I have a number of projects built using CMake and I’d like to be able to easily switch between using GCC or Clang/LLVM to compile them. I believe (please correct me if I’m mistaken!) that to use Clang I need to set the following:
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")
Is there an easy way of switching between these and the default GCC variables, preferably as a system-wide change rather than project specific (i.e. not just adding them into a project’s CMakeLists.txt)?
Also, is it necessary to use the llvm-* programs rather than the system defaults when compiling using clang instead of gcc? What’s the difference?
CMake honors the environment variables
CCandCXXupon detecting the C and C++ compiler to use:The compiler specific flags can be overridden by putting them into a make override file and pointing the
CMAKE_USER_MAKE_RULES_OVERRIDEvariable to it. Create a file~/ClangOverrides.txtwith the following contents:The suffix
*_INITwill make CMake initialize the corresponding*_FLAGSvariable with the given value. Then invokecmakein the following way:Finally to force the use of the LLVM binutils, set the internal variable
_CMAKE_TOOLCHAIN_PREFIX. This variable is honored by theCMakeFindBinUtilsmodule:Setting
_CMAKE_TOOLCHAIN_LOCATIONis no longer necessary for CMake version 3.9 or newer.Putting this all together you can write a shell wrapper which sets up the environment variables
CCandCXXand then invokescmakewith the mentioned variable overrides.Also see this CMake FAQ on make override files.