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

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


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 Clangelseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")  # using GCCelseif (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 AppleClangendif()

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_CXX_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()


If your cmake_minimum_required VERSION is less than 3.1, then you have to use quoted variable to determine compiler, if together with STREQUAL command, i.e.

if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")  MESSAGE("MSVC")endif()

Or, if you don't like quoted stuff, you can use MATCHES command:

if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC")  MESSAGE("MSVC")endif()

And if you specify cmake_minimum_required VERSION >= 3.1, then you can happily use STREQUAL without quotes:

if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")  MESSAGE("MSVC")endif()

the cmake 3.1 version issue, is documented here: https://cmake.org/cmake/help/latest/policy/CMP0054.html


Just to avoid any misspelling problem, I am using Case-insensitive compare, like:

string( TOLOWER "${CMAKE_CXX_COMPILER_ID}" COMPILER_ID )if (COMPILER_ID STREQUAL "clang")    set(IS_CLANG_BUILD true)else ()    set(IS_CLANG_BUILD false)endif ()

For making the regex of MATCHES case-insensitive, I tried everything here without success (doesn't seem to be supported in CMake).