установить среду 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="&quot;$(MYLIBDIR)&quot;"
  />
<VisualStudioPropertySheet/>

Проблема в том, что при сборке значения переменных среды, объявленных в файле msbuild (MYBINDIR, MYLIBDIR), не попадают в листы свойств, но кажутся локальными только для файла msbuild: в проекте msbuild MYBINDIR расширяется до "d:\buildsysroot\bin", но внутри проекта vc MYBINDIR расширяется до "d:\projects\bin", что является значением, которое я установил глобально (например, через MyComputer->Advanced->EnvironmentVariables) and< /em>, который должен оставаться там, потому что так настроена моя основная среда разработки.

Как передать среду, установленную в файле msbuild, задаче VCBuild?

Я знаю, что эту проблему можно решить, используя командный файл и объявив среду там с помощью 'set', а не в файле msbuild; так я делал раньше, но я предпочитаю метод выше, так как это всего лишь один вызов msbuild с одним аргументом, и все.

ИЗМЕНИТЬ

Мне нужно было быстрое решение, и я придумал пользовательскую задачу, которая устанавливает среду так же, как это сделал бы пакетный файл, но с бонусом выполнения этого в msbuild. Метод Execute() задач просто выполняет Environment.SetEnvironmentVariable( var , вал ). Это по-прежнему требует настройки среды процессов, я был бы рад услышать, есть ли другой способ!


person stijn    schedule 26.11.2009    source источник


Ответы (2)


поскольку никто больше не ответил/не прокомментировал, я собираюсь дать свой собственный ответ: пользовательская задача, которая устанавливает среду процесса с помощью Environment.SetEnvironmentVariable( var, val )

person stijn    schedule 01.12.2009

Я не знаю, идет ли это к тому, что вы пытаетесь сделать. Но пробовали ли вы атрибут «Переопределить» в задаче VCBuild? Не совсем очевидно, как его использовать. Но я попросил VS создать для меня .vsprops с нужными мне атрибутами (OutputDirectory и IntermediateDirectory). Затем я отредактировал файл .vcproj, удалив добавленный атрибут InheritedPropertySheets. Затем я добавил атрибут Override к задаче VCBuild в моем файле MSBuild. Кажется, это дало мне поведение, которое я искал. Хотя может проблема в другом...

Донни

person Donnie Hale    schedule 09.12.2009
comment
спасибо за идею: действительно можно было бы создать пользовательский лист свойств, который использует переменные среды в основном файле проекта msbuild (используя WriteLinesToFile; поскольку это делается в основном файле, все переменные работают так, как ожидалось). Теперь каждый из моих проектов использует около 3 листов свойств, которые используют переменные среды, поэтому с таким подходом я в основном переписываю все эти листы реквизитов перед каждой сборкой, возможно, внося несоответствия с исходными листами реквизитов, поэтому я просто буду придерживаться настройка среды процесса - person stijn; 10.12.2009