Информация об изменениях

Сообщение Re: MSBuild, встроить препроцессор от 01.11.2021 14:45

Изменено 02.11.2021 4:31 DDDX

Re: MSBuild, встроить препроцессор
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Если в проекте нет элементов EmbeddedResource с заполненными {LCPI_TemplateSource, LCPI_TemplateRule}, то BuildGeneratedItemList__M4 все равно возвращает один элемент с пустыми полями.


КД>Это не есть хорошо.


КД>Но как победить — пока не догоняю...


Победил. И даже немного улучшил.

Нужно было посмотреть на количество элементов в GeneratedItem__M4 — Condition="@(GeneratedItem__M4->Count())>0"

  <ItemGroup>
    <GeneratedItem__M4 Include="@(EmbeddedResource->WithMetadataValue('LCPI_TemplateRule','M4'))" />
  </ItemGroup>

  <Target Name="ProcessGeneratedItemList__M4" BeforeTargets="CoreResGen" Condition="@(GeneratedItem__M4->Count())>0">
    <Message Importance="High" Text="HELLO FROM ProcessGeneratedItemList__M4! File: %(GeneratedItem__M4.Identity). Source: %(GeneratedItem__M4.LCPI_TemplateSource)."/>

    <Exec
      Command="m4.exe -D &quot;M4_PROVIDER_PLATFORM=$(LCPI_UI_ProviderPlatform)&quot; -D &quot;M4_DDEX_PLATFORM=$(LCPI_UI_DDEXPlatform)&quot; -D &quot;M4_BUILD_CONFIGURATION=$(Configuration)&quot; &quot;%(GeneratedItem__M4.LCPI_TemplateSource)&quot;"
      WorkingDirectory="$(ProjectDir)"
      ConsoleToMsBuild="true"
      StdOutEncoding="UTF-8">
        <Output TaskParameter="ConsoleOutput" PropertyName="M4_OUTPUT" />
    </Exec>

    <WriteLinesToFile
      File="%(GeneratedItem__M4.Identity)"
      Lines="$(M4_OUTPUT)"
      Overwrite="true"
      WriteOnlyWhenDifferent="true" />
  </Target>


Спасибо всем за помощь!
Re: MSBuild, встроить препроцессор
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Если в проекте нет элементов EmbeddedResource с заполненными {LCPI_TemplateSource, LCPI_TemplateRule}, то BuildGeneratedItemList__M4 все равно возвращает один элемент с пустыми полями.


КД>Это не есть хорошо.


КД>Но как победить — пока не догоняю...


Победил. И даже немного улучшил.

Нужно было посмотреть на количество элементов в GeneratedItem__M4 — Condition="@(GeneratedItem__M4->Count())>0"

  <ItemGroup>
    <GeneratedItem__M4 Include="@(EmbeddedResource->WithMetadataValue('LCPI_TemplateRule','M4'))" />
  </ItemGroup>

  <Target Name="ProcessGeneratedItemList__M4" BeforeTargets="CoreResGen" Outputs="%(GeneratedItem__M4.Identity)" Condition="@(GeneratedItem__M4->Count())>0">
    <Message Importance="High" Text="HELLO FROM ProcessGeneratedItemList__M4! File: %(GeneratedItem__M4.Identity). Source: %(GeneratedItem__M4.LCPI_TemplateSource)."/>

    <Exec
      Command="m4.exe -D &quot;M4_PROVIDER_PLATFORM=$(LCPI_UI_ProviderPlatform)&quot; -D &quot;M4_DDEX_PLATFORM=$(LCPI_UI_DDEXPlatform)&quot; -D &quot;M4_BUILD_CONFIGURATION=$(Configuration)&quot; &quot;%(GeneratedItem__M4.LCPI_TemplateSource)&quot;"
      WorkingDirectory="$(ProjectDir)"
      ConsoleToMsBuild="true"
      StdOutEncoding="UTF-8">
        <Output TaskParameter="ConsoleOutput" PropertyName="M4_OUTPUT" />
    </Exec>

    <MakeDir
      Directories="$([System.IO.Path]::GetDirectoryName(%(GeneratedItem__M4.Identity)))"/>

    <WriteLinesToFile
      File="%(GeneratedItem__M4.Identity)"
      Lines="$(M4_OUTPUT)"
      Overwrite="true"
      WriteOnlyWhenDifferent="true" />
  </Target>


Спасибо всем за помощь!

---
UPD1. Мне тут лайков за косячный код отсыпали .

Поправил ProcessGeneratedItemList__M4 — у него нужно еще Outputs="%(GeneratedItem__M4.Identity)" прописать, чтобы он правильно выполнял задачи над элементами. И MakeDir тоже не помешает.

В более правильном варианте, пришлось заменить Exec (и, до кучи, WriteLinesToFile) на свой Task для вызова m4.exe. Внезапно обнаружилось что Exec триммит результирующие строки, чем напрочь убивает форматирование.