CMake: ターゲットごとの拡張機能モード設定も可能! CMAKE_LANG_EXTENSIONS_DEFAULT を使いこなそう


CMAKE_LANG_EXTENSIONS_DEFAULT は CMake の変数で、特定の言語のコンパイラがデフォルトで使用する拡張機能モードを定義します。これは、CMAKE_<LANG>_EXTENSIONS 変数が設定されていない場合に、target_property _EXTENSIONS のデフォルト値として使用されます。

詳細

CMAKE_LANG_EXTENSIONS_DEFAULT は、以下の情報を保持します。

  • 拡張機能モード: コンパイラがデフォルトで使用する拡張機能モード。これは、GCCclang などのコンパイラが提供するオプションに相当します。
  • 言語: 変数名の <LANG> 部分が示す言語。

以下の例は、CMAKE_LANG_EXTENSIONS_DEFAULT を使って C++ コンパイラがデフォルトで使用する拡張機能モードを GNU11 に設定する方法を示します。

set(CMAKE_LANG_EXTENSIONS_DEFAULT CXX GNU11)
  • 具体的な拡張機能モードは、コンパイラによって異なります。詳細は、コンパイラのドキュメントを参照してください。
  • この変数は読み取り専用です。変更すると、予期しない動作が発生する可能性があります。
  • CMAKE_LANG_EXTENSIONS_DEFAULT は、CMake バージョン 3.22 以降でのみ使用できます。


set(CMAKE_LANG_EXTENSIONS_DEFAULT CXX GNU11)

複数の言語を設定

以下の例は、複数の言語に対して拡張機能モードを設定する方法を示します。

set(CMAKE_LANG_EXTENSIONS_DEFAULT CXX GNU11)
set(CMAKE_LANG_EXTENSIONS_DEFAULT C GNU90)

特定のターゲットに設定

以下の例は、特定のターゲットに対して拡張機能モードを設定する方法を示します。

target_property(my_target PROPERTIES CXX_EXTENSIONS GNU11)

条件付き設定

以下の例は、条件付きで拡張機能モードを設定する方法を示します。

if(CMAKE_COMPILER_IS_GNUC)
  set(CMAKE_LANG_EXTENSIONS_DEFAULT CXX GNU11)
endif()
  • CMAKE_LANG_EXTENSIONS_DEFAULT は、CMake バージョン 3.22 以降でのみ使用できます。
  • 具体的な拡張機能モードは、コンパイラによって異なります。詳細は、コンパイラのドキュメントを参照してください。
  • 上記のコードはあくまで例であり、実際のプロジェクトで使用するには適宜修正する必要があります。


代替方法

  1. ターゲットプロパティ: target_property _EXTENSIONS を使用して、特定のターゲットに対して拡張機能モードを設定できます。 これは、CMAKE_LANG_EXTENSIONS_DEFAULT よりも柔軟性が高く、個々のターゲットに異なる設定を適用することができます。
target_property(my_target PROPERTIES CXX_EXTENSIONS GNU11)
  1. CMakeLists.txt ファイル: target_sourcesadd_executable などのコマンドに直接拡張機能モードオプションを指定できます。 これは、シンプルなプロジェクトや、特定のターゲットにのみ拡張機能モードを設定したい場合に有効です。
add_executable(my_program main.cpp)
set_property(TARGET my_program PROPERTY CXX_EXTENSIONS GNU11)
  1. コンパイラフラグ: CMAKE_C_FLAGSCMAKE_CXX_FLAGS などの変数を使用して、コンパイラフラグを直接設定できます。 これは、低レベルな制御が必要な場合や、CMake 以外のビルドシステムと併用する場合に役立ちます。
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

それぞれの方法の比較

方法利点欠点備考
target_property柔軟性が高い複雑になる可能性がある個々のターゲットに異なる設定を適用したい場合に適している
CMakeLists.txt ファイルシンプル柔軟性に欠けるシンプルなプロジェクトや、特定のターゲットにのみ拡張機能モードを設定したい場合に適している
コンパイラフラグ低レベルな制御が可能複雑で分かりにくいCMake 以外のビルドシステムと併用する場合や、低レベルな制御が必要な場合に適している

CMAKE_LANG_EXTENSIONS_DEFAULT は、特定の言語のコンパイラがデフォルトで使用する拡張機能モードを定義する便利な変数ですが、状況に応じて上記の代替方法を検討することをおすすめします。

  • 具体的な方法は、プロジェクトの要件やコンパイラによって異なる場合があります。 詳細については、CMake ドキュメントやコンパイラのドキュメントを参照してください。
  • 上記の代替方法は、互いに排他的ではありません。 状況に応じて、複数の方法を組み合わせることもできます。