Изменения в пользовательских файлах сборки не приводят к перестроению проекта в VS 2017 - PullRequest
0 голосов
/ 25 августа 2018

В моем проекте 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 &gt;&gt; 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), проект будет не построен В.С. говорит, что проект актуален.

Теперь странная вещь: если я запускаю проект с использованием msbuild на терминале ouside VS, изменений в файлах шейдера достаточно, чтобы вызвать перестройку. Иди разберись .... !!!

Это похоже на то, как VS строит проекты. Это вне msbuild.

1 Ответ

0 голосов
/ 25 августа 2018

Aha !!Нашел это в этой статье .Оказывается, Visual Studio обходит msbuild и использует некоторые другие критерии для проверки актуальности проекта или нет.Если критерий не выполняется, он запускает msbuild для этого проекта.

Чтобы переопределить поведение Visual Studio, установите для свойства DisableFastUpToDateCheck значение true в группе свойств Globals xml:

<PropertyGroup Label="Globals">
     .... Other Global Property Settings .....
	<DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
/PropertyGroup>

И все готово ... Интересно, есть ли возможность сказать Visual Studio FastUpToDateCheck Mechanism также обратить внимание на файлы пользовательской сборки ?????Приведенного выше решения пока будет достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...