2013-02-18 64 views

回答

37

據我所知,沒有內置這樣的事情的支持,但你當然可以把它寫自己:

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.gcc.version") 
    message(FATAL_ERROR "Insufficient gcc version") 
    endif() 
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") 
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "your.required.msvc.version") 
    message(FATAL_ERROR "Insufficient msvc version") 
    endif() 
elseif(...) 
# etc. 
endif() 

不過,我建議你實際上考慮一個功能檢測方法代替。也就是說,使用try_compile()來驗證編譯器是否支持您需要的功能,如果不支持,請使用FATAL_ERROR。它在CMake中更具慣用性,並且還有額外的好處,您不必爲那裏的所有編譯器發現適當的最小版本。

+0

雖然更地道,我發現,測試是否' std :: regex'用法編譯需要花費時間來編譯整個(小)項目。有時檢查版本對於開發人員來說更簡單,而且對於編譯項目的用戶來說更快。 – Ruslan 2016-06-29 14:16:55

21

從CMake 2.8.10開始CMAKE_ <LANG>用戶可以訪問_COMPILER_VERSION變量以獲取編譯器版本。在以前的版本中,這些版本僅供內部使用,不應被用戶代碼讀取。他們也不能保證爲所有語言設置,但C和CXX一定可用。

CMake還包含可用於編寫版本驗證代碼的版本比較(VERSION_LESS,VERSION_EQUAL,VERSION_GREATER)的運算符。

請記住,您將需要找出您有第一個編譯器,然後檢查正確的版本。

這裏是我的一個項目一個簡短的樣本:

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") 
    # require at least gcc 4.8 
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) 
     message(FATAL_ERROR "GCC version must be at least 4.8!") 
    endif() 
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") 
    # require at least clang 3.2 
    if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.2) 
     message(FATAL_ERROR "Clang version must be at least 3.2!") 
    endif() 
else() 
    message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.") 
endif() 
3

您可以檢查特定的gcc版本如下:

if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.1) 
    message(FATAL_ERROR "Require at least gcc-5.1") 
endif() 
相關問題