CMake を使用して構築された、多くのサードパーティの依存関係を持つ大規模なクロスプラットフォーム C++ プロジェクトの物理 (ディスク上) レイアウトを再編成中です。
十分に確立されたパッケージ マネージャーが存在しないプラットフォームである Windows をサポートする必要があるため、ソース ツリーに依存するサード パーティ製ライブラリを含めることをかなり前に決定しました。ただし、Linux や Mac OS X など、当社がサポートする他のプラットフォームでは、これらのサードパーティ ライブラリの多くがパッケージとして利用できるか、システムに既に存在しており、CMake で簡単に見つけることができます。
現在のプロジェクトのレイアウトは次のとおりです。
root/
src/
3rd-party-lib1/ (build system modified to output to build/)
3rd-party-lib2/ (build system modified to output to build/)
project-module1/ (our own code)
project-module2/ (our own code)
build/ (CMake is invoked from here)
3rd-party-lib1-bin/
3rd-party-lib2-bin/
サードパーティのライブラリは微調整されているため、ビルド時にバイナリが に出力されroot/build/<lib>/
ます。
このレイアウトには複数の問題があります。
- サード パーティのライブラリは 100% オリジナルではなくなりました。これにより、それらの更新が必要以上に難しくなります。
src/
ディレクトリには、弊社独自のコードとサード パーティのコードが混在しているため、混乱を招きます。- ディレクトリは
src/
非常に大きいです。サード パーティのライブラリが含まれているためsrc/
、元のソース コードの実際の量に比べて非常に大きく、独自のコードのバックアップが必要以上に複雑になります (src/
ディレクトリ全体をアーカイブすることはできなくなりました)。 - プロジェクト リポジトリ (Git) は、サード パーティのライブラリ (ドキュメント、テスト データなど、ソース以外のファイルが多数含まれている可能性があります) が含まれているため、非常に大きく、更新するたびに大きくなります。残念ながら、新しいリポジトリで再起動することを決定しない限り、ここに戻る方法はありません (残念ながらコミット履歴全体が失われます)。
- 含まれているサードパーティ ライブラリ (zlib、libpng など) の多くは、Linux または Mac OS X でプロジェクトをビルドするユーザーにはまったく必要ありませんが、Windows ユーザーにとっては大幅に簡素化されます。
別のレイアウトは次のようになります。
root/
3rdparty/
3rd-party-lib1/ (100% original, contains built artifacts)
3rd-party-lib2/ (100% original, contains built artifacts)
src/
project-module1/ (our own code)
project-module2/ (our own code)
build/ (CMake is invoked from here)
CMake ファイルを変更して、各ライブラリの適切な場所でサード パーティのヘッダー ファイルとライブラリを探す必要があります。
ネイティブのクロス プラットフォーム プロジェクトでのサード パーティ ライブラリの処理に関するベスト プラクティスは何ですか? それぞれのプラットフォームで、開発者にとって最も驚くべきビルド エクスペリエンスにつながるレイアウトはどれですか? 既存のプロジェクトからの成功したレイアウトの具体例も歓迎します。