C++ 11でプロジェクトを作成したいのですが、CMakeをビルドシステムとして使用しています。最小限のコンパイラバージョンを追加するにはどうすればよいですか?
CMake設定ファイルに最低限必要なコンパイラバージョンを追加するにはどうしたらいいですか?
C++ 11でプロジェクトを作成したいのですが、CMakeをビルドシステムとして使用しています。最小限のコンパイラバージョンを追加するにはどうすればよいですか?
CMake設定ファイルに最低限必要なコンパイラバージョンを追加するにはどうしたらいいですか?
は私の知る限り、このような何かのためのサポートが内蔵されていない何が、あなたは確かにそれを自分で書くことができます:
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の方が慣れ親しんでおり、そこにあるすべてのコンパイラに適した最小限のバージョンを発見する必要はありません。
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()
次のように、特定の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()
より慣用的な、 'かどうかをテストすることを私が見つけたもののstd :: regex'用法のコンパイルには、(小さな)プロジェクト全体のコンパイルに匹敵する時間がかかります。時には、バージョンを確認することは開発者にとっては簡単で、プロジェクトをコンパイルするユーザーにとっては速くなることがあります。 – Ruslan