CMake - pkg-config
概要
find_package
コマンドは、特定の名前のCMakeスクリプトを検索して、該当のスクリプトを実行するコマンドである。
find_package
コマンドは、外部ライブラリやパッケージをCMakeプロジェクトに統合するための強力なツールであるため、
正しく使用することにより、依存関係を簡単に管理して、プロジェクトの構築をスムーズに進めることができる。
対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。
find_package
コマンドは、Module --> Configの順で検索を行う。
具体的な動作は以下の通りである。
- Module
<パッケージ名>.cmakeファイル、または、Find<パッケージ名>.cmakeファイルを検索する。- CMakeキャッシュ変数である変数
CMAKE_MODULE_PATH
で指定されたパス - CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等)
- CMakeキャッシュ変数である変数
- Config
<パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルを検索する。- CMake変数
<パッケージ名>_DIR
で指定されたパス - CMakeキャッシュ変数である変数
<パッケージ名>_ROOT
で指定されたパス - 環境変数
<パッケージ名>_ROOT
で指定されたパス - CMakeキャッシュ変数である変数
CMAKE_PREFIX_PATH
、変数CMAKE_FRAMEWORK_PATH
、変数CMAKE_APPBUNDLE_PATH
で指定されたパス - 環境変数
<パッケージ名>_DIR
、環境変数CMAKE_PREFIX_PATH
、環境変数CMAKE_FRAMEWORK_PATH
、環境変数CMAKE_APPBUNDLE_PATH
で指定されたパス - 環境変数
PATH
で指定されたパス (binディレクトリおよびsbinディレクトリで終わるディレクトリの場合は、その親ディレクトリに読み替える) - その他
- CMake変数
なお、コマンド終了時において、CMake変数<パッケージ名>_FOUND
に0
または1
(FALSE
またはTRUE
)が格納されるため、
正常に検索できたかどうかを条件分岐として記述することもできる。
Module (CMakeスクリプト)
Moduleは、以下の2種類に分類される。
- Utility Modules
- よく使用するCMake関数をまとめたもの。
- 例えば、CheckLanguage.cmake(あるプログラミング言語の開発ツールがインストールされているか確認するための機能をまとめたもの)等がある。
- Utility ModulesのCMakeスクリプトを読み込む時、
check_language
コマンド、get_bundle_main_executable
コマンド等の関数が定義されるため、 - それらを呼び出すことで機能を使用することができる。
- Find Modules
- 外部ライブラリの情報を収集するものであり、ファイル名はFind<パッケージ名>.cmakeファイルである。
- 例えば、C++で記述された外部ライブラリをリンクする場合、ヘッダファイルのディレクトリ、ライブラリファイルのディレクトリ、ライブラリファイル名の3つの情報が必要になる。
- これらの情報を自動的に収集するものがFind Modulesである。
- CMakeでは、Boost、BLAS、GLEW、OpenGL、X11、Qt4等のライブラリのFind Modulesがデフォルトで用意されている。
- ほとんどのFind Modulesは、以下に示すようなCMake変数に値が自動的に代入される。
- 変数
<パッケージ名>_INCLUDE_DIRS
- インクルードディレクトリのパス
- 変数
<パッケージ名>_LIBRARY_DIRS
- ライブラリファイルがあるディレクトリのパス
- 変数
<パッケージ名>_LIBRARIES
- ライブラリファイル名のリスト
- 変数
<パッケージ名>_DEFINITIONS
- コンパイル時の
definition
フラグ
- コンパイル時の
- 変数
find_package
コマンドを使用することにより、上記の変数は自動的に代入されるため、その変数をtarget_include_directories
コマンド等に設定を記述する。- ただし、上記の変数名は必ずしもこの通りになっているわけではないため、ライブラリの情報を変数にまとめるのではなくターゲット(ライブラリ)を作成してそのプロパティにまとめる場合もある。
- そのため、各ライブラリのFind Modulesを確認することが必要である。
CMakeでは、初期状態でいくつかのModuleがインストールされている。
Moduleの一覧は、CMakeの公式Webサイトから確認することができる。
また、Moduleが存在しないライブラリでは、開発者がModuleを作成することもできる。
Config (CMakeスクリプト)
Configファイルは、CMakeプロジェクトをビルドしてライブラリをインストールした時に生成される設定ファイルである。
ファイル名は、<パッケージ名>Config.cmake
ファイル、または、<パッケージ名(小文字)>-config.cmake
ファイルである。
ライブラリ情報を提供する点ではFindモジュールと同様であるが、Configファイルはライブラリの開発元が直接提供している設定ファイルである。
ライブラリをインストールした時、cmakeディレクトリやshareディレクトリの中に含まれていることが多い。
Findモジュールと同様、多くのConfigファイルは以下に示すようなCMake変数が存在する。
また、これらの情報を1つのターゲットにまとめている場合もある。
- 変数
<パッケージ名>_INCLUDE_DIRS
- インクルードディレクトリのパス
- 変数
<パッケージ名>_LIBRARY_DIRS
- ライブラリファイルがあるディレクトリのパス
- 変数
<パッケージ名>_LIBRARIES
- ライブラリファイル名のリスト
- 変数
<パッケージ名>_DEFINITIONS
- コンパイル時の
definition
フラグ
- コンパイル時の
Configファイルを使用する場合、開発元が公開しているドキュメントやConfigファイルの内容から、各変数名や各ターゲット名を確認する必要がある。
Linuxにおいて、Configファイルの場所は以下に示すようなディレクトリに配置される。
また、初期設定より、/usr/binディレクトリは環境変数PATH
に設定されているため、CMakeは自動的にConfigファイルを見つけることができる。
- /usr/lib64/cmake/<パッケージ名>
- /usr/share/cmake/<パッケージ名>
したがって、Linuxでは、パッケージ管理システムからインストールしたライブラリは、find_package
コマンドで見つけることができる。
もし、ライブラリにConfigファイルが付属していない場合、開発者自身でFindモジュールを作成する必要がある。
また、他の場所にライブラリをインストールしている場合は、CMakeキャッシュ変数<パッケージ名>_DIR
にライブラリのパスを設定することにより、Configファイルを見つけることができる。
find_packageコマンド
find_packageコマンドとは
find_package
コマンドは、外部パッケージの設定を検索して、それをプロジェクトに取り込むために使用する。
一般的に、ライブラリのヘッダファイルやリンクするためのライブラリファイルの位置を特定する。
このコマンドは、CMakeモジュールやパッケージ構成ファイルを利用して動作する。
基本構文
find_package(<パッケージ名> <バージョン (省略可能)> REQUIRED <コンポーネント名 (省略可能)>)
- パッケージ名
- 検索するパッケージの名前
- バージョン
- 必要なパッケージのバージョン (省略可能)
- REQUIRED
- パッケージが見つからない場合にエラーを発生させる。
- コンポーネント名
- 特定のコンポーネント名を指定する。 (省略可能)
使用例
以下の例では、find_package
コマンドを使用して、OpenCVライブラリを検索している。
この例では、OpenCVが見つからない場合は、CMakeはエラーを発生させる。
find_package(OpenCV REQUIRED)
バージョンの指定
特定のバージョンのパッケージが必要な場合、バージョンを指定することができる。
以下の例では、バージョン 4.5以上のOpenCVが必要である。
find_package(OpenCV 4.5 REQUIRED)
コンポーネントの指定
パッケージが複数のコンポーネントを提供している場合、必要なコンポーネントを指定することができる。
以下の例では、OpenCVのcoreとimgprocコンポーネントを必要とする。
find_package(OpenCV REQUIRED core imgproc)
検出結果の使用
find_package
コマンドが成功した場合は、一般的に、CMake変数が設定される。
例えば、OpenCVの場合、CMake変数OpenCV_INCLUDE_DIRSやOpenCV_LIBS等の変数が設定される。
- OpenCV_INCLUDE_DIRS
- OpenCVのヘッダファイルのディレクトリ
- OpenCV_LIBS
- OpenCVのリンクするライブラリ
target_include_directories(<ターゲット名>
PRIVATE
${OpenCV_INCLUDE_DIRS}
)
target_link_libraries(<ターゲット名>
PRIVATE
${OpenCV_LIBS}
)