Переопределение свойств проекта с помощью пользовательской задачи - PullRequest
0 голосов
/ 20 сентября 2019

Наш проект на C ++ использует MSBuild для сборки на Windows, а GNU make на * nix.Я пытаюсь воссоздать функциональность следующей строки GNU make в MSBuild:

GENN_PATH:=$(abspath $(dir $(shell which genn-buildmodel.sh))../userproject/include)

По сути, установка переменной в путь относительно исполняемого файла в пути.Тем не менее, это становится битвой для реализации в MSBuild ...

Ниже приведены (надеюсь) соответствующие разделы из моего vcxproj.В целях тестирования я сначала устанавливаю переменную, которую я хочу переопределить, на что-то очевидное:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
  <PropertyGroup Label="Configuration">
    ...
    <GeNNUserProject>UNDEFINED</GeNNUserProject>
  </PropertyGroup>

Затем, в моих определениях элементов ClCompile, я добавляю значение этого свойства в дополнительные каталоги включения

  <ItemDefinitionGroup>
    <ClCompile>
      ...
      <AdditionalIncludeDirectories>include;$(GeNNUserProject)</AdditionalIncludeDirectories>
    </ClCompile>
    ...
  </ItemDefinitionGroup>

Чтобы найти этот путь, я использую команду where и перенаправляю вывод в свойство.Затем из этого я нахожу каталог include и распечатываю его - это работает!

  <Target Name="FindUserProjects">
    <Exec Command="where genn-buildmodel.bat" ConsoleToMsBuild="true">
      <Output TaskParameter="ConsoleOutput" PropertyName="GeNNBuildModelPath" />
    </Exec>
    <PropertyGroup>
        <GeNNUserProject>$([System.IO.Path]::GetFullPath($([System.IO.Path]::GetDirectoryName($(GeNNBuildModelPath)))\..\userproject\include))</GeNNUserProject>
    </PropertyGroup>
    <Message Text="MAGIC GENN-FINDING! $(GeNNBuildModelPath) -> $(GeNNUserProject)"/>
  </Target>

Я пробовал множество способов сделать это зависимостью от ClCompile, включая установку Target как BeforeTargets="PrepareForBuild" и следующее:

  <PropertyGroup>
    <BeforeClCompileTargets>
        FindUserProjects;
        $(BeforeClCompileTargets);
    </BeforeClCompileTargets>
  </PropertyGroup>  
</Project>

Что бы я ни делал, моя пользовательская цель запускается, но свойство не переопределяется.Google предполагает, что если свойства переопределены в зависимостях, они должны быть видны с целей и при копании в Microsoft.CPP * .targets, это то, что делает настройка BeforeClCompileTargets.

1 Ответ

0 голосов
/ 23 сентября 2019

Проблема заключалась не в том, что цель не устанавливала свойство, а в том, что метаданные элемента AdditionalIncludeDirectories устанавливались из исходного значения.Решение состоит в том, чтобы установить это непосредственно от цели вместо:

<ItemGroup>
      <ClCompile>
       <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);$([System.IO.Path]::GetFullPath($([System.IO.Path]::GetDirectoryName($(GeNNBuildModelPath)))\..\userproject\include))</AdditionalIncludeDirectories>
      </ClCompile>
    </ItemGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...