Edited at

find_packageの動作

More than 3 years have passed since last update.

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 オプションで指定したパスのリスト。