2012-04-06 119 views
95

我们有一套​​,我们支持与MSVCGCC建设。在cmake中,如何测试编译器是否是Clang?

我们正在尝试Clang,但我无法弄清楚如何测试编译器是否被铛与我们的CMake的脚本。

我应该测试,看看如果编译器是锵与否?我们目前分别使用MSVCCMAKE_COMPILER_IS_GNU<LANG>来测试MSVC和GCC。

+0

您可以通过CMAKE_C_COMPILER和CMAKE_CXX_COMPILER设置路径铛铛或设置++编译器。铿锵+1。 – Zaffy 2012-04-06 19:15:25

+0

你为什么要在意? Clang在接受编译器选项方面非常喜欢GCC ... – 2015-01-04 18:27:48

+0

@BasileStarynkevitch由于我们支持MSVC,因此我们需要检测Clang,因此我们知道是否打开类似GCC的选项或类似MSVC的选项。对我来说记忆太久了,但也肯定可能的是,我们也在使用Clang不支持的选项。 – leedm777 2015-01-05 14:39:41

回答

158

一个可靠的检查是使用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 (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 
    # using regular Clang or AppleClang 
endif() 

另见AppleClang policy description

+0

[cmake文档](http://www.cmake.org/cmake/help/cmake-2-8-docs.html#variable:CMAKE_LANG_COMPILER_ID)指出“这用于确定编译器,并且可能会更改” 。否则,那就完美了:-( – leedm777 2012-04-07 15:19:50

+0

它可能不是使用'基于CMAKE_CXX_COMPILER_ARG1'解决方案是一个好主意,无论是。这一次似乎并没有在所有记录在案。 – sakra 2012-04-07 16:12:36

+15

随着CMake的2.8。10,这个变量是(最后!)记录。请参阅:http://www.cmake.org/cmake/help/v2.8.10/cmake.html#variable:CMAKE_LANG_COMPILER_ID – 2012-11-19 01:07:52

0

的OGRE 3D引擎源代码使用以下check

if (CMAKE_CXX_COMPILER MATCHES ".*clang") 
    set(CMAKE_COMPILER_IS_CLANGXX 1) 
endif() 
+3

这很接近,但在使用[ccache]时不起作用(http:// ccache .samba.org /)(即'export CXX =“ccache clang ++”') – leedm777 2012-04-06 17:46:27

+4

足够接近,我会给你。我用'if(“$ {CMAKE_CXX_COMPILER} $ {CMAKE_CXX_COMPILER_ARG1}”MATCHES“。* clang”)'来处理ccache的情况。 – leedm777 2012-04-06 17:50:05

+0

这对我来说不适用于'$ {CMAKE_CXX_COMPILER} ==/Library/Developer/CommandLineTools/usr/bin/C++'。接受的答案有效。 – 2017-06-07 08:02:00

0

只是为了避免拼写错误的问题,我用这:

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的被支持)。

+0

事实上,如今天,不区分大小写的匹配是不可能的https://cmake.org/pipermail/cmake/2017-May/065432.html – fferri 2017-12-08 18:02:53