2012-04-06 122 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