CMake: IMPORTED_CONFIGURATIONS を徹底解説! 外部プロジェクトのビルド構成を自由自在に操る
IMPORTED_CONFIGURATIONS
は、CMake のターゲットプロパティであり、外部プロジェクトからインポートされたターゲットが持つすべてのビルド構成を列挙します。この情報は、インポートされたターゲットを適切にリンクし、ビルド設定を一致させるために使用されます。
用途
IMPORTED_CONFIGURATIONS
は、以下の状況で役立ちます。
- インポートされたターゲットのビルド構成を、現在のプロジェクトのビルド構成にマップする必要がある場合
- インポートされたターゲットが複数のビルド構成をサポートする場合
- 外部プロジェクトからライブラリや実行可能ファイルをインポートする場合
設定方法
IMPORTED_CONFIGURATIONS
は、インポートされたターゲットのターゲットプロパティとして設定されます。以下の例は、foo
という名前のインポートされたターゲットに対して IMPORTED_CONFIGURATIONS
を設定する方法を示しています。
set_property(TARGET foo IMPORTED_CONFIGURATIONS "Debug" "Release" "RelWithDebInfo")
この例では、foo
ターゲットは Debug
、Release
、RelWithDebInfo
の3つのビルド構成を持つことが示されます。
MAP_IMPORTED_CONFIG_<CONFIG>
との連携
MAP_IMPORTED_CONFIG_<CONFIG>
プロパティは、IMPORTED_CONFIGURATIONS
と併用して、インポートされたターゲットのビルド構成を現在のプロジェクトのビルド構成にマップするために使用されます。以下の例は、foo
ターゲットの Debug
ビルド構成を現在のプロジェクトの Debug
ビルド構成にマップする方法を示しています。
set_property(TARGET foo MAP_IMPORTED_CONFIG_Debug "Debug")
この例では、foo
ターゲットの Debug
ビルド構成は、現在のプロジェクトの Debug
ビルド構成を使用してビルドされます。
- 複数の
MAP_IMPORTED_CONFIG_<CONFIG>
プロパティを設定することで、インポートされたターゲットのすべてのビルド構成をマップできます。 MAP_IMPORTED_CONFIG_<CONFIG>
プロパティは、IMPORTED_CONFIGURATIONS
とともに使用しないと効果がありません。IMPORTED_CONFIGURATIONS
は、インポートされたターゲットのみで使用できます。
例
以下の例は、foo
という名前の外部プロジェクトからライブラリをインポートし、現在のプロジェクトの Debug
および Release
ビルド構成で使用する様子を示しています。
# foo プロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(foo)
add_library(foo STATIC foo.c foo.h)
target_link_libraries(foo PUBLIC other_foo)
target_properties(foo PROPERTIES IMPORTED_CONFIGURATIONS "Debug" "Release")
# 現在のプロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(bar)
find_package(foo REQUIRED)
target_link_libraries(bar foo)
set_property(TARGET foo MAP_IMPORTED_CONFIG_Debug "Debug")
set_property(TARGET foo MAP_IMPORTED_CONFIG_Release "Release")
この例では、bar
プロジェクトは foo
プロジェクトからライブラリ foo
をインポートし、Debug
および Release
ビルド構成で使用します。MAP_IMPORTED_CONFIG_<CONFIG>
プロパティを使用して、foo
ターゲットのビルド構成を bar
プロジェクトのビルド構成にマップしています。
# foo プロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(foo)
add_library(foo STATIC foo.c foo.h)
target_link_libraries(foo PUBLIC other_foo)
target_properties(foo PROPERTIES IMPORTED_CONFIGURATIONS "Debug" "Release")
# 現在のプロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(bar)
find_package(foo REQUIRED)
target_link_libraries(bar foo)
set_property(TARGET foo MAP_IMPORTED_CONFIG_Debug "Debug")
set_property(TARGET foo MAP_IMPORTED_CONFIG_Release "Release")
例 2: インポートされたターゲットが複数のビルド構成をサポートする場合
この例では、foo
という名前のインポートされたターゲットが Debug
、Release
、RelWithDebInfo
の3つのビルド構成を持つ場合を想定しています。
# foo プロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(foo)
add_library(foo STATIC foo.c foo.h)
target_link_libraries(foo PUBLIC other_foo)
target_properties(foo PROPERTIES IMPORTED_CONFIGURATIONS "Debug" "Release" "RelWithDebInfo")
# 現在のプロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(bar)
find_package(foo REQUIRED)
target_link_libraries(bar foo)
# 現在のプロジェクトのビルド構成に応じて、インポートされたターゲットのビルド構成をマップします。
if(CMAKE_BUILD_TYPE MATCHES "Debug")
set_property(TARGET foo MAP_IMPORTED_CONFIG_Debug "Debug")
elseif(CMAKE_BUILD_TYPE MATCHES "Release")
set_property(TARGET foo MAP_IMPORTED_CONFIG_Release "Release")
else()
set_property(TARGET foo MAP_IMPORTED_CONFIG_RelWithDebInfo "RelWithDebInfo")
endif()
# foo プロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(foo)
add_library(foo STATIC foo.c foo.h)
target_link_libraries(foo PUBLIC other_foo)
target_properties(foo PROPERTIES IMPORTED_CONFIGURATIONS "Debug" "Release" "RelWithDebInfo")
# 現在のプロジェクトの CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(bar)
find_package(foo REQUIRED)
target_link_libraries(bar foo)
# `MAP_IMPORTED_CONFIG_<CONFIG>` プロパティを使用して、インポートされたターゲットのすべてのビルド構成をマップします。
foreach(CONFIG IN LISTS IMPORTED_CONFIGURATIONS)
set_property(TARGET foo MAP_IMPORTED_CONFIG_${CONFIG} "${CONFIG}")
endforeach()
- CMake の最新バージョンでは、新しい機能や変更が導入されている場合があります。最新の情報については、CMake の公式ドキュメントを参照してください。
しかし、IMPORTED_CONFIGURATIONS
にはいくつかの制限があり、すべての状況で適切なソリューションとは限りません。以下に、代替方法をいくつか紹介します。
インポートされたターゲットの CMakeLists.txt を直接編集する
インポートされたターゲットの CMakeLists.txt を直接編集することで、IMPORTED_CONFIGURATIONS
プロパティを使用せずに、インポートされたターゲットのビルド構成を指定できます。この方法は、シンプルな状況で有効ですが、インポートされたターゲットを頻繁に変更する必要がある場合や、複数のプロジェクトで同じインポートされたターゲットを使用する必要がある場合は、メンテナンスが困難になる可能性があります。
カスタムターゲットを使用してインポートされたターゲットをラップする
カスタムターゲットを使用してインポートされたターゲットをラップすることで、IMPORTED_CONFIGURATIONS
プロパティを使用せずに、インポートされたターゲットのビルド構成を指定できます。この方法は、より柔軟性と制御性がありますが、複雑さも増します。
外部プロジェクト管理ツールを使用する
CMake の外部プロジェクト管理ツールを使用することで、IMPORTED_CONFIGURATIONS
プロパティを使用せずに、インポートされたターゲットを管理できます。これらのツールは、インポートされたターゲットのビルド構成を自動的に検出して設定するのに役立ちます。
CMake の最新バージョンを使用する
CMake の最新バージョンでは、IMPORTED_CONFIGURATIONS
プロパティの代替となる新しい機能が導入されている場合があります。最新の情報については、CMake の公式ドキュメントを参照してください。
方法 | 長所 | 短所 |
---|---|---|
インポートされたターゲットの CMakeLists.txt を直接編集する | シンプル | メンテナンスが困難になる可能性がある |
カスタムターゲットを使用してインポートされたターゲットをラップする | 柔軟性と制御性が高い | 複雑 |
外部プロジェクト管理ツールを使用する | 自動化 | 設定が複雑になる可能性がある |
CMake の最新バージョンを使用する | 最新の機能を利用できる | 最新バージョンが利用可能でない場合がある |