CMake: ターゲットライブラリの言語機能を把握する方法 - CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED を超えて


CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数は、ターゲットライブラリが特定の言語機能を使用しているかどうかを確認するための CMake 変数です。これは、ターゲットライブラリが特定のコンパイラやツールチェーンでサポートされていない機能を使用していないことを確認するために使用できます。

構文

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED(<language> <feature>)

この変数は、次の 2 つの引数を取ります。

  • <feature>: ターゲットライブラリが使用している可能性のある言語機能。
  • <language>: ターゲットライブラリに使用されるプログラミング言語。

次の例では、mylibrary ターゲットライブラリが C++11 機能を使用しているかどうかを確認します。

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED(CXX11 CXX_STANDARD_11)

if (CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED)
  # ターゲットライブラリは C++11 機能を使用している
else (NOT CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED)
  # ターゲットライブラリは C++11 機能を使用していない
endif()

使用例

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数は、次のような状況で使用できます。

  • ターゲットライブラリが特定の言語標準に準拠していることを確認する。
  • ターゲットライブラリが必要とする言語機能を特定する。
  • ターゲットライブラリが特定のコンパイラやツールチェーンでサポートされていない機能を使用していないことを確認する。
  • この変数は、ターゲットライブラリがヘッダーファイルで宣言している機能のみを検出します。ソースコード内で実際に使用されている機能は検出されません。
  • CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数は、CMake 3.10 以降でのみ使用できます。


cmake_minimum_required(VERSION 3.10)

project(myproject)

add_library(mylibrary foo.cpp bar.cpp)

target_link_libraries(mylibrary otherlibrary)

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED(CXX11 CXX_STANDARD_11)

if (CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED)
  message(STATUS "ターゲットライブラリは C++11 機能を使用しています。")
else (NOT CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED)
  message(STATUS "ターゲットライブラリは C++11 機能を使用していません。")
endif()

例 2: ターゲットライブラリが必要とする言語機能を特定する

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_library(mylibrary foo.cpp bar.cpp)

target_link_libraries(mylibrary otherlibrary)

list(VARIABLE required_features)

foreach (feature CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED_FEATURES)
  if (CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED_${feature})
    list(APPEND required_features ${feature})
  endif()
endforeach()

message(STATUS "ターゲットライブラリが必要とする言語機能: ${required_features}")

例 3: ターゲットライブラリが特定の言語標準に準拠していることを確認する

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_library(mylibrary foo.cpp bar.cpp)

target_link_libraries(mylibrary otherlibrary)

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED(CXX11 CXX_STANDARD_11)
CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED(CXX20 CXX_STANDARD_20)

if (CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED_CXX11)
  if (CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED_CXX20)
    message(STATUS "ターゲットライブラリは C++11 および C++20 標準に準拠しています。")
  else()
    message(STATUS "ターゲットライブラリは C++11 標準に準拠しています。")
  endif()
else()
  message(STATUS "ターゲットライブラリは C++11 標準に準拠していません。")
endif()

説明

上記の例では、mylibrary ターゲットライブラリが C++11 機能を使用しているかどうかを確認し、ターゲットライブラリが必要とする言語機能を特定し、ターゲットライブラリが特定の言語標準に準拠していることを確認します。

これらの例は、CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数の使用方法を示すほんの一例です。この変数は、さまざまな状況で使用できる強力なツールです。

  • CMake の最新バージョンを使用していることを確認してください。


  • この変数は、すべてのコンパイラやツールチェーンでサポートされているわけではありません。
  • この変数は、ターゲットライブラリがヘッダーファイルで宣言している機能のみを検出します。ソースコード内で実際に使用されている機能は検出されません。
  • この変数は、CMake 3.10 以降でのみ使用できます。

これらの制限を回避するために、CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数の代替方法をいくつか検討することができます。

ヘッダーファイルの分析

ターゲットライブラリがヘッダーファイルで宣言している機能を分析することで、そのライブラリが特定の言語機能を使用しているかどうかを確認することができます。これは、grepawk などのテキスト処理ツールを使用して行うことができます。

grep -H "CXX11\|CXX20" mylibrary/*.h

このコマンドは、mylibrary ターゲットライブラリに含まれるすべてのヘッダーファイルから C++11 または C++20 に関連する行を検索します。

コンパイラ警告の分析

ターゲットライブラリをコンパイルするときに生成されるコンパイラ警告を分析することで、そのライブラリが特定の言語機能を使用しているかどうかを確認することができます。これは、cmake --build . --verbose コマンドを使用して行うことができます。

cmake --build . --verbose

このコマンドは、myproject ディレクトリ内の CMakeLists.txt ファイルを使用してプロジェクトをビルドし、ビルドプロセス中に生成されるすべてのコンパイラ警告を出力します。

ライブラリドキュメントの確認

ターゲットライブラリのドキュメントを確認することで、そのライブラリが特定の言語機能を使用しているかどうかを確認することができます。これは、ライブラリの公式 Web サイトまたはドキュメントを参照することによって行うことができます。

ライブラリ開発者に問い合わせる

ターゲットライブラリの開発者に問い合わせることで、そのライブラリが特定の言語機能を使用しているかどうかを確認することができます。これは、ライブラリの GitHub リポジトリのイシューまたはフォーラムを使用して行うことができます。

CMAKE_LANG_LINK_LIBRARY_USING_FEATURE_SUPPORTED 変数は、ターゲットライブラリが特定の言語機能を使用しているかどうかを確認するための便利なツールですが、いくつかの制限があります。これらの制限を回避するために、ヘッダーファイルの分析、コンパイラ警告の分析、ライブラリドキュメントの確認、ライブラリ開発者への問い合わせなどの代替方法を検討することができます。