我们有一组cross-platform CMake build scripts,我们支持使用Visual C++和GCC进行构建。
我们正在尝试Clang,但我无法弄清楚如何使用我们的CMake脚本测试编译器是否为Clang。
我应该测试一下编译器是否是Clang?我们目前正在使用MSVC
和CMAKE_COMPILER_IS_GNU<LANG>
分别测试Visual C ++和GCC。
答案 0 :(得分:194)
可靠的检查是使用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()
答案 1 :(得分:1)
OGRE 3D引擎源代码使用以下check:
if (CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()
答案 2 :(得分:1)
为了避免任何拼写错误的问题,我正在使用它:
if (CMAKE_CXX_COMPILER_ID MATCHES "[cC][lL][aA][nN][gG]") #Case insensitive match
set(IS_CLANG_BUILD true)
else ()
set(IS_CLANG_BUILD false)
endif ()
为了使正则表达式不区分大小写,我尝试了所有here没有成功(似乎在CMake中不支持)。
答案 3 :(得分:0)
如果您的cmake_minimum_required VERSION小于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
答案 4 :(得分:-1)
这是针对cmake新手的更详细的答案,从sakra的答案修改而来,只需将以下几行附加到CMakeLists.txt
:
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()
然后在CMakeLists.txt所在的文件夹中运行cmake .
。然后您将看到一堆输出以及答案。
...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...