Conditionally exclude files from VisualStudio 2013 C++ project based on file name

。_饼干妹妹 提交于 2019-12-12 16:18:34

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!