カスタム ビルド ステップ、イベント、ツールの高速化

Incredibuild では、リモートマシンで実行するカスタム ビルド ステップ、イベント、ツール (コード生成、レンダリング、シミュレーション、コード ビルドで行う計算など) を分散できます。

また、カスタム ステップ、イベント、ツールの終了待ちのタスクと並列に処理を実行することもできます。例えば、ファイルをいくつか削除し、テキストをログファイルに書き込むポストリンク ステップを持つ静的ライブラリ プロジェクト (プロジェクト A とします) があり、その出力がプロジェクト B と紐付いているとします。この場合プロジェクト A はプロジェクト B の依存関係 (サブプロジェクト) として定義されます。Visual Studio (と Incredibuild) はデフォルトで、サブプロジェクトのプロジェクト レベルのステップがすべて完了してからプロジェクトのコンパイルを開始します。プロジェクト A のポストリンク ステップが終わるまで、プロジェクト B のコンパイルは待機するためビルドは遅くなります。このような場合、依存するプロジェクトのコンパイルをできるだけ早く開始するように指示することができます。Visual Studio はプロジェクト内のカスタム ビルド ステップ、イベント、ツール、ルールのタスクを (大抵は無関係に) 逐次的に実行するため、同じように依存関係のないプロジェクトを高速に実行できます。

また、ビルド ステップのコンテンツをプロセス レベルで分散・並列させて、さらに高速にビルドを実行することもできます。

ビルド ステップの高速化

カスタム ビルド ステップ、イベント、ツールは小さなタスクに分割してプロセス レベルで分散・並列化することでもっと高速に実行できます。これは次のシナリオでのみご利用になれます。

  1. Incredibuild の予測実行機能がオフになっていない (デフォルトはオン)。

  2. Incredibuild の UseMSBuild ディレクティブが使用されていない。

  3. ビルドで [build regardless of errors] が有効になっていない。

例 1: カスタム ステップ内で <make> コマンドを使って完全なプロジェクトをビルドする場合は、Incredibuild Make & Build ツール パッケージを使用して <make> コマンドを高速に実行するように指示できます。この場合、Incredibuild は <make> コマンドを単一のタスクとして扱わず、これをサブタスクに「分割」して並列処理します。

例 2: 多数のレンダリング コマンドを実行するツールを使用したカスタム ステップの場合は、プロファイル XML ファイルを使ってレンダリングを分散し、レンダリング プロセスを生成するツールをインターセプトできます。

注意:プロファイルXMLファイルをVisual Studioに統合することができます。

タスクの分散

デフォルトではリモート Agent に分散されない、カスタム ステップ、実行タスク、特殊なビルド ツールをプロファイル XML ファイルを使って分散・管理できます。

  • Incredibuild BuildConsole コマンドで「/profile」ディレクティブを使用して Incredibuild が使用するプロファイルを指定します (/profile=[profile_file_name].xml)。

    または

  • Visual Studio からビルドする場合やソリューションごとに使用するデフォルトのプロファイルを用意する場合は、プロファイル XML ファイル ([solution_folder]\[solution_name].ib_profile.xml) を作成します。/profile=[profile_file_name].xml スイッチでプロファイル ファイルが指定されていなければ、このファイルが読み込まれます。

    次の XML ファイルを使用した場合、ビルドで実行する gawk タスクをすべて分散します (gawk.exe のファイル拡張子は指定不要)。

    コピー
    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
     <Profile FormatVersion="1">
      <Tools>
       <Tool Filename="gawk" AllowRemote="true" />
      </Tools>
     </Profile>

profile.xml ファイルを追加してもカスタム ビルド ステップやビルド イベントが単一タスクとして表示される (ビルドモニター上に「IBCustomStep」のバーが 1 つだけ表示される) 場合は、レジストリキー [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Xoreax\Incredibuild\Builder] の [CustomStepVs10Support] を「1」(既定値) から「0」に変更します。

タスクのバッチ処理

MSBuild エンジンを使用して単一プロジェクトのコンテキスト内で、すべてのカスタム ビルド ツールとルールを 1 つの CPU コアで逐次実行します。例えば、(GUI SDK QT のように) moc.exe を実行するカスタム ビルド ツールは生成が必要なファイルごとにプロジェクト A で逐次実行されます。

Incredibuild のプロファイル XML でツール名 (例えば moc. exe) を指定し、AllowPredictedBatch オプションを追加すると、Incredibuild はこのツールを並列に実行するのでパフォーマンスが大幅に改善します。(並列に実行するようになった) このツールはリモートマシンに分散することもできます。並列化は別の実行ファイル (例: CL や LINK) が呼び出されるまで継続します。

この機能を使って安全に高速化できるのは次の条件を満たすツールです。

  1. 実行ファイルの 2 つのインスタンスが同一ファイル (出力ファイル、ログファイルなど) に書き込みを試みない。

  2. 実行ファイルのどのインスタンスも別のインスタンスの作業に依存しない(例: あるインスタンスがほかのインスタンスの出力ファイルに依存しない、あるインスタンスが使用しているファイルやフォルダをほかのインスタンスが削除しない)。

> Visual Studioでのタスクのバッチ処理

  • ソリューションの .ib_profile.xml に「AllowPredictedBatch="true"」のツール タグを追加します。

使用例

ソリューションのファイル名が my_solution.sln で、moc.exe を分散して並列実行したい場合:

  • my_solution.ib_profile.xmlファイルをmy_solution.sln が属するフォルダーに追加します。これで Visual Studio 内から実行するこのソリューションのビルドにプロファイルが適用されるようになります。

  • コマンドラインでビルドする場合は、つぎのように /profile オプションを使って Profile ファイルを指定します。Buildconsole my_solution.sln /rebuild /cfg=”debug|win32” /profile=”my_solution.ib_profile.xml”

my_solution.ib_profile.xml の例:

コピー
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Profile FormatVersion="1">
  <Tools>
    <Tool Filename="moc" AllowRemote="true" AllowPredictedBatch="true"/>
  </Tools>
</Profile>