Установить среду vcbuild через msbuild
У меня есть файл проекта msbuild, который используется для сборки нескольких проектов C++ (*.vcproj). Вот часть типичного файла проекта, в котором глобальные переменные среды для сборки переопределяются как свойства:
<PropertyGroup>
<MYBINDIR>d:\buildsysroot\bin</MYBINDIR>
<MYLIBDIR>d:\buildsysroot\lib</MYLIBDIR>
...
</PrpertyGroup>
<ItemGroup>
<MyItems Include="d:\buildsysroot\myproject\myproject.vcproj"/>
</ItemGroup>
<Target Name="Release_x64">
<VCBuild Projects="@(MyItems)" Configuration="Release_dll|x64"/>
</Target>
Эти переменные среды используются всеми файлами vcproj через листы свойств. Вот выдержка из vcproj:
<Configuration
Name="Release_dll|x64"
ConfigurationType="1"
InheritedPropertySheets="$(BUILDPROPSDIR)\defaults.vsprops;$(BUILDPROPSDIR)\build_dll.vsprops"
>
А вот так выглядят списки свойств:
<VisualStudioPropertySheet
Name="defaults"
OutputDirectory="$(MYBINDIR)\_$(ConfigurationName)_$(PlatformName)"
IntermediateDirectory="$(MYBUILDDIR)_$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
>
<Tool
Name="VCLinkerTool"
AdditionalLibraryDirectories=""$(MYLIBDIR)""
/>
<VisualStudioPropertySheet/>
Проблема заключается в том, что при построении значение переменных среды, объявленных в файле msbuild (MYBINDIR, MYLIBDIR), не попадает в листы свойств, а представляется локальным только для файла msbuild: в рамках проекта msbuild MYBINDIR расширяется до "d:\buildsysroot\bin", но в рамках проекта vc MYBINDIR расширяется до "d:\projects\bin", который является значением, которое я установил глобально (например, через MyComputer->Advanced->EnvironmentVariables) и которое должно оставаться там потому что так устроена моя основная среда разработки.
Как передать среду, заданную в файле msbuild, в задачу VCBuild?
Я знаю, что эту проблему можно решить, используя пакетный файл и объявив окружение с помощью 'set', а не в файле msbuild; это то, как я делал это раньше, но я предпочитаю метод выше, так как это всего лишь один вызов msbuild с одним аргументом, и все.
РЕДАКТИРОВАТЬ
Мне нужно было быстрое решение, и я создал пользовательскую задачу, которая задает среду точно так же, как это делает пакетный файл, но с дополнительным преимуществом выполнения этого в msbuild. Метод Execute() задач просто выполняет Environment.SetEnvironmentVariable( var Валь). Это все еще требует настройки среды процесса, я был бы рад услышать, если есть другой способ!
2 ответа
Так как никто не ответил и не прокомментировал, я собираюсь дать свой собственный ответ: пользовательскую задачу, которая устанавливает среду процесса с помощью Environment.SetEnvironmentVariable( var, val)
Я не знаю, идет ли это к тому, что ты пытаешься сделать. Но вы пробовали атрибут "Переопределить" в задаче VCBuild? Не совсем очевидно, как его использовать. Но я заставил VS создать.vsprops для меня с атрибутами, которые мне нужны (OutputDirectory и IntermediateDirectory). Затем я отредактировал файл.vcproj, чтобы удалить добавленный атрибут InheritedPropertySheets. Затем я добавил атрибут Override в задачу VCBuild в моем файле MSBuild. Это, кажется, дало мне поведение, которое я искал. Может быть другая проблема, хотя...
Donnie