在CMake中,如何测试编译器是否为Clang?

时间:2012-04-06 16:12:52

标签: c++ c cmake clang

我们有一组cross-platform CMake build scripts,我们支持使用Visual C++GCC进行构建。

我们正在尝试Clang,但我无法弄清楚如何使用我们的CMake脚本测试编译器是否为Clang。

我应该测试一下编译器是否是Clang?我们目前正在使用MSVCCMAKE_COMPILER_IS_GNU<LANG>分别测试Visual C ++和GCC。

5 个答案:

答案 0 :(得分:194)

可靠的检查是使用CMAKE_<LANG>_COMPILER_ID变量。例如,检查C ++编译器:

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

如果使用ccache之类的编译器包装器,这些也可以正常工作。

从CMake 3.0.0开始,Apple提供的Clang的CMAKE_<LANG>_COMPILER_ID值现在为AppleClang。要测试Apple提供的Clang和常规Clang,请使用以下if条件:

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

另见AppleClang policy description

答案 1 :(得分:1)

OGRE 3D引擎源代码使用以下check

if (CMAKE_CXX_COMPILER MATCHES ".*clang")
    set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()

答案 2 :(得分:1)

为了避免任何拼写错误的问题,我正在使用它:

if (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]") #Case insensitive match
    set(IS_CLANG_BUILD true)
else ()
    set(IS_CLANG_BUILD false)
endif ()

为了使正则表达式不区分大小写,我尝试了所有here没有成功(似乎在CMake中不支持)。

答案 3 :(得分:0)

如果您的cmake_minimum_required VERSION小于3.1,则必须使用带引号的变量来确定编译器,如果与STREQUAL命令一起使用,即

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

或者,如果您不喜欢引用的内容,则可以使用MATCHES命令:

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

如果您指定cmake_minimum_required VERSION> = 3.1,则可以愉快地使用STREQUAL而不加引号:

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

cmake 3.1版本问题,记录在这里:https://cmake.org/cmake/help/latest/policy/CMP0054.html

答案 4 :(得分:-1)

这是针对cmake新手的更详细的答案,从sakra的答案修改而来,只需将以下几行附加到CMakeLists.txt

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

然后在CMakeLists.txt所在的文件夹中运行cmake .。然后您将看到一堆输出以及答案。

...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...