Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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.
–
–
–
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()
–
–
–
–
–
This is a slightly more detailed answer for cmake newbies, modified from sakra's answer. The minimum version of 3.1 seems to be important as it changes the way CMake processes the quoted "MSVC" string (according to policy CMP0054).
cmake_minimum_required(VERSION 3.1)
project(MyProject CXX)
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
MESSAGE("Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
MESSAGE("GNU")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
MESSAGE("Intel")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
MESSAGE("MSVC")
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).
–
You can test for Clang and it's frontends like this:
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC") # clang-cl
# ...
elseif (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU") # clang native
# ...
endif()
elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") # both
# ...
endif()
CMAKE_CXX_COMPILER_FRONTEND_VARIANT requires CMake v3.14+.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.