初めての CMake Modules: FindPkgConfig で外部ライブラリを使いこなす

2024-04-02

CMake Modules における FindPkgConfig の詳細解説

この解説では、FindPkgConfig の仕組み、使用方法、オプション、および高度な使い方について詳しく説明します。

FindPkgConfig は、CMake モジュールの一つであり、以下の機能を提供します。

  • pkg-config との連携: インストール済みパッケージの情報を検索し、解析します。
  • ビルド情報の自動設定: ヘッダーファイル、ライブラリファイル、リンカーオプションなどの情報を設定します。
  • 依存関係の管理: プロジェクトに必要な依存関係を自動的に解決します。

FindPkgConfig は、以下の利点があります。

  • 簡便性: 手動で設定ファイルを編集する必要がなくなり、ビルド工程を簡略化できます。
  • 移植性: プラットフォームや環境に依存せずに、プロジェクトをビルドできます。
  • 信頼性: 設定ミスによるエラーを減らすことができます。

1 基本的な使い方

FindPkgConfig を使用するには、CMakeLists.txt ファイルに以下のコマンドを追加します。

find_package(PkgName [REQUIRED] [QUIET])
  • PkgName: 検索するパッケージの名前
  • REQUIRED: オプション。指定すると、パッケージが見つからない場合にエラーが発生します。
  • QUIET: オプション。指定すると、検索結果のメッセージを出力しません。

例:

find_package(SDL2 REQUIRED)

このコマンドは、SDL2 パッケージを検索し、見つかった場合は以下の情報を設定します。

  • SDL2_FOUND: 変数。パッケージが見つかった場合は TRUE に設定されます。
  • SDL2_INCLUDE_DIRS: 変数。SDL2 のヘッダーファイルのディレクトリパス
  • SDL2_LIBRARIES: 変数。SDL2 のライブラリファイル

これらの変数は、プロジェクトのソースコードで直接使用できます。

2 詳細なオプション

FindPkgConfig には、以下のオプションがあります。

  • CONFIG: パッケージの構成オプションを指定します。
  • COMPONENTS: パッケージのコンポーネントを指定します。
  • NO_POLICY_SCOPE: ポリシースコープを無効にします。
  • EXACT_VERSION: バージョンを厳密に一致させるかどうかを指定します。

例:

find_package(SDL2 REQUIRED CONFIG=static COMPONENTS=gfx)

このコマンドは、SDL2 パッケージの静的ライブラリと gfx コンポーネントを検索します。

高度な使い方

1 複数のバージョンを扱う

FindPkgConfig は、複数のバージョンのパッケージを扱うことができます。

find_package(PkgName [MAJOR.MINOR] [EXACT_VERSION])
  • MAJOR.MINOR: 検索するパッケージのバージョン

例:

find_package(Qt5 5.12 EXACT_VERSION)

このコマンドは、Qt5 のバージョン 5.12 を検索します。

2 モジュールの作成

FindPkgConfig モジュールを作成することで、独自の検索ロジックを実装できます。

詳細は、CMake のドキュメントを参照してください。

まとめ

FindPkgConfig は、CMake Modules における強力なツールです。 理解して使いこなすことで、プロジェクトのビルドを効率化できます。



FindPkgConfig のサンプルコード

基本的なサンプル

find_package(SDL2 REQUIRED)

# SDL2 のヘッダーファイルのインクルード
include_directories(${SDL2_INCLUDE_DIRS})

# SDL2 のライブラリとのリンク
link_libraries(${SDL2_LIBRARIES})

バージョン指定

find_package(Qt5 5.12 EXACT_VERSION)

# Qt5 のヘッダーファイルのインクルード
include_directories(${Qt5_INCLUDE_DIRS})

# Qt5 のライブラリとのリンク
link_libraries(${Qt5_LIBRARIES})

コンポーネント指定

find_package(SDL2 REQUIRED CONFIG=static COMPONENTS=gfx)

# SDL2 の静的ライブラリとのリンク
link_libraries(${SDL2_LIBRARIES})

モジュールの作成

# FindPkgConfig モジュールを作成

set(MODULE_NAME MyModule)

# モジュールファイルのパス
set(MODULE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${MODULE_NAME}.cmake)

# モジュールの作成
add_custom_target(${MODULE_NAME} ALL
  COMMAND ${CMAKE_COMMAND} -E copy
    ${CMAKE_CURRENT_SOURCE_DIR}/Find${MODULE_NAME}.cmake
    ${CMAKE_BINARY_DIR}/Modules/${MODULE_NAME}.cmake)

# モジュールの使用
find_package(${MODULE_NAME} REQUIRED)

# モジュールによって設定された変数
message(${MYMODULE_FOUND})
message(${MYMODULE_INCLUDE_DIRS})
message(${MYMODULE_LIBRARIES})

補足

FindPkgConfig に関するご質問は、お気軽にお尋ねください。



CMakeで外部ライブラリを扱うその他の方法

手動設定

FindPkgConfig を使用せずに、以下の情報を手動で設定できます。

  • ヘッダーファイルのインクルードパス
  • ライブラリファイルのパス
  • リンカーオプション

