小编典典

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

all

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

我们正在尝试Clang,但我不知道如何使用我们的 CMake 脚本测试编译器是否是 Clang。

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


阅读 116

收藏
2022-07-18

共1个答案

小编典典

一个可靠的检查是使用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 开始CMAKE_<LANG>_COMPILER_ID,Apple 提供的 Clang 的值现在是AppleClang.
要测试 Apple 提供的 Clang 和常规 Clang,请使用以下 if 条件:

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

另请参阅AppleClang
策略说明

CMake 3.15增加了对clang-
cl
和常规 clang
前端的支持。您可以通过检查变量来确定前端变体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()
2022-07-18