CMake/C++ プロジェクトについて GCC または Clang のバージョンに併せた最新の -std オプションを与える CMake の記述例


  • cmake/flags.c++.std.cmake などに保存しておき、 include して使う:
if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" )

  if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.5 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.5 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1z" )

  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 3.2 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 3.2 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )

  else()
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

  endif()

elseif( CMAKE_COMPILER_IS_GNUCXX )

  if( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 5.1 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 5.1 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" )

  elseif(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.8)
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y" )

  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.7 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.7 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )

  elseif( CMAKE_CXX_COMPILER_VERION VERSION_GREATER 4.3 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.3 )
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x" )

  else()
    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03" )

  endif()

endif()

効果

例えばコンパイラーとして clang++-3.7 が与えられた場合には -std=c++1zg++-4.9.2 が与えられた場合には -std=c++1y など、コンパイラーに応じた使用可能な最新の -std 規格が翻訳オプションとして与えられる。

主な用途

  • ソースコード側が最新の言語規格まで対応しているライブラリーについて、与えられたコンパイラーの対応規格レベルに応じて -std オプションを切り替えたい場合。

Reference

だそく

  • MSVC++ 向けには何の効果も与えない効果があるので、 clang++, g++, cl.exe の何れでコンパイルする可能性があるプロジェクトで用いるなどしても MSVC++ で副作用が生じる事はない。