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

新手上路,请多包涵
阅读 971
2 个回答

一个可靠的检查是使用 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 策略说明

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

原文由 sakra 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以测试 Clang,它的前端是这样的:

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

原文由 Jens A. Koch 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题