【CMake】依存関係にあるプロジェクトのビルド設定を共有する方法:load_cache()コマンド徹底解説


load_cache() コマンドは、別の CMake プロジェクトのキャッシュファイルから値を読み込み、現在のプロジェクトのキャッシュに保存するために使用されます。これは、依存関係にあるプロジェクトのビルド設定を共有したり、異なるディレクトリ構造でプロジェクトをビルドする場合に便利です。

構文

load_cache(
  <cache_file>
  [PREFIX <prefix>]
  [EXCLUDE <var1> <var2> ...]
)

引数

  • [EXCLUDE <var1> <var2> ...]: 読み込まれたキャッシュエントリから除外する変数のリスト
  • [PREFIX <prefix>]: 読み込まれたキャッシュエントリの前に付加するプレフィックス
  • <cache_file>: 読み込むキャッシュファイルのパス

動作

load_cache() コマンドは、指定されたキャッシュファイルを読み込み、その中の変数の値を現在のプロジェクトのキャッシュに保存します。変数名にプレフィックスが指定されている場合は、そのプレフィックスが変数名に追加されます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

load_cache(build/otherproject/CMakeCache.in PREFIX otherproject_)

# otherproject_MYVAR の値を出力する
message(STATUS "otherproject_MYVAR: ${otherproject_MYVAR}")

この例では、build/otherproject/CMakeCache.in というキャッシュファイルから値を読み込み、otherproject_ というプレフィックスを付けて現在のプロジェクトのキャッシュに保存します。その後、otherproject_MYVAR 変数の値を出力します。

  • EXCLUDE オプションを使用して、読み込まれたキャッシュエントリから特定の変数を除外することができます。
  • 複数の load_cache() コマンドを連続して使用することができます。
  • キャッシュファイルは、CMake プロジェクトをビルドしたときに生成されます。
  • load_cache() コマンドは、読み込まれたキャッシュエントリを現在のプロジェクトのキャッシュに保存するだけであり、それらのエントリに基づいてアクションを実行しません。

利点

  • キャッシュファイルを使用して、ビルド設定を簡単に共有および再利用できる
  • 異なるディレクトリ構造でプロジェクトをビルドする場合に便利
  • 依存関係にあるプロジェクトのビルド設定を共有できる
  • load_cache() コマンドを使用する前に、読み込まれるキャッシュファイルの内容を確認することをお勧めします。
  • キャッシュファイルの形式は、CMake のバージョンによって異なる場合があります。


cmake_minimum_required(VERSION 3.10)

project(myproject)

# otherproject ディレクトリに移動する
add_subdirectory(build/otherproject)

# otherproject_MYVAR の値を出力する
message(STATUS "otherproject_MYVAR: ${otherproject_MYVAR}")

# otherproject_MYVAR の値を使用してターゲットをビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)

例 2: 異なるディレクトリ構造でプロジェクトをビルドする

この例では、myproject というプロジェクトが build/myproject ディレクトリにビルドされていることを想定しています。myproject は、otherproject というプロジェクトに依存しており、otherprojectbuild/otherproject ディレクトリにビルドされています。myproject は、load_cache() コマンドを使用して otherproject のキャッシュファイルから MYVAR の値を読み込み、その値を使用して mytarget というターゲットをビルドします。

cmake_minimum_required(VERSION 3.10)

project(myproject)

# otherproject ディレクトリの絶対パスを取得する
get_property(otherproject_dir DIRECTORY build/otherproject REALPATH)

# otherproject のキャッシュファイルを指定する
set(otherproject_cache_file "${otherproject_dir}/CMakeCache.in")

# otherproject のキャッシュファイルから値を読み込む
load_cache(${otherproject_cache_file})

# otherproject_MYVAR の値を出力する
message(STATUS "otherproject_MYVAR: ${otherproject_MYVAR}")

# otherproject_MYVAR の値を使用してターゲットをビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)


キャッシュエントリを手動で設定する

load_cache() コマンドを使用する代わりに、キャッシュエントリを手動で設定することができます。これは、読み込むキャッシュファイルの内容を完全に制御したい場合や、特定のキャッシュエントリのみを読み込みたい場合に役立ちます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

# キャッシュエントリを手動で設定する
set(MYVAR "value")

# mytarget をビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)

set_property() コマンドを使用する

set_property() コマンドを使用して、キャッシュエントリを別のプロジェクトに伝達することもできます。これは、キャッシュエントリをファイルに保存する必要がない場合に役立ちます。

cmake_minimum_required(VERSION 3.10)

project(myproject)

# キャッシュエントリを別のプロジェクトに伝達する
set_property(TARGET mytarget DIRECTORY PROPERTY MYVAR "value")

# mytarget をビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)

外部変数ファイルを使用する

外部変数ファイルを使用して、プロジェクト間で設定を共有することもできます。これは、複数のプロジェクトで同じ設定を使用する必要がある場合に役立ちます。

# 外部変数ファイル
set(MYVAR "value")

# myproject CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(myproject)

# 外部変数ファイルを読み込む
include(path/to/external-variables.cmake)

# mytarget をビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)

インストールされたターゲットを使用する

ターゲットをインストールして、別のプロジェクトで依存関係として使用することもできます。これは、依存関係が頻繁に変更されない場合や、依存関係をビルドしたくない場合に役立ちます。

# otherproject CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(otherproject)

# mytarget をインストールする
add_executable(mytarget mytarget.cpp)
install(TARGETS mytarget DESTINATION lib)
# myproject CMakeLists.txt
cmake_minimum_required(VERSION 3.10)

project(myproject)

# otherproject を依存関係として使用する
find_package(otherproject REQUIRED)

# mytarget をビルドする
add_executable(mytarget mytarget.cpp)
target_link_libraries(mytarget otherproject)

最適な方法を選択する

使用する方法は、特定のニーズによって異なります。

  • 依存関係が頻繁に変更されない場合や、依存関係をビルドしたくない場合は、インストールされたターゲットを使用します。
  • 複数のプロジェクトで同じ設定を使用する必要がある場合は、外部変数ファイルを使用します。
  • キャッシュエントリをファイルに保存する必要がない場合は、set_property() コマンドを使用します。
  • キャッシュエントリの内容を完全に制御したい場合は、キャッシュエントリを手動で設定します。
  • ターゲットのインストールは、CMake 2.4 以降で使用できます。
  • 外部変数ファイルは、CMake 2.6 以降で使用できます。
  • set_property() コマンドは、CMake 2.8 以降でのみ使用できます。
  • load_cache() コマンドは、CMake 3.10 以降でのみ使用できます。
  • [CMake 3.30.0-rc4 Documentation -