我们拥有一套跨平台的CMake构建脚本 ,我们支持与建设的Visual C ++和GCC 。
我们正在尝试铛 ,但我无法弄清楚如何测试编译器是否被铛与我们的CMake的脚本。
我应该测试一下,看看如果编译器是锵与否? 我们目前正在使用MSVC
和CMAKE_COMPILER_IS_GNU<LANG>
分别以测试Visual C ++和GCC。
我们拥有一套跨平台的CMake构建脚本 ,我们支持与建设的Visual C ++和GCC 。
我们正在尝试铛 ,但我无法弄清楚如何测试编译器是否被铛与我们的CMake的脚本。
我应该测试一下,看看如果编译器是锵与否? 我们目前正在使用MSVC
和CMAKE_COMPILER_IS_GNU<LANG>
分别以测试Visual C ++和GCC。
一个可靠的检查是使用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
为苹果提供锵值现在为AppleClang
。 为了测试Apple提供锵和定期锵都使用if条件如下:
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# using regular Clang or AppleClang
endif()
另请参阅AppleClang政策说明 。
食人魔3D引擎源代码使用以下检查 :
if (CMAKE_CXX_COMPILER MATCHES ".*clang")
set(CMAKE_COMPILER_IS_CLANGXX 1)
endif ()
只是为了避免拼写错误的问题,我用这:
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 ()
为了使正则表达式不区分大小写的,我什么都试过这里没有成功(似乎并没有在CMake的被支持)。
这是CMake的新手稍微更详细的答案,从沙克拉的回答修改,只是下面的行追加到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()
然后运行cmake .
在的CMakeLists.txt所在的文件夹。 然后你会看到一堆输出与你的答案一起。
...
-- Detecting CXX compile features
-- Detecting CXX compile features - done
GNU
-- Configuring done
-- Generating done
...