find_packageの動作

  • 33
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

CMake のマニュアルからの抄訳です。

デバッグのお供に

下記のコマンドで、find_packageが<package>-config.cmake を検索したパスを表示できる。
buildディレクトリを削除して、設定値のキャッシュを消す必要があるかもしれない。

cmake .. -DCMAKE_FIND_DEBUG_MODE=1

.. の部分は、ソースツリーの場所にあわせて変更すること。

find_package の検索ロジック

find_package には Module モードと Config モードの2種類のモードがある。
通常は、まず Module モードで検索してから、 Config モードにフォールバックする。

Module モード

Find<package>.cmake を検索する。

  1. CMakeのインストール先 (e.g. /usr/local/share/cmake-2.8/Modules)
  2. 環境変数 CMAKE_MODULE_PATH に設定したパス

Config モード

後述の規定のディレクトリから、<package>Config.cmake または <lower-case-package>-config.cmake を検索する。

<package>_DIR 変数で検索対象のパスを指定できる。

検索対象のディレクトリ
  • <prefix> については後述。
  • <name> は、<package> または NAMES オプションで指定した名前
Windows
  • <prefix>/
  • <prefix>/(cmake|CMake)
  • <prefix>/<name>*/
  • <prefix>/<name>*/(cmake|CMake)
Linux
  • <prefix>/(lib/<arch>|lib|share)/cmake/<name*>/
  • <prefix>/(lib/<arch>|lib|share)/<name*>/
  • <prefix>/(lib/<arch>|lib|share)/<name*>/cmake/
<prefix> に使用されるパス

以下のパスが <prefix> として使用される。

  1. cmakeのキャッシュ (cmake のコマンドライン引数に -DVAR=value 形式で指定する)。 コマンドに NO_CMAKE_PATH オプションを指定するとスキップされる。

    • CMAKE_PREFIX_PATH
    • CMAKE_FRAMEWORK_PATH
    • CMAKE_APPBUNDLE_PATH
  2. cmake 環境変数。コマンドに NO_CMAKE_ENVIRONTMENT_PATH オプションを指定するとスキップされる。

    • <package>_DIR
    • CMAKE_PREFIX_PATH
    • CMAKE_FRAMEWORK_PATH
    • CMAKE_APPBUNDLE_PATH
  3. HINTS オプションで指定したパス

  4. システムの環境変数。NO_SYSTEM_ENVIRONMENT_PATH を指定するとスキップされる。
    環境変数 PATH のエントリが、/bin/sbin で終わる場合はその親ディレクトリに変換される。

  5. cmake-gui で設定したプロジェクトビルドツリー (Windows only)

  6. User Package Registry に格納されたパス。NO_CMAKE_PACKAGE_REGISTRY を指定するとスキップされる。

  7. cmakeのシステムパス

  • CMAKE_SYSTEM_PREFIX_PATH
  • CMAKE_SYSTEM_FRAMEWORK_PATH
  • CMAKE_SYSTEM_APPBUNDLE_PATH
  1. System Package Registry に格納されたパス
    NO_CMAKE_SYSTEM_PACKAGE_REGISTRY を指定するとスキップされる。

  2. PATHS オプションで指定したパスのリスト。