WiXのMSBuild (Visual Studio) プロジェクトでは、コンパイル・リンクが同時に行われ、コンパイルのみを行う手段が提供されていません。コンパイルだけ行う方法が何か無いかと探ってみました。

そもそも、WiX チュートリアル (日本語訳) ― Lesson 1 始めようなどにも書かれているように、WiXのビルドはコンパイル (candle.exe) とリンク (light.exe)の2段階で行われます。ならば、コンパイルだけ行いたい場合もありますよね。

WiXをインストールしたディレクトリにあるwix2010.targetsを眺めると次のような行があります。

  <PropertyGroup>
    <CoreBuildDependsOn>
      BuildOnlySettings;
      PrepareForBuild;
      PreBuildEvent;
      ResolveReferences;
      AddCompilerDefineConstants;
      CompileAndLink;
      Signing;
      GetTargetPath;
      IncrementalClean;
      PostBuildEvent
    </CoreBuildDependsOn>
  </PropertyGroup>
  <Target
    Name="CoreBuild"
    DependsOnTargets="$(CoreBuildDependsOn)">
 
  ……
 
  <PropertyGroup>
    <CompileAndLinkDependsOn>
      ResolveReferences;
      BeforeCompileAndLink;
      _TimeStampBeforeCompileAndLink;
      ConvertReferences;
      ConvertBundleReferences;
      Harvest;
      GenerateCode;
      Compile;
      Lib;
      Link;
      _TimeStampAfterCompileAndLink;
      AfterCompileAndLink
    </CompileAndLinkDependsOn>
  </PropertyGroup>
  <Target
    Name="CompileAndLink"
    DependsOnTargets="$(CompileAndLinkDependsOn)" />

そう、ずばりCompileというターゲットが存在します。これをターゲットに指定すればコンパイルだけできそうです。

ところがそれだけではうまくいませんでした。WiXのソース上の$(var.SolutionDir)で定義されていないというエラーになってしまったのです。どこかのターゲットでcandleに対してSolutionDirを定義しているだろうと考えて探したところ、AddCompilerDefineConstantsターゲットの中にありました。そのため、以下のようにしました。

> msbuild Hoge.wixproj /t:AddCompilerDefineConstants;Compile

ほかにも、WiXプロジェクトによっては、PreBuildEventやHarvestなどを実行させないといけないかもしれません。うまくいかなければ、上で抜粋したCoreBuildDependsOnのCompileAndLinkより上やCompileAndLinkDependsOnのCompileより上に記載されているターゲットを適当に実行するよう試してみたら良いのではないかと思います。

Compileを実行した状態で通常のビルドを行えば、(WiXのソースコードに変更の無い限り)Compileターゲットはスキップされてすぐにlightの実行が始まります。

スポンサード リンク

この記事のカテゴリ

  • ⇒ WiXプロジェクトでコンパイルだけ行う
  • ⇒ WiXプロジェクトでコンパイルだけ行う