1

我想尽量减少我的 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>&quot;%DXSDK_DIR%\Utilities\bin\x64\fxc.exe&quot; /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>
4

0 回答 0