依存関係について
注意: Microsoft 社のサポート終了にともない、Visual Studio 2008 以前のバージョンは Incredibuild のサポート対象外となりました。
Incredibuild は複数のファイルやプロジェクトを同時にビルドするため、ビルド時の潜在的な問題やエラーを回避するためには、ソリューション/ワークスペース内のファイルやプロジェクト間の依存関係を正しく定義しなければなります。
このページをよく読み理解しておくことで、依存関係の問題が発生した場合にトラブルシューティングにかかる時間を短縮できるでしょう。
プロジェクト レベルの依存関係
ソースファイルの依存関係
ソースファイルの依存関係は自動的に処理されます。インクリメンタル ビルドを実行すると、古いファイルが直接コンパイルされるか、(#include や #import ステートメントなどを使って) 古いファイルが参照されます。
プリコンパイル済みヘッダー
プリコンパイル済みヘッダーを使用するファイルは、ヘッダーのビルドが終わるまでコンパイルを待機します。なお、「プリコンパイル済みのヘッダーを使用する」MSVC のデフォルトのオプションがそのままでも、stdafx.h が実質的に空の場合はプロジェクトから stdafx.cpp を削除して、プロジェクトの設定を [プリコンパイル済みヘッダーを使用しない] にすることをお勧めします。
ファイルレベルのカスタム ビルド ステップ
ファイルレベルのカスタム ビルド ステップを定義する場合は、1 つまたは複数の出力ファイルを指定します。プロジェクトに含まれるファイルレベルのカスタム ビルド ステップが当該プロジェクトのソースファイルから参照されるファイルを生成する場合、このステップで生成される全ファイルが出力ファイル一覧に含まれていなければなりません。例えば、my.cpp ファイルに含まれるヘッダー ファイル lang.h がlang.h は、別のファイルlang.y のために定義されたカスタムビルドステップによって生成されます。カスタムビルドステップは、出力ファイルとしてlang.h を定義していません。カスタム ビルド ステップ lang.y が終わる前にリモート Agent 上で my.cpp のコンパイルが始まり、コンパイル エラー (「ファイルが見つかりません」) や最悪の場合は古いバージョンの lang.h が使用されるという事態が起こります。
ファイルレベルのカスタム ビルド ステップの 1 つをほかのステップの前に実行するには、ステップのコマンドに次のディレクティブを追加します。
rem Incredibuild_RunFirst
ソリューション/ワークスペースレベルの依存関係
ソリューション/ワークスペースのプロジェクト間の依存関係は [Project] > [Dependencies] で定義します。
プロジェクト間の依存関係を定義する際は以下のケースに注意してください。
リンクの依存関係
プロジェクトがソリューション/ワークスペースのほかのプロジェクトが作成したライブラリとリンクする場合は、そのプロジェクトをサブプロジェクトとして含む必要があります。これは LIB ファイルを準備する前にリンク作業が開始されないようにするために必要です。Visual C++ では正常にビルドされるソリューション/ワークスペースを Incredibuild でビルドすると失敗する場合は、この種の依存関係を宣言していないことがあります。
MIDL、カスタム、プレリンク、ポストビルド、プレビルド ステップ
プロジェクトがソリューション/ワークスペースのほかのプロジェクトのコンパイルに影響を与えるビルド ステップを含む場合は、そのプロジェクトをサブプロジェクトとして含む必要があります。例えば、コード生成ツール (YACC や LEXX など) や出力ファイルを別のプロジェクトが使用する場所にコピーするステップなどです。ほかにもよくあるケースとして、ソースファイルに別のプロジェクトで MIDL コンパイラが生成したファイル (TLB ファイル、ヘッダー ファイルなど) へのプリプロセッサ リファレンスが含まれる場合があります。ソリューション/ワークスペースで 2 つのプロジェクト間の依存関係が正しく定義されていない場合、誤ったバージョンのファイルが使用されたり、コンパイル エラーが発生したりすることがあります。
カスタム、プレリンク、ポストビルド、プレビルド ステップの使用とビルド速度に関する注意事項:「プロジェクト A」のサブプロジェクトである「プロジェクト B」がプロジェクトレベルのカスタム ビルド ステップ、プレリンク ステップ、ポスト ビルド ステップのいずれかを含む場合を考えてみます。この場合「プロジェクト A」は「プロジェクト B」のステップが処理されるまでコンパイルを待機します。依存関係が正しく定義されていれば、プロジェクトは正常にビルドされますが、「プロジェクト A」のソースファイルに「プロジェクト B」のステップが不要な場合はビルドが大幅に遅くなる可能性があります。この場合、「Incredibuild_AllowOverlap」ディレクティブを使って「プロジェクト A」のコンパイルを待機しないように指示します。