如何使用 msbuild 禁用预编译 headers?
How to disable precompiled headers with msbuild?
问题
- 我有一个使用预编译的 VS2015 解决方案 headers。
- 我们的持续集成服务器使用
msbuild
构建解决方案。
- 我们还使用了一个覆盖工具,它对预编译 headers 有一些问题。
问题
如何告诉msbuild.exe
不要使用预编译headers?
备注
我尝试在 msbuild
调用中添加 /Y-
,但它不是 msbuild
的有效参数。
We can't directly do this by msbuild since PrecompiledHeader
is not a msbuild property...
MSbuild 从项目文件中读取数据以执行构建。 xx.vcxproj
中有几个元素可以在命令行中指定,比如targets, properties,所以我们可以使用像msbuild xx.vcxproj/xx.sln /t:xx /p:xx这样的命令在命令行中构建时指定 target
元素和 property
元素。
例如: msbuild xx.vcxproj /t:build /p:OutDir=xxx
可以指定输出程序集的位置。
我换了一个VS2015C++ project's settings让它不用precompiled headers
,比较了两个版本[=65=的区别(用git做版本控制) ] 我找到的文件:
所以控制预编译头行为的元素是一个Item metadata in ClCompile
Item。由于元素是 Item metadata
而不是 property
,我们 不能 使用像 msbuild xx.vcxproj /p:PrecompiledHeader=NotUsing ...
这样的命令来禁用预编译头文件。 (/p
<=> /property
)
可能的方向:
我能想到的唯一可能有助于实现您的目标的方向是创建自定义 属性 来控制此行为。
1.For一个普通的C++工程,其工程文件内容为:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
2.Add 自定义 DisablePCH
属性,将这四个 ItemDefinitionGroups
制作成 copy
并将此 属性 纳入他们的 Condition.
<PropertyGroup>
<DisablePCH>false</DisablePCH>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
3.Then 默认情况下,如果我们使用像 msbuild xx.vcxproj ...
这样的普通命令,它将使用预编译头文件。如果我们想在命令中禁用它,请使用像 msbuild xx.vcxproj /p:DisablePCH=true ...
这样的命令。
ps:如果你确实想通过 msbuild 禁用 PCH(预编译头文件),你可以尝试 possible direction
,出于某种原因我无法在我的机器上测试它: (。请随时告诉我它是否有用ps。
问题
- 我有一个使用预编译的 VS2015 解决方案 headers。
- 我们的持续集成服务器使用
msbuild
构建解决方案。 - 我们还使用了一个覆盖工具,它对预编译 headers 有一些问题。
问题
如何告诉msbuild.exe
不要使用预编译headers?
备注
我尝试在 msbuild
调用中添加 /Y-
,但它不是 msbuild
的有效参数。
We can't directly do this by msbuild since
PrecompiledHeader
is not a msbuild property...
MSbuild 从项目文件中读取数据以执行构建。 xx.vcxproj
中有几个元素可以在命令行中指定,比如targets, properties,所以我们可以使用像msbuild xx.vcxproj/xx.sln /t:xx /p:xx这样的命令在命令行中构建时指定 target
元素和 property
元素。
例如: msbuild xx.vcxproj /t:build /p:OutDir=xxx
可以指定输出程序集的位置。
我换了一个VS2015C++ project's settings让它不用precompiled headers
,比较了两个版本[=65=的区别(用git做版本控制) ] 我找到的文件:
所以控制预编译头行为的元素是一个Item metadata in ClCompile
Item。由于元素是 Item metadata
而不是 property
,我们 不能 使用像 msbuild xx.vcxproj /p:PrecompiledHeader=NotUsing ...
这样的命令来禁用预编译头文件。 (/p
<=> /property
)
可能的方向:
我能想到的唯一可能有助于实现您的目标的方向是创建自定义 属性 来控制此行为。
1.For一个普通的C++工程,其工程文件内容为:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
2.Add 自定义 DisablePCH
属性,将这四个 ItemDefinitionGroups
制作成 copy
并将此 属性 纳入他们的 Condition.
<PropertyGroup>
<DisablePCH>false</DisablePCH>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
3.Then 默认情况下,如果我们使用像 msbuild xx.vcxproj ...
这样的普通命令,它将使用预编译头文件。如果我们想在命令中禁用它,请使用像 msbuild xx.vcxproj /p:DisablePCH=true ...
这样的命令。
ps:如果你确实想通过 msbuild 禁用 PCH(预编译头文件),你可以尝试 possible direction
,出于某种原因我无法在我的机器上测试它: (。请随时告诉我它是否有用ps。