3

私たちのビルドは非常に遅いです。Linux ではネストされた gnu makefile を使用します。同じソース ツリーから 3 つの異なるターゲットに対して 3 つのビルドを作成します。シンボリック リンクを使用して、3 つの並列ディレクトリ ツリーのそれぞれを順番にポイントします。サブディレクトリ内で make を使用して部分的なビルドを行うことで時間を節約できますが、作業が複数のディレクトリにまたがる場合は、3 つのターゲットのうち少なくとも 1 つをビルドする必要があり、最低でも 45 分かかります。サブディレクトリのみのビルドには、5 ~ 10 分しかかからない場合があります。

このビルドシステムを動かなくなっている可能性がある簡単な確認事項を知っていますか? たとえば、シンボリックリンクに代わるより高速な方法はありますか?

追加: 再帰的なメイクファイルに関する論文を見てきました。現在、多くのメイクファイル (約 800) と 450 万を超えるソース コード行がある Makefile システムをフラット化すると、どのような影響があるかを直接知っている人はいますか? 人々は現在、そのディレクトリで make を使用して、現在のサブディレクトリまたはプロセス (組み込みの Linux ターゲット) だけをビルドできることを楽しんでいます。

最近まで、ビルドが 2 倍の長さ ( wince ) だったことを知りました。その時点で、リリース エンジニアは ccache をデプロイしました。

4

5 に答える 5

4

ビルドを高速化するための考慮事項:

ビルドは I/O バウンドになる傾向があるため、I/O を複数のドライブ/コントローラーまたはマシンに分散させます。たとえば、ソースを 1 つの物理ドライブに置き、ターゲット (ビルド出力) を別の物理ドライブに置き、ビルド ツール (.NET、Java、Ant など) を含む物理ドライブからこれらのドライブを分離します。 ) および OS を含む物理ドライブから。

多くの場合、ビルドは非同期で実行できるため、個別のビルド マシン (継続的インテグレーション サーバー) を確立して使用します。これは特に、メトリクスの計算、ドキュメントの生成、リリース候補の生成、および開発者のワークステーションで時間がかかりすぎる、または必要のないその他すべての場合に使用します。

多くの場合、ビルド ツールには多くのプロセスの起動/シャットダウン オーバーヘッドが伴うため、そのオーバーヘッドを最小限に抑えるツール、スクリプト、および手順を選択してください。これは、他のツールをサブプロセスとして呼び出す傾向がある make や Ant などのツールに特に当てはまります。たとえば、私は Python ベースのビルド システムに移行して、ほとんどのビルド処理を 1 つのプロセスから実行できるようにしながら、必要に応じて他のプロセスを簡単に生成できるようにしています。

ビルド ツールは、多くの場合、何もしないことを検出してビルド ステップをスキップすることをサポートしています (最後のコンパイルからソースが変更されていないため、コンパイルしないでください)。ただし、ビルド ステップをスキップするためのサポートは、多くの場合、デフォルトではアクティブになっていません。具体的に呼び出す必要がある場合があります。たとえば、コンパイラは通常これを自動的に行いますが、コード生成は行いません。もちろん、これに対する当然の帰結は、可能な場合はインクリメンタル ビルドを使用することです (ワークステーションでの開発中は、「動作する」限り)。

ビルド スクリプトはすぐに非常に複雑になる可能性があるため、時間をかけて単純化してください。最初に、ビルドを個別のプロジェクトに分割し、それぞれが JAR、DLL、または EXE などの「アーティファクト」を 1 つだけビルドします。これにより、現時点では必要のない長いビルドを呼び出さないようにするだけで、多くの時間を節約できます。第二に、別のプロジェクトに到達しないことで、すべてのプロジェクトのビルドを単純化します。ソースではなく、ビルド アーティファクトを介して常にプロジェクトの依存関係を作成します。これにより、各プロジェクトがスタンドアロンになり、「スーパー」スクリプトを使用してプロジェクトのさまざまなサブセットを自由に構築できます。

最後に、ビルド インフラストラクチャを独自の実際のプロジェクトとして扱います。バグや機能のリクエストをログに記録し、バージョンを管理し、公式リリースを実行し、無期限に改良を続けます。後付けとしてではなく、不可欠な製品として扱います。ビルドは、健全なプロジェクトの生命線です。気にかければ、パンを節約できます。

于 2008-11-25T19:32:23.057 に答える
4

あなたのケースでシンボリックリンクが必要な理由がわかりません。同じソースから複数のターゲットを作成する場合は、中間ファイルとターゲット ファイルを別々のディレクトリに配置してみてください。

また、ネストされたmakefileの代わりに、 jamなどを使用することもできます。複数の CPU がある場合は、 n を試すことができます。nmake -j CPUの数 + 1 です。

于 2008-11-25T18:34:37.883 に答える
1

ネストされた makefile についての言及は、 「再帰的な Make を有害と見なす」で提案されているアプローチが役立つ可能性があることを示唆しています。要約から:

分析によると、この問題は、ビルドを別々のサブセットに人為的に分割したことに起因することが示されています。これにより、説明した症状が発生します。症状を回避するには、分離を回避するだけで十分です。プロジェクト全体で単一の Makefile を使用します。

(単一の論理メイクファイルは、複数の物理ファイルで構成できます。)

于 2008-11-25T19:42:29.247 に答える
1

コンパイルに使用できるコンピューターが複数ある場合は、distccも使用できます。これにより、ビルドプロセスが複数のコンピューターに分散され、make -j 2 と組み合わせてさらに高速化されるはずです。

プロジェクトのサイズによっては、ボトルネックが実際にはコンパイラにある可能性があり (つまり、-O2 または -O3 を有効にしている)、ソース コードを縮小するか、未使用の #include を削除する以外にできることはあまりないかもしれません。ファイル。

于 2008-11-25T18:40:56.593 に答える
0

アイスクリームを使用しています。ビルド中に時間をつぶすためではなく、ビルド プロセスを高速化するためです。オフィス内の全PCの空きCPU時間を利用する分散コンパイル環境です。クロスコンパイル環境があるため、セットアップは非常に複雑ですが、クロスコンパイルしていない場合は、はるかに簡単になる可能性があります。 http://en.opensuse.org/アイスクリーム

于 2008-11-25T18:41:19.417 に答える