Как отключить скомпилированные заголовки с помощью msbuild? - PullRequest
0 голосов
/ 22 октября 2019

Проблема

  • У меня есть решение VS2015, в котором используются предварительно скомпилированные заголовки.
  • Наш сервер непрерывной интеграции создает решение, используя msbuild.
  • Мы также используем инструмент покрытия, который имеет некоторые проблемы с предварительно скомпилированными заголовками.

Вопрос

Как сообщить msbuild.exeне использовать предварительно скомпилированные заголовки?

Примечание

Я пытался добавить /Y- в вызове msbuild, но это не допустимый параметр для msbuild.

1 Ответ

1 голос
/ 22 октября 2019

Мы не можем напрямую сделать это с помощью msbuild, поскольку PrecompiledHeader не является свойством msbuild ...

MSbuild считывает данные из файла проекта для выполнения сборки. И в xx.vcxproj есть несколько элементов, которые можно указывать в командной строке, например target , properties , поэтому мы можем использовать команду, например msbuild xx.vcxproj / xx.sln / t: xx / p: xx для указания элемента target и property при сборке в командной строке.

например, : msbuild xx.vcxproj /t:build /p:OutDir=xxx может указать, куда вывести свою сборку.

Я изменил один из параметров проекта VS2015 C ++ , чтобы он не использовал precompiled headers, после сравнения различий (с помощью git для контроля версий) между двумя версиями файла xx.vcxproj Iнайдено:

enter image description here

Таким образом, элемент для управления поведением precompiled-header является Метаданные элемента в ClCompile Пункт . Поскольку элемент является Item metadata вместо property, мы не можем использовать команду типа msbuild xx.vcxproj /p:PrecompiledHeader=NotUsing ... для отключения предварительно скомпилированных заголовков. (/p <=> /property)

Возможное направление:

Единственное возможное направление, которое я могу себе представить, которое может работать для достижения ваших целей, - это создание собственногосвойство для управления этим поведением.

1.Для обычного проекта 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.Добавьте пользовательское свойство DisablePCH, сделайте copy из этих четырех ItemDefinitionGroups и включите это свойство в их Условие .

<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. Затем по умолчанию, если мы используем обычную команду, такую ​​как msbuild xx.vcxproj ..., она будет использоватьprecompiledheaders. Если мы хотим отключить это в команде, используйте команду как msbuild xx.vcxproj /p:DisablePCH=true ....

ps: Если вы хотите отключить PCH (предварительно скомпилированные заголовки) с помощью msbuild, вы можете попробовать possible direction, по какой-то причине я не могу проверить его на своем компьютере :(. Не стесняйтесьдайте мне знать, если это помогает или нет.

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