C ++ 11でプロジェクトを作成したいのですが、ビルドシステムとしてCMakeを使用しています。
CMake構成ファイルに必要な最小コンパイラバージョンを追加するにはどうすればよいですか?
C ++ 11でプロジェクトを作成したいのですが、ビルドシステムとしてCMakeを使用しています。
CMake構成ファイルに必要な最小コンパイラバージョンを追加するにはどうすればよいですか?
AFAIK、このようなものに対する組み込みのサポートはありませんが、あなたは確かにそれを自分で書くことができます:
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()
最近はサポートが組み込まれています。ドキュメントから:
target_compile_features(mylib PUBLIC cxx_std_11)
「この例では、CMakeは、コンパイラが少なくともC ++ 11(またはC ++ 14、C ++ 17、...)のモードで呼び出されるようにし-std=gnu++11
、必要に応じてフラグを追加します。これは、内mylib
のソースだけでなく、扶養家族(からのヘッダーが含まれる場合がありますmylib
)。」