2

独立したプロジェクトに使用するいくつかのツールを含むディレクトリがあります。

CommonTools
  + Tool A
  + Tool B
  + Tool C

ツール B はツール A に依存しますが、ツール A はツール B から独立して使用できます。2 つのオプションがあると思います。

  1. ツールをシステム ディレクトリにインストールできます (例: Windows の場合C:\Program Files)。私のプログラムのいくつかは、システムディレクトリに書き込むための十分な権限を持っていないため、出荷されたディレクトリと同じディレクトリで使用されることを意図しているため、これは必ずしも良いことではありません)。さらに、これらのツールを使用するプロジェクトをコンパイルするには、ヘッダー ファイルを見つける必要があります。

  2. それらを見つけるために使用できfind_libraryます。次に、次の問題に遭遇しfind_library(A)ます。実際に A をビルドするまで動作しないため、動作しませんcmake CommonTools(ツール B にはツール A が必要なため)。makeからcmakeを呼び出すこともできますが、それはかなり複雑に見えます...

  3. ツール B にツール A への相対パスを配置しfind_library、他のプロジェクトにのみ使用できます。残念ながら、この相対パスは、CommonTools とツール B のどちらをビルドしているかによって異なります。

これについてどう思いますか?ありがとう!

4

1 に答える 1

1

ワンステップビルドを実行できるようにしたかったので、これが私がやったことです。

  • 現在構築しているモジュールのサブモジュールを、外部の依存関係やサードパーティ ツールと区別しています。各 (サブ) モジュールは、それ自体を構築することのみを担当します。これは、すべての外部依存関係とサードパーティ ツール既にインストールされているか、サーバーからバイナリ + ヘッダー形式で利用できる必要があることを意味します。当然の結果として、欠落している依存関係は、特定のサーバーから利用できるはずのバイナリであることを意味しますが、そうではありません。
  • サブモジュールは を使用して追加されadd_subdirectoryます。つまり、それらのいずれかが利用できない場合、構成手順は明示的なメッセージで失敗します。
  • 外部の依存関係とサードパーティ ツールは、find_package. 場所は、HINTビルドを実行するユーザーが指定する必要があるオプションです (これにより、モジュールの依存関係がユーザーに示されます。いずれかが見つからない場合は、 を使用して指定された場所からバイナリがダウンロードされますExternalProject_Add<module>_FOUND<module>_LIBRARIES&<module>_INCLUDE_DIRS変数CMakeLists.txt ファイルで手動で設定する必要がありますが、サーバー側で適切なディレクトリ レイアウト (例: <module>-<version>-<platform>/include& <module>-<version>-<platform>/binaries) を指定すると、一貫した方法で (例: マクロを使用して) 実行できます。サーバー、構成手順は明示的なメッセージで失敗します。

これはすべて、継続的インテグレーション サーバーが不足している依存関係 (つまり、サーバー上にあるべきなのにバージョン管理されていないコンポーネント、またはバージョン管理下にないサブモジュール) を、ビルド時ではなく構成時に正しく検出することを意味します。 -ステップビルド。

これが他の人に役立つことを願っています。

PS: Google Test ユーザーへのサイドノードとして: 「すべてのユーザーは、インストールされた Google Test ライブラリのコンパイルに使用されたのと同じコンパイラ フラグを使用してテストをコンパイルする必要があるため、モジュールごとに gtestを再コンパイルする必要があります。そうしないと、未定義の動作が発生する可能性があります。異なるコンパイラ フラグを使用して Google Test とテスト コードをコンパイルすると、同じクラス/関数/変数の異なる定義が表示される場合があります)」. つまり、各モジュールには独自のテストが含まれているため、実際には (私の場合)すべてのモジュールExternalProject_Addでコマンドを実行する必要があります。

于 2012-07-09T07:34:43.447 に答える