1

特に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>&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