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

lee*_*777 133 c c++ cmake clang

我们有一套跨平台的CMake构建脚本,我们支持使用Visual C++GCC构建.

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

我应该测试什么来查看编译器是否是Clang?我们目前正在分别使用MSVCCMAKE_COMPILER_IS_GNU<LANG>测试Visual C++和GCC.

sak*_*kra 212

可靠的检查是使用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()
Run Code Online (Sandbox Code Playgroud)

如果使用像ccache这样的编译器包装器,它们也可以正常工作.

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

if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  # using regular Clang or AppleClang
endif()
Run Code Online (Sandbox Code Playgroud)

另请参阅AppleClang政策说明.

  • 从CMake 2.8.10开始,这个变量(最终!)记录在案.请参阅:http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID (17认同)
  • 请注意,`CMAKE_CXX_COMPILER_ID`变量仅在命令`project(Foo CXX)`之后可用. (8认同)
  • 如果你感到困惑,为什么你不能专门检测到'AppleClang`,@ sakra表示[`cmake 3.0.0`发布了`AppleClang`](https://cmake.org/Wiki/CMake/ChangeLog).但是,仅仅因为`cmake --version`报告等于或更高是不够的 - 你必须使用`cmake_minimum_required(VERSION 3.0.0)`才能使用`3.0.0`标准! (4认同)
  • 对于gcc和clang都接受的标志,我使用`if(CMAKE_CXX_COMPILER_ID MATCHES“ Clang | GNU”)... endif()`。 (3认同)

Sea*_*ene 9

这是针对 cmake 新手的一个稍微更详细的答案,是根据 sakra 的答案修改的。3.1 的最低版本似乎很重要,因为它改变了 CMake 处理引用的“MSVC”字符串的方式(根据策略 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()
Run Code Online (Sandbox Code Playgroud)