【保存版】 CMake でクロスコンパイルを成功させるためのヒント: CMAKE_FIND_USE_INSTALL_PREFIX を中心に


CMAKE_FIND_USE_INSTALL_PREFIX は CMake 3.24 以降で導入された変数で、以下のコマンドの動作を制御します。

  • find_file()
  • find_program()
  • find_package()

これらのコマンドは、システム上に必要なライブラリやプログラム、ファイルなどを検索します。CMAKE_FIND_USE_INSTALL_PREFIX が設定されている場合、これらのコマンドは、以下の場所も検索対象に追加します。

  • CMAKE_STAGING_PREFIX で指定されたディレクトリ
  • CMAKE_INSTALL_PREFIX で指定されたディレクトリ

これは、クロスコンパイル環境など、異なるアーキテクチャ間でビルドを行う場合に特に役立ちます。

使い方

CMAKE_FIND_USE_INSTALL_PREFIX は、以下のいずれかの方法で設定できます。

  • コマンドラインで -DCMAKE_FIND_USE_INSTALL_PREFIX=TRUE オプションを指定する
  • CMakeLists.txt ファイルで set() コマンドを使用する

# CMakeLists.txt ファイル

set(CMAKE_FIND_USE_INSTALL_PREFIX TRUE)

find_package(MyLibrary REQUIRED)

上記の例では、find_package() コマンドは、CMAKE_INSTALL_PREFIXCMAKE_STAGING_PREFIX で指定されたディレクトリも検索対象に追加します。

  • CMAKE_FIND_USE_INSTALL_PREFIXCMAKE_FIND_NO_INSTALL_PREFIX は互いに排他的です。どちらか一方のみ設定できます。
  • CMAKE_FIND_USE_INSTALL_PREFIX を設定すると、検索対象が増えるため、ビルド時間が長くなる場合があります。
  • CMAKE_FIND_USE_INSTALL_PREFIX は、CMake 3.24 以降でのみ使用できます。


シンプルなサンプル

# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.24)

set(CMAKE_FIND_USE_INSTALL_PREFIX TRUE)

find_package(MyLibrary REQUIRED)

add_executable(my_program main.cpp)
target_link_libraries(my_program MyLibrary)

このサンプルでは、以下の操作を行います。

  1. CMake の最低バージョンを 3.24 に設定します。
  2. CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定します。
  3. MyLibrary という名前のライブラリを検索します。
  4. main.cpp という名前のソースファイルから my_program という名前の実行ファイルを作成します。
  5. my_programMyLibrary をリンクします。

ポイント

  • MyLibrary は、事前にインストールされている必要があります。
  • CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定することで、find_package() コマンドが CMAKE_INSTALL_PREFIXCMAKE_STAGING_PREFIX で指定されたディレクトリも検索対象に追加します。

クロスコンパイル環境でのサンプル

# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.24)

set(CMAKE_TOOLCHAIN_FILE toolchain.cmake)

set(CMAKE_FIND_USE_INSTALL_PREFIX TRUE)

find_package(MyLibrary REQUIRED)

add_executable(my_program main.cpp)
target_link_libraries(my_program MyLibrary)

説明

このサンプルは、クロスコンパイル環境での使用を想定しています。以下の操作を行います。

  1. CMake の最低バージョンを 3.24 に設定します。
  2. toolchain.cmake という名前のツールチェーンファイルを使用します。
  3. CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定します。
  4. MyLibrary という名前のライブラリを検索します。
  5. main.cpp という名前のソースファイルから my_program という名前の実行ファイルを作成します。
  6. my_programMyLibrary をリンクします。

ポイント

  • CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定することで、クロスコンパイル先の環境でインストールされた MyLibrary を検索できます。
  • toolchain.cmake ファイルは、クロスコンパイル環境に必要な設定を記述します。

CMAKE_INSTALL_PREFIX と併用するサンプル

# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.24)

set(CMAKE_INSTALL_PREFIX /usr/local)

set(CMAKE_FIND_USE_INSTALL_PREFIX TRUE)

find_package(MyLibrary REQUIRED)

add_executable(my_program main.cpp)
target_link_libraries(my_program MyLibrary)

説明

このサンプルでは、CMAKE_INSTALL_PREFIXCMAKE_FIND_USE_INSTALL_PREFIX を併用して、以下の操作を行います。

  1. CMake の最低バージョンを 3.24 に設定します。
  2. インストール先のディレクトリを /usr/local に設定します。
  3. CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定します。
  4. MyLibrary という名前のライブラリを検索します。
  5. main.cpp という名前のソースファイルから my_program という名前の実行ファイルを作成します。
  6. my_programMyLibrary をリンクします。
  • CMAKE_FIND_USE_INSTALL_PREFIXTRUE に設定することで、インストール先のディレクトリだけでなく、CMAKE_INSTALL_PREFIX で指定されたディレクトリも検索対象に追加できます。
  • CMAKE_INSTALL_PREFIX を設定することで、インストール先のディレクトリを指定できます。
# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.24)

set(CMAKE_STAGING_PREFIX /opt/staging)

set(CMAKE_FIND_USE_INSTALL_PREFIX TRUE)

find_package(MyLibrary REQUIRED)

add_executable(my_program main.cpp)
target_link_libraries(my_program


個別に検索パスを設定する

find_package()find_program()find_file() コマンドの CMAKE_FIND_PATH オプションを使用して、個別に検索パスを設定できます。これは、CMAKE_FIND_USE_INSTALL_PREFIX を使用するよりも詳細な制御が可能ですが、設定が煩雑になる場合があります。

# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.10)

find_package(MyLibrary REQUIRED
  PATHS "${CMAKE_INSTALL_PREFIX};${CMAKE_STAGING_PREFIX}"
)

add_executable(my_program main.cpp)
target_link_libraries(my_program MyLibrary)

CMAKE_MODULE_PATH を使用する

CMAKE_MODULE_PATH 環境変数を使用して、カスタムの CMake モジュールを検索パスに追加できます。この方法を使用すると、find_package()find_program()find_file() コマンドの設定を簡略化できます。

# CMakeLists.txt ファイル

cmake_minimum_required(VERSION 3.10)

set(CMAKE_MODULE_PATH "${CMAKE_INSTALL_PREFIX}/lib/cmake;${CMAKE_STAGING_PREFIX}/share/cmake")

find_package(MyLibrary REQUIRED)

add_executable(my_program main.cpp)
target_link_libraries(my_program MyLibrary)

カスタムの find_package モジュールを使用する

find_package() コマンドの動作を拡張するカスタムの find_package モジュールを作成できます。これは、複雑な検索ロジックが必要な場合に役立ちます。

CMakeLists.txt ファイルを直接編集する

古いバージョンの CMake では、find_package()find_program()find_file() コマンドの出力結果を直接編集することで、検索結果を調整できます。これは、非推奨の方法ですが、どうしても必要な場合は使用できます。

  • 使用する代替方法は、CMake のバージョンとプロジェクトの要件によって異なります。
  • 上記の代替方法は、CMAKE_FIND_USE_INSTALL_PREFIX と比べて機能が制限されている場合があります。