特にTargetのExecCommand属性内で、msbuildxmlの繰り返しを最小限に抑えたいと思います。
1)最も重要なのは、次のターゲットで、Execコマンド属性の「%(ShaderVertex.Identity)」構造のペアの重複を解除したいことです(たとえば、プロパティVertexTargetNameは「ShaderVertex」として定義されていますが、% ($(VertexTargetName).Identity)は$(VertexTargetName)を展開しません):
<Target Name="ShaderVertexBuild"
Inputs="@($(VertexTargetName))"
Outputs="@($(VertexTargetName)$(OutputRelPathAndFileName))">
<Exec Command="$(FxcPathFull)v$(ShaderArgNoFirstLetter) %(ShaderVertex.Identity)$(ShaderOutputFlagAndRelPath)%(ShaderVertex.Identity)$(OutputFileExtLetterToAppend)">
</Exec>
</Target>
2)Targetの前にあるItemGroupの「ShaderVertex」識別子を複製しないのも良いでしょうが、ItemGroupのコンテキストで$(VertexTargetName)を展開することはできません。
<ItemGroup>
<ShaderPixel Include="p*.fx"/>
<ShaderVertex Include="v*.fx"/>
</ItemGroup>
3)それほど重要ではありませんが、ターゲット間で重複する構成をさらに減らすことができれば便利です。上記の例を使用して、$(VertexTargetName)と文字「v」(HLSLコンパイラに頂点シェーダーをコンパイルするように指示する)を、すべてのターゲットと同一のすべてのデータを入力する魔法のターゲットジェネレーターに渡すだけです- -またはさらに良いことに、$(VertexTargetName)を渡すだけで、ターゲットジェネレーターがこの引数から「v」を渡す必要があることを推測できます(たとえば、$(から推測できるPixelShaderの「p」の代わりに) PixelTargetName))。
何か案は?
警告:msbuildは関数型プログラミング言語ではないため、ここで私の要望に対応できない可能性があります。また、VS2012がHLSLコンパイルを自動的に処理することも知っていますが、今はVS2010を使用しており、この種のタスクを実行するためにmsbuildについて十分に知りたいと思います。
完全なxmlリストは次のとおりです。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- TODO NTF: does not take into account *.inc dependency -->
<Target Name="Main">
<CallTarget Targets="ShaderPixelBuild"/>
<CallTarget Targets="ShaderVertexBuild"/>
</Target>
<ItemGroup>
<ShaderPixel Include="p*.fx"/>
<ShaderVertex Include="v*.fx"/>
</ItemGroup>
<PropertyGroup>
<ShaderModelNum>4</ShaderModelNum><!-- Radeon 8600 GTS doesn't support shader model 5 -->
<ShaderArgNoFirstLetter>s_$(ShaderModelNum)_0</ShaderArgNoFirstLetter><!-- first letter defines shader type; v=vertex, p=pixel-->
<FxcPathFull>"%DXSDK_DIR%\Utilities\bin\x64\fxc.exe" /T </FxcPathFull>
<ShaderOutputRelPath>..\..\x64\shadersCompiled\</ShaderOutputRelPath>
<ShaderOutputFlagAndRelPath> /Fo $(ShaderOutputRelPath)</ShaderOutputFlagAndRelPath>
<OutputFileExtLetterToAppend>o</OutputFileExtLetterToAppend>
<OutputRelPathAndFileName>->'$(ShaderOutputRelPath)%(identity)$(OutputFileExtLetterToAppend)'</OutputRelPathAndFileName>
<!-- Note that the content of each of these properties must be duplicated in the Exec Command twice, since %($(PropertyName)) will not expand there -->
<PixelTargetName>ShaderPixel</PixelTargetName>
<VertexTargetName>ShaderVertex</VertexTargetName>
</PropertyGroup>
<Target Name="ShaderPixelBuild"
Inputs="@($(PixelTargetName))"
Outputs="@($(PixelTargetName)$(OutputRelPathAndFileName))">
<Exec Command="$(FxcPathFull)p$(ShaderArgNoFirstLetter) %(ShaderPixel.Identity)$(ShaderOutputFlagAndRelPath)%(ShaderPixel.Identity)$(OutputFileExtLetterToAppend)">
</Exec>
</Target>
<Target Name="ShaderVertexBuild"
Inputs="@($(VertexTargetName))"
Outputs="@($(VertexTargetName)$(OutputRelPathAndFileName))">
<Exec Command="$(FxcPathFull)v$(ShaderArgNoFirstLetter) %(ShaderVertex.Identity)$(ShaderOutputFlagAndRelPath)%(ShaderVertex.Identity)$(OutputFileExtLetterToAppend)">
</Exec>
</Target>
</Project>