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).