2016-03-05 3 views
6

CMake manual of Qt 5find_packageを使用し、こう述べています。`find_package`でインポートしたターゲットを取得していますか?

輸入ターゲットは、各Qtのモジュール用に作成されます。 target_link_librariesなどのCMakeコマンドでは、Qt5<Module>_LIBRARIESのような変数を使用する代わりに、インポートされたターゲット名を優先する必要があります。

それはQtのための特別なものですかfind_packageインポート対象のすべてのライブラリのを生成するのでしょうか? documentation of find_package in CMake 3.0

と表示されます。パッケージが見つかると、パッケージ固有の情報は、パッケージ自体によって記述された変数とインポートされたターゲットによって提供されます。

そしてmanual for cmake-packagesは言う:

find_packageを使用した結果がインポートターゲットのセット、または情報の関連を構築するために、対応する変数のセットのいずれかです。

しかし、私はドキュメントがインポート対象が作成されていることを述べている別のFindXXX.cmake -scriptを見ていません。

答えて

6

find_packageは、これらの日双頭獣です:

CMakeのではという何をするか、パッケージの二つの形式、今Config-file PackagesFind-module Packages

Source

を直接サポートを提供します実際には?

モジュールモジュールパッケージは、おそらく最もよく知っているものです。彼らは、find_libraryfind_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パッケージを提供します。そうでない場合は、代わりに検索スクリプトを使用してください。

2

実際にはfind_packageの結果を持つ「魔法」はありません。このコマンドは適切なFindXXX.cmakeスクリプトを検索して実行します。

FindスクリプトがXXX_LIBRARY変数を設定した場合、呼び出し元はこの変数を使用できます。

Findスクリプトがインポートされたターゲットを作成した場合、呼び出し元はこれらのターゲットを使用できます。

スクリプトXXX_LIBRARY変数を設定しなかったりインポートターゲットを作成し、どちらも見つけたら...よく、スクリプトの使用方法は、何らかの形で異なっています。

find_packageのドキュメントでは、と表示されています。通常は、の検索スクリプトが使用されています。しかし、どんな場合でも具体的なスクリプトに関するドキュメントを参照する必要があります(このドキュメントは通常、スクリプト自体に含まれています)。

関連する問題