问题
I'm trying to get Visual Studio 2013's msbuild .vcxproj to automatically mark certain .cpp project files as <ExcludedFromBuild>true</ExcludedFromBuild> based on the .cpp filename.
My goal is to allow my program (~100 developers, ~1000 vcxproj) to easily support Debug only compilations of unit test code, that would all be written in .cpp files that had a _utest.cpp suffix. Any .cpp files that ended in _utest.cpp would be automatically excluded from a release build, and the programmer could see that in Visual Studio's Solution Explorer when they were switched to a Release Solution Configuration.
I have been able to prevent the _utest.cpp-suffixed files from building in Release by adding this to my shared .props file
<Target Name="Remove _utest.cpp" BeforeTargets="ClCompile" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ItemGroup>
<ClCompile Remove="*_utest.cpp" />
</ItemGroup>
</Target>
but that doesn't give a visual indicator in Solution Explorer that the files are not part of the Release build.
I already tried a condition in an ItemDefinitionGroup that was based on %(Identity) but that didn't work
<ItemDefinitionGroup Condition="'%(Identity)'=='throttle_utest.cpp'">
<ClCompile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
</ItemDefinitionGroup>
(Visual Studio refused to load this one with an error "The reference to the built-in metadata Identity at position 1 is not allowed")
or
<ItemDefinitionGroup Condition="$([System.Text.RegularExpressions.Regex]::IsMatch(%(Identity), '_utest\.cpp$'))">
<ClCompile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
</ItemDefinitionGroup>
(Visual Studio loaded with this change, but did nothing to exclude the matching files from building).
Is there a way I can conditionally exclude files based on filename and get a visual indicator in Solution Explorer?
回答1:
I think something like this should work.
Right under the <Project> tag.
<ItemGroup Condition="'$(Configuration)'!='Debug'">
<ClCompile Include="*_utest.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
</ItemGroup>
回答2:
This works for me (was done entirely in VS2013 UI - right-click on Properties of source file and select Excluded from build: True for Release Configuration):
<ClCompile Include="foo_utest.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
NOTE: According to https://docs.microsoft.com/en-us/cpp/ide/vcxproj-file-structure?view=vs-2017 :
The Visual C++ project system currently does not support wildcards in project items. For example, this is not supported:
<ClCompile Include="*.cpp"/>
Therefore each file should be excluded individually.
来源:https://stackoverflow.com/questions/24514495/conditionally-exclude-files-from-visualstudio-2013-c-project-based-on-file-nam