Наш проект на 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
.