Я научился редактировать мой файл .vcxproj, чтобы компилировать некоторые файлы с / Za, а некоторые без.
Однако, похоже, что, поскольку я добавляю элементы в файл .vcxproj, фильтры, которые я установил в IDE, портятся, в то время как файл .vcxproj.filters превращается в гораздо больший беспорядок тройного, четырехкратного, неработающего дубликаты, которые записывают дополнительные дубликаты каждый раз, когда он сохраняет.
Как я могу установить опцию компилятора (например, / Za), чтобы автоматически применять ко всем новым файлам, но не к некоторым старым файлам, и при этом фильтры работать должным образом?
Вот сжатый пример того, что я добавил в мой файл .vcxproj:
<ItemGroup>
<CLCompile Include="**\*.cpp;" Exclude="BufferTrio.cpp;GraphicsFacade.cpp;">
<AdditionalOptions>/Za %(AdditionalOptions)</AdditionalOptions>
</CLCompile>
<CLCompile Include="BufferTrio.cpp;GraphicsFacade.cpp;">
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</CLCompile>
</ItemGroup>
<ItemGroup>
<None Include="fragmentShader.glsl" />
<None Include="vertexShader.glsl" />
</ItemGroup>
<ItemGroup>
<Text Include="Notes.txt" />
<Text Include="Todo.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="BufferTrio.h" />
<ClInclude Include="Exceptions.h" />
<ClInclude Include="FileUtils.h" />
<ClInclude Include="GraphicsFacade.h" />
</ItemGroup>
Это, как ни странно, помещает все файлы .h в нужные фильтры, но все файлы cpp / c в корне проекта, вне всех фильтров.
Ничто из того, что я делаю в IDE или в файле .vcxproj.filters, не имеет значения, которое не просто перезаписывается при следующем сохранении проекта.
Есть две проблемы, которые могут быть причиной такого поведения.
Во-первых, я бы не использовал следующий шаблон, когда вам нужен детальный контроль над сборкой проекта:
<CLCompile Include="**\*.cpp;" Exclude="BufferTrio.cpp;GraphicsFacade.cpp;">
<AdditionalOptions>/Za %(AdditionalOptions)</AdditionalOptions>
</CLCompile>
<CLCompile Include="BufferTrio.cpp;GraphicsFacade.cpp;">
<AdditionalOptions>%(AdditionalOptions)</AdditionalOptions>
</CLCompile>
Гораздо проще контролировать проект, когда все файлы включены каждый в отдельности без использования Globbing **\*.cpp
аргументы. Я сомневаюсь, что с помощью атрибута Exclude="BufferTrio.cpp;GraphicsFacade.cpp;"
совместно с Include="**\*.cpp;"
свойство MSBuild правильно анализируется и используется.
Во-вторых, лучше всего создать два <ItemGroup></ItemGroup>
узлы самостоятельно контролируют новые и старые файлы и применяют к ним различные флаги компилятора.
В-третьих, вы можете создать явное <project-name>.vcxproj.filters
файл проекта, в котором фильтрация может быть определена как для источников, так и для заголовков с одной гранулярностью файла, т.е.
<?xml version="1.0" encoding="UTF-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\alloc.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\assertionprop.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="E:\src\ms\dotnet\coreclr-4c\src\jit\bitset.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{3E79A5A2-A53A-3F44-8869-13CB1954DF36}</UniqueIdentifier>
</Filter>
</ItemGroup>
</Project>
Наконец, можно создать задачу сборки, которая делит файлы на основе даты, когда они были созданы или переданы в репо, и которая будет применять к ним флаг компилятора на основе результата сравнения, т.е.
<CLCompile Include="BufferTrio.cpp;">
<AdditionalOptions Condition="$(BufferTrioCppCreatedDate) >= $(NumericDateTimeFlagThreshold)">%(AdditionalOptions)</AdditionalOptions>
</CLCompile>
Других решений пока нет …