CMake - pkg-config

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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ディレクトリ等)

  • 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変数<パッケージ名>_FOUND0または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}
 )