CMake: 開発効率爆上げ! CMAKE_FIND_PACKAGE_SORT_ORDERで探したいライブラリを即座に見つける


この変数は以下のいずれかの値に設定できます。

  • NATURAL: 自然順序を使用してパッケージを並べ替えます。これは、バージョン番号などの数字を文字列としてではなく数値として解釈することを意味します。つまり、libX-1.2.10libX-1.2.9 よりも後に選択されます。
  • NAME: パッケージ名を基準に辞書順に並べ替えます。
  • NONE: デフォルト値です。パッケージの並べ替えは行われず、最初に検出されたパッケージが選択されます。

:

set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
find_package(libX CONFIG)

上記の例では、libX ライブラリの最新バージョンが選択されます。

CMAKE_FIND_PACKAGE_SORT_DIRECTION 変数と併用

CMAKE_FIND_PACKAGE_SORT_ORDER 変数は、CMAKE_FIND_PACKAGE_SORT_DIRECTION 変数と併用して、並べ替えの方向を制御することもできます。CMAKE_FIND_PACKAGE_SORT_DIRECTION 変数は、以下のいずれかの値に設定できます。

  • DESC: 降順で並べ替えます。
  • ASC: 昇順で並べ替えます。

:

set(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
set(CMAKE_FIND_PACKAGE_SORT_DIRECTION DESC)
find_package(libX CONFIG)

上記の例では、libX ライブラリの最新バージョンが選択されます。ただし、名前が最も長いライブラリが最初に選択されます。



set(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
find_package(libX CONFIG)

target_link_libraries(myprogram ${libX_LIBRARIES})

この例では、libX ライブラリの最新バージョンが選択され、myprogram ターゲットにリンクされます。

例 2: パッケージ名を基準に辞書順に並べ替え

set(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
find_package(libA CONFIG)
find_package(libB CONFIG)
find_package(libC CONFIG)

target_link_libraries(myprogram ${libA_LIBRARIES} ${libB_LIBRARIES} ${libC_LIBRARIES})

この例では、libAlibBlibC の順でパッケージが並べ替えられます。

例 3: 降順で並べ替え

set(CMAKE_FIND_PACKAGE_SORT_ORDER NAME)
set(CMAKE_FIND_PACKAGE_SORT_DIRECTION DESC)
find_package(libA CONFIG)
find_package(libB CONFIG)
find_package(libC CONFIG)

target_link_libraries(myprogram ${libA_LIBRARIES} ${libB_LIBRARIES} ${libC_LIBRARIES})

例 4: カスタム並べ替え規則

set(CMAKE_FIND_PACKAGE_SORT_ORDER CUSTOM)
set(CMAKE_FIND_PACKAGE_SORT_CUSTOM_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/sort_packages.sh)
find_package(libA CONFIG)
find_package(libB CONFIG)
find_package(libC CONFIG)

target_link_libraries(myprogram ${libA_LIBRARIES} ${libB_LIBRARIES} ${libC_LIBRARIES})

sort_packages.sh スクリプトの例

#!/bin/bash

# パッケージ名のリストを取得
packages="$@"

# パッケージ名を辞書順に並べ替える
sorted_packages=$(echo "$packages" | sort)

# 並べ替えられたパッケージ名を元のリストに書き戻す
for package in $sorted_packages; do
  echo "$package"
done

このスクリプトは、パッケージ名を辞書順に並べ替えます。必要に応じて、このスクリプトをカスタマイズして、独自の並べ替え規則を実装できます。



独自の find_package() 関数を作成する

find_package() マクロは、CMake によって提供される標準的なマクロですが、独自の関数を作成してパッケージの検出と並べ替えを制御することもできます。これにより、より柔軟な制御とカスタマイズが可能になります。

pkg_config モジュールを使用する

pkg_config モジュールは、パッケージの検出と構成に使用できるもう 1 つのオプションです。pkg_config は、CMAKE_FIND_PACKAGE_SORT_ORDER 変数よりも多くの情報を提供し、より複雑な並べ替え規則を実装することもできます。

手動でパッケージを選択する

find_package() コマンドを使用せずに、手動でパッケージを選択することもできます。これは、特定のバージョンのライブラリを常に使用したい場合に役立ちます。

環境変数を使用する

パッケージの場所を制御するために、環境変数を使用することもできます。これは、複数のビルド環境で同じプロジェクトをビルドする場合に役立ちます。

それぞれの方法の詳細

独自の find_package() 関数を作成する

独自の find_package() 関数を作成するには、以下の手順に従います。

  1. 新しい CMake モジュールを作成します。
  2. find_package() マクロを模倣する関数を作成します。
  3. 関数内で、パッケージの検出と並べ替えを制御するロジックを実装します。
  4. モジュールをプロジェクトに追加し、find_package() の代わりに新しい関数を使用します。

pkg_config モジュールを使用する

pkg_config モジュールを使用するには、以下の手順に従います。

  1. プロジェクトで pkg_config モジュールを有効にします。
  2. find_package() マクロの代わりに pkg_config_use_module() マクロを使用します。
  3. pkg_config ファイルを使用して、パッケージの情報を定義します。

手動でパッケージを選択する

手動でパッケージを選択するには、以下の手順に従います。

  1. target_link_libraries() コマンドを使用して、ライブラリをリンクします。
  2. ライブラリのヘッダーファイルを手動でインクルードします。

環境変数を使用する

環境変数を使用するには、以下の手順に従います。

  1. パッケージの場所を指定する環境変数を設定します。
  2. find_package() マクロ内で、環境変数を使用してパッケージの場所を検索します。

どの方法を選択するか

どの方法を選択するかは、プロジェクトの要件によって異なります。

  • 複数のビルド環境で同じプロジェクトをビルドする必要がある場合は、環境変数を使用するのが最適です。
  • 特定のバージョンのライブラリを常に使用したい場合は、手動でパッケージを選択するのが最適です。
  • 多くのシステムで使用される標準的なパッケージを検出する必要がある場合は、pkg_config モジュールを使用するのが最適です。
  • 柔軟性とカスタマイズ性を重視する場合は、独自の find_package() 関数を作成するのが最適です。