Я создал эту задачу, которая позволяет мне включать fxc (шейдер HLSL) в мой процесс сборки. Теперь с шейдерами дело в том, что довольно часто вы получаете один исходный файл и хотите, чтобы он несколько раз компилировался с разными флагами для получения нескольких выходных данных. Я не могу просто добавить новый элемент, ссылающийся на один и тот же файл несколько раз с разными метаданными, поскольку я хочу, чтобы это интегрировалось в Visual Studio, и по крайней мере VS кричит на меня за попытку сделать это. Я не эксперт, когда дело доходит до MSBuild, и я действительно не уверен, что будет лучшим способом сделать это. Конечно, одним из решений было бы просто добавить некоторое значение метаданных к каждому элементу, который указывает мою задачу fxc на какой-нибудь пользовательский скрипт multicompile-build-script. Но если есть хороший способ решить эту проблему исключительно в MSBuild, я бы предпочел это, а не систему, созданную на заказ. Я попытался с помощью Target генерировать несколько элементов во время сборки (HLSL - это элементы, которые проходят через fxc):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<HLSL Include="default.hlsl">
<Multicompile>vs</Multicompile>
</HLSL>
<HLSL Include="shadow.hlsl" />
</ItemGroup>
<Target Name="ShaderMulticompile" BeforeTargets="HLSL" DependsOnTargets="HLSLSelectedFiles">
<ItemGroup>
<HLSL Include="@(HLSL)" Condition="'%(HLSL.Multicompile)' == 'vs'">
<TargetFile>$(OutDir)%(Filename).vsh</TargetFile>
<TargetProfile>vs_4_0</TargetProfile>
<EntryPoint>VertexShader</EntryPoint>
<Multicompile />
</HLSL>
<HLSL Include="@(HLSL)" Condition="'%(HLSL.Multicompile)' == 'ps'">
<TargetFile>$(OutDir)%(Filename).psh</TargetFile>
<TargetProfile>ps_4_0</TargetProfile>
<EntryPoint>PixelShader</EntryPoint>
<Multicompile />
</HLSL>
</ItemGroup>
</Target>
<Target Name="RemoveShaderMulticompileSourceItems" AfterTargets="ShaderMulticompile">
<ItemGroup>
<HLSL Remove="@(HLSL)" Condition="'%(HLSL.Multicompile)' != ''" />
</ItemGroup>
</Target>
<Target Name="CleanShaderMulticompile" BeforeTargets="HLSLClean" DependsOnTargets="ShaderMulticompile" />
</Project>
Это в принципе работает, но мне нужно, чтобы метаданные типа <Multicompile>vs;ps</Multicompile>
генерировали оба элемента, и, кажется, нет простого способа выполнить необходимые строковые операции без некоторого взлома. Я также мог бы добавить отдельные значения метаданных для каждого вида элемента для генерации. Но я почему-то чувствую, что мне не хватает настоящего решения, поэтому я обращаюсь к вашему совету специалиста;)