2013-02-18 7 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

21

CMake 2.8.10から、CMAKE_ <LANG> _COMPILER_VERSION変数にアクセスして、コンパイラのバージョンを取得することができます。以前のバージョンでは、これらは内部目的のためだけに予約されていたので、ユーザーコードで読むべきではありません。また、すべての言語で設定することは保証されていませんが、CおよびCXXは確実に使用可能にする必要があります。

CMakeには、バージョン検証コードを記述するために使用できるバージョン比較演算子(VERSION_LESS、VERSION_EQUAL、VERSION_GREATER)も含まれています。

どのコンパイラが最初に見つかっているのかを確認してから、正しいバージョンを確認する必要があります。ここで

は私のプロジェクトの1からの短いサンプルです:

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() 
関連する問題