CMake: IMPORTED_CONFIGURATIONS を徹底解説! 外部プロジェクトのビルド構成を自由自在に操る


IMPORTED_CONFIGURATIONS は、CMake のターゲットプロパティであり、外部プロジェクトからインポートされたターゲットが持つすべてのビルド構成を列挙します。この情報は、インポートされたターゲットを適切にリンクし、ビルド設定を一致させるために使用されます。

用途

IMPORTED_CONFIGURATIONS は、以下の状況で役立ちます。

  • インポートされたターゲットのビルド構成を、現在のプロジェクトのビルド構成にマップする必要がある場合
  • インポートされたターゲットが複数のビルド構成をサポートする場合
  • 外部プロジェクトからライブラリや実行可能ファイルをインポートする場合

設定方法

IMPORTED_CONFIGURATIONS は、インポートされたターゲットのターゲットプロパティとして設定されます。以下の例は、foo という名前のインポートされたターゲットに対して IMPORTED_CONFIGURATIONS を設定する方法を示しています。

set_property(TARGET foo IMPORTED_CONFIGURATIONS "Debug" "Release" "RelWithDebInfo")

この例では、foo ターゲットは DebugReleaseRelWithDebInfo の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 という名前のインポートされたターゲットが DebugReleaseRelWithDebInfo の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 の最新バージョンを使用する最新の機能を利用できる最新バージョンが利用可能でない場合がある