Help us understand the problem. What is going on with this article?

find_packageの動作

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away