我们有一套跨平台的 CMake 构建脚本,我们支持使用Visual C++和GCC构建。
我们正在尝试Clang,但我不知道如何使用我们的 CMake 脚本测试编译器是否是 Clang。
我应该测试什么来查看编译器是否是 Clang?我们目前正在分别使用MSVC和CMAKE_COMPILER_IS_GNU<LANG>测试 Visual C++ 和 GCC。
MSVC
CMAKE_COMPILER_IS_GNU<LANG>
一个可靠的检查是使用CMAKE_<LANG>_COMPILER_ID变量。例如,检查 C++ 编译器:
CMAKE_<LANG>_COMPILER_ID
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 条件:
AppleClang
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:
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()