【初心者向け】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
という実行ファイルが生成されます。この実行ファイルを実行すると、MyLib
の Debug
設定で定義された関数 my_function()
が呼び出されます。
MyProject.cpp
ファイルは、MyLib
のDebug
設定で定義された関数my_function()
を呼び出す簡単なプログラムです。target_link_libraries
コマンドを使用して、MyTarget
をMyLib::Debug
とリンクします。add_executable
コマンドを使用して、MyProject
というターゲットを定義します。CMAKE_MAP_IMPORTED_CONFIG_CONFIG
変数を使用して、MyLib
のDebug
設定を 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)