find_package
は、これらの日双頭獣です:
CMakeのではという何をするか、パッケージの二つの形式、今Config-file Packages とFind-module Packages
Source
を直接サポートを提供します実際には?
モジュールモジュールパッケージは、おそらく最もよく知っているものです。彼らは、find_library
とfind_path
のような関数呼び出しを行い、ライブラリの場所を特定するCMakeコードのスクリプト(this oneなど)を実行します。
このアプローチの大きな利点は、非常に一般的なことです。ファイルシステムに何かがある限り、それを見つけることができます。大きな欠点は、それが何かの物理的な場所よりも多くの情報を提供しないことです。つまり、find-module操作の結果は通常、ファイルシステムのパスの束に過ぎません。つまり、推移的な依存関係や複数のビルド構成のようなモデリング作業は、むしろ困難です。
見つけようとしているものが、そのものである場合は、がCMakeで構築されています。その場合、ビルドスクリプトにモデル化された一連のものが既にあります。これは、検索スクリプトを慎重に再構築して、下流のプロジェクトで利用できるようにする必要があります。
設定ファイルパッケージがここにあります。 find-modulesとは異なり、スクリプトを実行した結果は単なるパスではなく、代わりに完全に機能的なCMakeターゲットを作成します。依存プロジェクトは、その同じプロジェクトの一部として依存関係が構築されているように見えます。
非常に便利な方法で、はるかに多くの情報を転送できます。明らかな欠点は、config-fileスクリプトがfindスクリプトよりはるかに複雑であることです。したがって、あなたは自分でそれを書いてはいけませんが、CMakeはあなたのためにそれらを生成してください。あるいは、デプロイメントの一環としてconfig-fileを提供する依存関係を持っていれば、単にfind_package
コールをロードすることができます。 Qt5とまったく同じです。
これはつまり、自分のプロジェクトがライブラリの場合は、generating a config file as part of the build processと考えてください。これはCMakeのもっとも単純な機能ではありませんが、結果はかなり強力です。
検索モジュールスタイル
find_package(foo)
target_link_libraries(bar ${FOO_LIBRARIES})
target_include_directories(bar ${FOO_INCLUDE_DIR})
# [...] potentially lots of other stuff that has to be set manually
コンフィグファイル形式
find_package(foo)
target_link_libraries(bar foo)
# magic!
:ここ
2つのアプローチは、一般的にCMakeのコード内でどのように見えるかの簡単な比較です
tl; dr:常にconfig-fiを優先しますleパッケージを提供します。そうでない場合は、代わりに検索スクリプトを使用してください。