我们有一套cross-platform CMake build scripts,我们支持用Visual C++和GCC构建。
我们正在试用Clang,但是我不知道如何测试编译器是否与我们的CMake脚本一致。
我应该测试什么来查看编译器是否是Clang?我们目前正在使用MSVC
和CMAKE_COMPILER_IS_GNU
分别为Visual C++和GCC进行测试。
发布于 2012-04-07 23:07:58
一种可靠的检查是使用CMAKE__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
的值现在是AppleClang
。要同时测试Apple提供的Clang和常规Clang,请使用以下if条件:
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# using regular Clang or AppleClang
endif()
另请参阅AppleClang policy description。
CMake 3.15增加了对clang-cl和常规clang前端的支持。您可以通过检查变量CMAKE_CXX_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()
发布于 2018-09-02 18:05:17
这是一个针对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()
发布于 2020-08-21 11:17:15
如果您的cmake_minimum_required版本低于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
https://stackoverflow.com/questions/10046114
复制相似问题