Search code examples
c++ccmakeclang

In CMake, how can I test if the compiler is Clang?


We have a set of cross-platform CMake build scripts, and we support building with Visual C++ and GCC.

We're trying out Clang, but I can't figure out how to test whether or not the compiler is Clang with our CMake script.

What should I test to see if the compiler is Clang or not? We're currently using MSVC and CMAKE_COMPILER_IS_GNU<LANG> to test for Visual C++ and GCC, respectively.


Solution

  • A reliable check is to use the CMAKE_<LANG>_COMPILER_ID variables. E.g., to check the C++ compiler:

    if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
      # using Clang
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      # using GCC
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
      # using Intel C++
    elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
      # using Visual Studio C++
    endif()
    

    These also work correctly if a compiler wrapper like ccache is used.

    As of CMake 3.0.0 the CMAKE_<LANG>_COMPILER_ID value for Apple-provided Clang is now AppleClang. To test for both the Apple-provided Clang and the regular Clang use the following if condition:

    if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
      # using regular Clang or AppleClang
    endif()
    

    Also see the AppleClang policy description.

    CMake 3.15 has added support for both the clang-cl and the regular clang front end. You can determine the front end variant by inspecting the variable CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT:

    if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
      if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
        # using clang with clang-cl front end
      elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
        # using clang with regular front end
      endif()
    endif()
    

    Newer versions of CMake support many different clang flavors.