この方法は、比較的単純なプロジェクトの場合に有効です。

CMake モジュールの作成

FindPkgConfig のような独自の CMake モジュールを作成できます。

この方法は、複雑なプロジェクトや、特定のニーズを満たす必要がある場合に有効です。

サードパーティ製のツール

CPack や Conan などのサードパーティ製のツールを使用して、外部ライブラリを管理できます。

これらのツールは、プロジェクトの依存関係を自動的にダウンロード、インストール、設定することができます。

それぞれの方法の比較

方法利点欠点
FindPkgConfig簡便性、移植性バージョン管理が複雑な場合がある
手動設定柔軟性設定ミスが発生しやすい
CMake モジュールの作成柔軟性、拡張性開発コストが高い
サードパーティ製のツール簡便性、自動化ツール固有の知識が必要

どの方法を選択するかは、プロジェクトの規模、複雑性、およびニーズによって異なります。

  • シンプルなプロジェクトの場合は、FindPkgConfig または手動設定が適切です。
  • 複雑なプロジェクトや、特定のニーズを満たす必要がある場合は、CMake モジュールの作成またはサードパーティ製のツールの使用を検討してください。

これらの方法に関するご質問は、お気軽にお尋ねください。




CMakeコマンド mark_as_advanced() の詳細解説

mark_as_advanced() は、CMakeプロジェクトで特定のキャッシュ変数を "詳細設定" としてマークするために使用されるコマンドです。このコマンドによって、GUI ツールでこれらの変数はデフォルトでは表示されなくなり、ユーザーは "詳細設定" オプションを有効にするまで編集できなくなります。



C++標準ライブラリ、テンプレートエンジン、シェルスクリプト... string()コマンドの代替方法を徹底比較

CMakeのstring()コマンドは、文字列処理を行うための強力なツールです。C++のstd::stringのような機能に加え、CMake特有の便利な機能も備えています。主な機能文字列の連結、分割、置換、比較大文字・小文字変換部分文字列の抽出


CMake の if() コマンド: デバッグとトラブルシューティング

構文条件式if() コマンドの引数には、条件式を指定します。条件式は、以下のいずれかの形式で記述できます。変数の比較: <variable> <operator> <value>コマンドの存在チェック: COMMAND <command-name>


CMake: find_library()とtarget_link_directories()の連携

target_link_directories()コマンドは、CMakeプロジェクト内のターゲットに対して、リンカがライブラリを検索するディレクトリを指定するために使用されます。これは、ターゲットがリンクするライブラリが標準の検索パスに存在しない場合に特に重要です。


プログラミング初心者でもわかる!CMake の "set_directory_properties()" コマンドの使い方

set_directory_properties() コマンドは、CMakeプロジェクト内のディレクトリとサブディレクトリにプロパティを設定するために使用されます。これらのプロパティは、ビルドプロセス、インストール、その他の CMake 動作を制御するために使用できます。



FindRTIモジュール vs 手動設定:CMakeでRTIを使う際の比較

FindRTI モジュールは、CMake プロジェクトで HLA 標準に準拠した RTI (Run-Time Infrastructure) を簡単に検出して利用できるようにするモジュールです。このモジュールを使用することで、プロジェクト内で RTI のインストール場所やヘッダーファイル、ライブラリを自動的に設定できます。


CMake で C++/CLI プログラミング: .NET Framework バージョン設定のベストプラクティス

"VS_DOTNET_TARGET_FRAMEWORK_VERSION" プロパティは、CMake で C++/CLI プロジェクトをビルドする際に、ターゲットとなる . NET Framework のバージョンを指定するために使用されます。これは、Visual Studio ソリューション (.sln) ファイルとプロジェクト (.vcxproj) ファイルの生成に影響を与えます。


Android NDK でのクロスコンパイルを成功させる CMAKE_LANG_ANDROID_TOOLCHAIN_SUFFIX 設定方法

例:ホストプラットフォームがx86_64-linux-gnuの場合、CMAKE_LANG_ANDROID_TOOLCHAIN_SUFFIXは-x86_64になります。ホストプラットフォームがarmv7-linux-androideabiの場合、CMAKE_LANG_ANDROID_TOOLCHAIN_SUFFIXは-armになります。


CMake find_file() コマンドの代替方法:もっと柔軟なファイル検索

<variable>: 検索結果を格納する CMake 変数<file_names>: 検索するファイル名のリスト (スペース区切り)<path_list>: 検索するパス名のリスト (スペース区切り)<options>: 検索オプション (後述)


CMakeLists.txtスッキリ化: CMAKE_AUTOMOC変数でmocツール処理を自動化

概要CMAKE_AUTOMOC は、CMakeにおける重要な変数の一つであり、Qtプロジェクトにおいて moc ツールを自動的に処理するかどうかを制御します。moc ツールは、Qtメタオブジェクトコンパイラと呼ばれるものであり、Qtメタオブジェクトシステムに必要な C++ ヘッダーファイルを生成します。