【保存版】 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_PREFIX
と CMAKE_STAGING_PREFIX
で指定されたディレクトリも検索対象に追加します。
CMAKE_FIND_USE_INSTALL_PREFIX
とCMAKE_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)
このサンプルでは、以下の操作を行います。
- CMake の最低バージョンを 3.24 に設定します。
CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定します。MyLibrary
という名前のライブラリを検索します。main.cpp
という名前のソースファイルからmy_program
という名前の実行ファイルを作成します。my_program
にMyLibrary
をリンクします。
ポイント
MyLibrary
は、事前にインストールされている必要があります。CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定することで、find_package()
コマンドがCMAKE_INSTALL_PREFIX
とCMAKE_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)
説明
このサンプルは、クロスコンパイル環境での使用を想定しています。以下の操作を行います。
- CMake の最低バージョンを 3.24 に設定します。
toolchain.cmake
という名前のツールチェーンファイルを使用します。CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定します。MyLibrary
という名前のライブラリを検索します。main.cpp
という名前のソースファイルからmy_program
という名前の実行ファイルを作成します。my_program
にMyLibrary
をリンクします。
ポイント
CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定することで、クロスコンパイル先の環境でインストールされた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_PREFIX
と CMAKE_FIND_USE_INSTALL_PREFIX
を併用して、以下の操作を行います。
- CMake の最低バージョンを 3.24 に設定します。
- インストール先のディレクトリを
/usr/local
に設定します。 CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定します。MyLibrary
という名前のライブラリを検索します。main.cpp
という名前のソースファイルからmy_program
という名前の実行ファイルを作成します。my_program
にMyLibrary
をリンクします。
CMAKE_FIND_USE_INSTALL_PREFIX
をTRUE
に設定することで、インストール先のディレクトリだけでなく、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
と比べて機能が制限されている場合があります。