【初心者向け】CMakeのVariables: CMAKE_MAP_IMPORTED_CONFIG_CONFIGを徹底解説!


用途

CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数は、以下の用途に使用できます。

  • 外部ライブラリのターゲットプロパティを CMake の内部設定にマッピングする
  • 外部ライブラリのリンクオプションを CMake の内部設定にマッピングする
  • 外部ライブラリのコンパイルオプションを CMake の内部設定にマッピングする

使い方

CMAKE_MAP_IMPORTED_CONFIG_CONFIG <EXTERNAL_LIB_NAME> <CONFIG_NAME> <CMAKE_INTERNAL_CONFIG_NAME>

ここで、

  • <CMAKE_INTERNAL_CONFIG_NAME> は、CMake の内部設定名です。
  • <CONFIG_NAME> は、外部ライブラリまたはモジュールの設定名です。
  • <EXTERNAL_LIB_NAME> は、外部ライブラリまたはモジュールの名前です。

以下の例では、MyLib という外部ライブラリの Debug 設定を CMake の内部設定 MYLIB_DEBUG にマッピングします。

CMAKE_MAP_IMPORTED_CONFIG_CONFIG MyLib Debug MYLIB_DEBUG

この設定により、MyLib ライブラリを Debug モードでビルドする場合は、以下のコマンドが自動的に実行されます。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MYLIB_DEBUG_CXX_FLAGS}")
set(CMAKE_LINK_FLAGS "${CMAKE_LINK_FLAGS} ${MYLIB_DEBUG_LINK_FLAGS}")
  • CMake の内部設定名は、衝突を避けるために一意である必要があります。
  • 外部ライブラリまたはモジュールが <CONFIG_NAME> 設定をサポートしていることを確認する必要があります。
  • CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数は、CMake 3.1 以降で使用できます。


サンプルプロジェクト

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)

project(MyProject)

# 外部ライブラリ MyLib を追加
find_package(MyLib REQUIRED)

# MyLib の Debug 設定を CMake の内部設定 MYLIB_DEBUG にマッピング
CMAKE_MAP_IMPORTED_CONFIG_CONFIG MyLib Debug MYLIB_DEBUG

# MyProject のターゲットを定義
add_executable(MyTarget MyProject.cpp)

# MyTarget を MyLib とリンク
target_link_libraries(MyTarget MyLib::Debug)

MyProject.cpp

#include <MyLib.h>

int main() {
  // MyLib の Debug 設定で定義された関数を使用
  my_function();

  return 0;
}

このプロジェクトをビルドするには、以下のコマンドを実行します。

cmake .
make

ビルドが成功すると、MyTarget という実行ファイルが生成されます。この実行ファイルを実行すると、MyLibDebug 設定で定義された関数 my_function() が呼び出されます。

  • MyProject.cpp ファイルは、MyLibDebug 設定で定義された関数 my_function() を呼び出す簡単なプログラムです。
  • target_link_libraries コマンドを使用して、MyTargetMyLib::Debug とリンクします。
  • add_executable コマンドを使用して、MyProject というターゲットを定義します。
  • CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数を使用して、MyLibDebug 設定を CMake の内部設定 MYLIB_DEBUG にマッピングします。
  • 次に、find_package コマンドを使用して、外部ライブラリ MyLib を検索します。
  • CMakeLists.txt ファイルの最初の部分は、CMake のバージョン要件とプロジェクト名を定義します。


ターゲットプロパティ

ターゲットプロパティを使用して、外部ライブラリのコンパイルオプション、リンクオプション、およびターゲットプロパティを直接設定することができます。これは、CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数よりも柔軟性がありますが、設定がより冗長になる可能性があります。

以下の例では、MyLib という外部ライブラリの Debug 設定をターゲットプロパティを使用して設定します。

cmake_minimum_required(VERSION 3.1)

project(MyProject)

# 外部ライブラリ MyLib を追加
find_package(MyLib REQUIRED)

# MyLib の Debug 設定のコンパイルオプションを設定
set_target_properties(MyLib::Debug PROPERTIES
  CXX_FLAGS "${CXX_FLAGS} ${MYLIB_DEBUG_CXX_FLAGS}"
)

# MyLib の Debug 設定のリンクオプションを設定
set_target_properties(MyLib::Debug PROPERTIES
  LINK_FLAGS "${LINK_FLAGS} ${MYLIB_DEBUG_LINK_FLAGS}"
)

# MyProject のターゲットを定義
add_executable(MyTarget MyProject.cpp)

# MyTarget を MyLib とリンク
target_link_libraries(MyTarget MyLib::Debug)

ターゲットプロパティファイル

ターゲットプロパティファイルを使用して、外部ライブラリの設定を定義することができます。これは、CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数よりも設定をより明確にするのに役立ちますが、ファイル管理が煩雑になる可能性があります。

以下の例では、MyLib という外部ライブラリの Debug 設定をターゲットプロパティファイルを使用して定義します。

cmake_minimum_required(VERSION 3.1)

project(MyProject)

# 外部ライブラリ MyLib を追加
find_package(MyLib REQUIRED)

# MyLib の Debug 設定のターゲットプロパティファイルを読み込む
include(MyLib::DebugTargets.cmake)

# MyProject のターゲットを定義
add_executable(MyTarget MyProject.cpp)

# MyTarget を MyLib とリンク
target_link_libraries(MyTarget MyLib::Debug)

外部スクリプト

外部スクリプトを使用して、外部ライブラリの設定を定義することができます。これは、複雑な設定を処理する必要がある場合に役立ちますが、プロジェクトの依存関係が増加する可能性があります。

以下の例では、MyLib という外部ライブラリの Debug 設定を外部スクリプトを使用して定義します。

cmake_minimum_required(VERSION 3.1)

project(MyProject)

# 外部ライブラリ MyLib を追加
find_package(MyLib REQUIRED)

# MyLib の Debug 設定の外部スクリプトを読み込む
include(MyLibDebug.cmake)

# MyProject のターゲットを定義
add_executable(MyTarget MyProject.cpp)

# MyTarget を MyLib とリンク
target_link_libraries(MyTarget MyLib::Debug)

手動設定

CMAKE_MAP_IMPORTED_CONFIG_CONFIG 変数、ターゲットプロパティ、ターゲットプロパティファイル、または外部スクリプトを使用せずに、外部ライブラリのコンパイルオプション、リンクオプション、およびターゲットプロパティを手動で設定することができます。これは、最も低レベルの方法ですが、設定が最も複雑になる可能性があります。

以下の例では、MyLib という外部ライブラリの Debug 設定をを手動で設定します。

cmake_minimum_required(VERSION 3.1)

project(MyProject)

# 外部ライブラリ MyLib を追加
find_package(MyLib REQUIRED)

# MyLib の Debug 設定のコンパイルオプションを設定
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MYLIB_DEBUG_CXX_FLAGS}")

# MyLib の Debug 設定のリンクオプションを設定
set(CMAKE_LINK_FLAGS "${CMAKE_LINK_FLAGS} ${MYLIB_DEBUG_LINK_FLAGS}")

# MyProject のターゲットを定義
add_executable(MyTarget MyProject.cpp)

# MyLib と MyTarget をリンク
target_link_libraries(MyTarget MyLib)