我想尽量减少我的 msbuild xml 中的重复,特别是在我的 Target 的 Exec Command 属性中。
1) 最重要的是,在下面的目标中,我想取消重复 Exec 命令属性中的一对“%(ShaderVertex.Identity)”构造(例如,Property 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”,可以从 $(像素目标名称))。
有任何想法吗?
警告:我知道 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>