CMake: ターゲットごとの拡張機能モード設定も可能! CMAKE_LANG_EXTENSIONS_DEFAULT を使いこなそう
CMAKE_LANG_EXTENSIONS_DEFAULT
は CMake の変数で、特定の言語のコンパイラがデフォルトで使用する拡張機能モードを定義します。これは、CMAKE_<LANG>_EXTENSIONS
変数が設定されていない場合に、target_property
_EXTENSIONS
のデフォルト値として使用されます。
詳細
CMAKE_LANG_EXTENSIONS_DEFAULT
は、以下の情報を保持します。
- 拡張機能モード: コンパイラがデフォルトで使用する拡張機能モード。これは、
GCC
やclang
などのコンパイラが提供するオプションに相当します。 - 言語: 変数名の
<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 以降でのみ使用できます。- 具体的な拡張機能モードは、コンパイラによって異なります。詳細は、コンパイラのドキュメントを参照してください。
- 上記のコードはあくまで例であり、実際のプロジェクトで使用するには適宜修正する必要があります。
代替方法
- ターゲットプロパティ:
target_property
_EXTENSIONS
を使用して、特定のターゲットに対して拡張機能モードを設定できます。 これは、CMAKE_LANG_EXTENSIONS_DEFAULT
よりも柔軟性が高く、個々のターゲットに異なる設定を適用することができます。
target_property(my_target PROPERTIES CXX_EXTENSIONS GNU11)
- CMakeLists.txt ファイル:
target_sources
やadd_executable
などのコマンドに直接拡張機能モードオプションを指定できます。 これは、シンプルなプロジェクトや、特定のターゲットにのみ拡張機能モードを設定したい場合に有効です。
add_executable(my_program main.cpp)
set_property(TARGET my_program PROPERTY CXX_EXTENSIONS GNU11)
- コンパイラフラグ:
CMAKE_C_FLAGS
やCMAKE_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 ドキュメントやコンパイラのドキュメントを参照してください。
- 上記の代替方法は、互いに排他的ではありません。 状況に応じて、複数の方法を組み合わせることもできます。