他のソフトウェアのフレームワークとして使用したい独自のヘッダーのみのライブラリを開発しています。デモのターゲットやテストなどのセットアップにCMake
を使用しています。
ただし、ライブラリの依存関係を処理する方法がわかりません。現在、私は次のアプローチを使用しています:
FIND_PACKAGE( foo )
設定がありますconfig/foo.hh.in
foo
のファイルで、パッケージが存在するかどうかを確認します。
#ifndef FOO_HH__
#define FOO_HH__
#cmakedefine HAVE_FOO
#endif
概して CMakeLists.txt
、 私がやります:
CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/include/config/foo.hh.in ${CMAKE_SOURCE_DIR}/include/config/foo.hh )
コードでは、こうすることができます:
#include "config/foo.hh"
#ifdef HAVE_FOO
// Code that is specific to having the `foo` library available
#endif
このアプローチの問題は、onceのみが機能することです。つまり、ライブラリが初めてインストールされ、すべての依存関係がチェックされている場合です。私はnotオプションの依存関係をライブラリに同梱しているので、これが良いアプローチかどうか疑問に思っています。ユーザーがオプションの依存関係をインストールすることを決定した場合はafterライブラリをインストールしますか?この場合、ライブラリの存在を検出できません。
通常、この問題をどのように解決しますか?このアプローチの何が問題になっていますか?
通常、一部のソフトウェアをビルドしてインストールするときは、ソフトウェアを使用するときではなく、ビルドするときに使用できる機能を決定するため、このアプローチは理にかなっていると思います。
とにかく、ソフトウェアのインストールを許可し、後で検出された機能を許可する場合は、次のようなことができると思います(ライブラリのユーザーがCMakeを使用する場合にのみ機能することに注意してください)。
メインのCMakeLists.txtのFIND_PACKAGE(foo)
チェックを削除し、構成ファイルの_#cmakedefine
_を削除します。
まだ行っていない場合は、add_library(INTERFACE)
、export(TARGET)
を使用してライブラリのターゲットをエクスポートします( add_library 、 export を参照)。および install コマンドのドキュメントを参照してください)。
_MyProjectConfig.cmake
_ファイルがない場合は追加します( こちら を参照)。
_MyProjectConfig.cmake
_内で、ターゲットファイルを含めた後、次のようなことができます。
_find_package(foo QUIET)
if(foo_FOUND)
target_compile_definitions(MyTarget INTERFACE HAVE_FOO)
endif()
_
ライブラリのユーザーはターゲットをリンクする必要があり、ユーザーライブラリが構成されているときにライブラリがシステム上で見つかった場合にのみ定義が追加されます。ライブラリは次のように使用できます。
_find_package(MyProject)
add_library(bar [...])
target_link_libraries(bar MyProject::MyTarget)
_