Сообщение 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"
Спасибо всем за помощь!
КД>Если в проекте нет элементов 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 "M4_PROVIDER_PLATFORM=$(LCPI_UI_ProviderPlatform)" -D "M4_DDEX_PLATFORM=$(LCPI_UI_DDEXPlatform)" -D "M4_BUILD_CONFIGURATION=$(Configuration)" "%(GeneratedItem__M4.LCPI_TemplateSource)""
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"
Спасибо всем за помощь!
---
UPD1. Мне тут лайков за косячный код отсыпали .
Поправил ProcessGeneratedItemList__M4 — у него нужно еще Outputs="%(GeneratedItem__M4.Identity)" прописать, чтобы он правильно выполнял задачи над элементами. И MakeDir тоже не помешает.
В более правильном варианте, пришлось заменить Exec (и, до кучи, WriteLinesToFile) на свой Task для вызова m4.exe. Внезапно обнаружилось что Exec триммит результирующие строки, чем напрочь убивает форматирование.
КД>Если в проекте нет элементов 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 "M4_PROVIDER_PLATFORM=$(LCPI_UI_ProviderPlatform)" -D "M4_DDEX_PLATFORM=$(LCPI_UI_DDEXPlatform)" -D "M4_BUILD_CONFIGURATION=$(Configuration)" "%(GeneratedItem__M4.LCPI_TemplateSource)""
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 триммит результирующие строки, чем напрочь убивает форматирование.