2017-07-05 23 views
3

私のCMakeライブラリMyLibraryは、非標準のFindOtherLibrary.cmakeでインポートするOtherLibraryの依存関係を持っています。CMakeライブラリをインストールする:依存関係のモジュールを見つける

マイライブラリには、公にOtherLibraryによって異なります

target_link_libraries(MyLibrary PUBLIC OtherLibrary::OtherLibrary) 

私は(MyLibraryConfig.cmakeと一緒に)MyLibraryをインストールし、ユーザーがそれとリンクしたい場合には、彼らはそのためOtherLibraryをインポートする必要があります。

MyLibrary沿っFindOtherLibrary.cmakeを配布する方法に関する良い習慣はありますか?それは

include(CMakeFindDependencyMacro) 
find_dependency(OtherLibrary) 

のようなものが含まれており、FindOtherLibrary.cmakeがどこにあるか知っている場合


理想的には、一つは、インストール設定ファイルMyLibraryConfig.cmakeから自動的にOtherLibraryをインポートすることにより、MyLibraryのユーザーのために物事をより簡単にすることができます。

これはすべて可能ですか?

+0

問題を理解できません。 'MyLibraryConfig.cmake 'と一緒に' MyLibrary 'をインストールすると、あなたの設定ファイル**にはあなたのライブラリや他のライブラリへのパスと適切な関係が含まれています。したがって、ユーザーが 'MyLibrary'ターゲットとリンクすると、' OtherLibrary'と自動的にリンクします。 'FindOtherLibrary.cmake'スクリプトは必要ありません。 – Tsyvarev

+0

@Tsyvarev 'OtherLibrary'のパスがハードコーディングされている限り、正しいと思います。しかし、 'FindOtherLibrary.cmake'がインポートされたターゲットを定義していれば、' MyLibrary'のユーザは 'OtherLibrary'を自分で見つけることができなければなりません。 – oLen

+0

ハードコードされたパスを必要としない場合は、 'MyLibraryConfig.cmake'の代わりに' FindMyLibrary.cmake'スクリプトを提供する必要があります。あなたのライブラリユーザの作業には、そのスクリプトで彼(彼女)のプロジェクトを出荷する必要があります。また、あなたがdocsで記述した他のすべてのスクリプトと一緒に* CMAKE_MODULE_PATH *を調整します。だから、 'FindMyLibrary.cmake'と一緒に' FindOtherLibrary.cmake'を提供することができます。 – Tsyvarev

答えて

1

私は私の質問に対する解決策を見つけ出しました。

原則として、私は何を提案していますが、自動化された方法で行います。私のライブラリのエンドユーザーは、FindOtherLibrary.cmakeを設定する必要はありません。それはMyLibraryConfig.cmakeによって自動的にインポートされます。

そうするために、私はMyLibraryConfig.cmake沿っFindOtherLibrary.cmakeをインストール:

install(FILES 
      /path/to/MyLibraryConfig.cmake 
     DESTINATION 
      lib/cmake/MyLibrary 
     ) 
install(FILES 
      /path/to/FindOtherLibrary.cmake 
     DESTINATION 
      lib/cmake/MyLibrary/Modules 
     ) 

そしてMyLibraryConfig.cmakeで、私はそれをインポートする方法を設定する:それはないですので、私は変数CMAKE_MODULE_PATHを設定

include(CMakeFindDependencyMacro) 
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/Modules/") 
find_dependency(OtherLibrary REQUIRED) 

注意検索モジュールの場所をfind_packageまたはfind_dependencyに指定することができます(設定モードでのみ動作します)。

+0

これらの行( 'find_dependency'など)を設定ファイルにどのように追加しましたか?手動で追加しましたか?それをCMakeListsから追加する方法はありますか? – user3667089

+1

私はそれを手動で追加しました。私の知る限り、それを自動的に行う方法はありません。 – oLen

1

モジュールモードfind_package()の "推移的"動作はサポートされていません。それはあなたがあなたに利用できる持っていない情報を下流CMakeのモジュールのパスを変更する必要があるため

実際に、私はそれも可能であるとは考えていません。これは、コンフィグモードfind_package()hereを参照)がある理由の1つです。

あなたのライブラリのユーザーは、FindModuleライブラリに依存しているので、FindModuleスクリプトのコピーを取得してCMakeモジュールのパスに追加する方法を知っているだけです。これは通常、文書化によって行われます。 FindModuleを使用するライブラリの作者は、一般的な方法でエンドユーザのプロセスをショートカットすることはできません。したがって、そのようなプロセスのための「良い習慣」はありません。

そうでなければ、良い習慣は唯一の非cmakeのプロジェクトのためFindModulesを使用し、CMakeのプロジェクトのためConfig.cmakeを使用することです。依存するCMakeライブラリにConfig.cmakeがない場合は、不運になります(Bug/IssueレポートでCMakeをサポートする必要があることを伝えてください)。

関連する問題