「CMake - pkg-config」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <code>find_package</code>コマンドは、特定の名前のCMakeスクリプトを検索して、該当のスクリプトを実行するコマンドである。<br> <br> 対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。<br> <code>find_package</code>コマンドは、Module -> Configの順で検索を行う。<br> <br> 具体的な動作は以下の通りである。<br> * Module<br><パ…」)
 
3行目: 3行目:
<br>
<br>
対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。<br>
対象となるCMakeスクリプトは、その役割に応じて、ModuleとConfigの2種類に分類される。<br>
<code>find_package</code>コマンドは、Module -> Configの順で検索を行う。<br>
<code>find_package</code>コマンドは、Module --> Configの順で検索を行う。<br>
<br>
<br>
具体的な動作は以下の通りである。<br>
具体的な動作は以下の通りである。<br>
* Module<br><パッケージ名>.cmakeファイル、または、Find<パッケージ名>.cmakeファイルを検索する。
* Module<br><u><パッケージ名>.cmake</u>ファイル、または、<u>Find<パッケージ名>.cmake</u>ファイルを検索する。
** CMakeキャッシュ変数である変数<code>CMAKE_MODULE_PATH</code>で指定されたパス
** CMakeキャッシュ変数である変数<code>CMAKE_MODULE_PATH</code>で指定されたパス
** CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等)
** CMakeにデフォルトで付いてくるモジュールの配置ディレクトリ (/usr/local/share/cmake/Modulesディレクトリ等)
*: <br>
*: <br>
* Config<br><パッケージ名>Config.cmakeファイル、または、<パッケージ名(小文字)>-config.cmakeファイルを検索する。
* Config<br><u><パッケージ名>Config.cmake</u>ファイル、または、<u><パッケージ名(小文字)>-config.cmake</u>ファイルを検索する。
** CMake変数<code><PackageName>_DIR</code>で指定されたパス
** CMake変数<code><パッケージ名>_DIR</code>で指定されたパス
** CMakeキャッシュ変数である変数<code><パッケージ名>_ROOT</code>で指定されたパス
** CMakeキャッシュ変数である変数<code><パッケージ名>_ROOT</code>で指定されたパス
** 環境変数<code><パッケージ名>_ROOT</code>で指定されたパス
** 環境変数<code><パッケージ名>_ROOT</code>で指定されたパス

2024年4月4日 (木) 06:38時点における版

概要

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ファイルを見つけることができる。