在我的C ++ VS项目中,我添加了一个自定义目标来编译着色器文件并将其设置为初始目标。这是项目xml
<Project InitialTargets="CompileShaders" DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
..... Normal Default VS C++ content here ......
<ItemGroup>
<GLSLShader Include="SPIR-V\canvas2D.vert" />
<GLSLShader Include="SPIR-V\canvas2D.frag" />
</ItemGroup>
<Target Name="CompileShaders" Inputs="@(GLSLShader)" Outputs="SPIR-V\shaders_bytecode.h" >
<PropertyGroup>
<OriginalFileName>%(GLSLShader.Filename)%(GLSLShader.Extension)</OriginalFileName>
</PropertyGroup>
<Message Text="Start Compiling GSLANG @(GLSLShader) " />
<Message Condition="'$(VULKAN_SDK)'==''" Text="Error, cant find environment variable VULKAN_SDK, Make sure that the Lunar Vulkan SDK is installed" />
<Message Condition="'$(VULKAN_SDK)'!=''" Text="$(VULKAN_SDK)\Bin\glslangValidator.exe %(GLSLShader.Filename)%(GLSLShader.Extension) -V --vn $([System.String]::Copy('%(GLSLShader.Filename)%(GLSLShader.Extension)').Replace('.','_')) -o %(GLSLShader.Filename)%(GLSLShader.Extension).h" />
<Exec Condition="'$(VULKAN_SDK)'!=''" Command="$(VULKAN_SDK)\Bin\glslangValidator.exe %(GLSLShader.Filename)%(GLSLShader.Extension) -V --vn $([System.String]::Copy('%(GLSLShader.Filename)%(GLSLShader.Extension)').Replace('.','_')) -o %(GLSLShader.Filename)%(GLSLShader.Extension).h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
<Exec Condition="'$(VULKAN_SDK)'!=''" Command="del shaders_bytecode.h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
<Exec Condition="'$(VULKAN_SDK)'!=''" Command="type %(GLSLShader.Filename)%(GLSLShader.Extension).h >> shaders_bytecode.h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
<Exec Condition="'$(VULKAN_SDK)'!=''" Command="del %(GLSLShader.Filename)%(GLSLShader.Extension).h" WorkingDirectory="$(ProjectDir)\SPIR-V" />
</Target>
</Project>
如果我更改任何.cpp .h文件并构建解决方案,则将着色器与项目的其余部分一起编译,但是如果仅更改着色器文件(即SPIR-V \ canvas2D.vert),则该项目为没有建造。 VS说该项目是最新的。
现在奇怪的是,如果我在终端ouside VS上使用msbuild运行项目,则着色器文件的更改足以触发重建。快点......
看起来与VS如何构建项目有关。它在msbuild之外。
答案 0 :(得分:1)
啊哈!在此article中找到了它。事实证明,Visual Studio绕过了msbuild,并使用其他一些条件来验证项目是否最新。如果条件失败,则在该项目上运行msbuild。
要覆盖Visual Studio行为,请在项目xml的Globals属性组中将属性DisableFastUpToDateCheck设置为true:
<PropertyGroup Label="Globals">
.... Other Global Property Settings .....
<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
/PropertyGroup>
它已经完成了...我想知道是否有办法告诉Visual Studio FastUpToDateCheck机制也要注意自定义生成文件????上面的解决方案现在就足够了。