установить среду vcbuild через msbuild - PullRequest
0 голосов
/ 26 ноября 2009

У меня есть файл проекта 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) и , который должен оставаться там, потому что именно так настроена моя основная среда разработки.

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

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

EDIT

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

Ответы [ 2 ]

0 голосов
/ 10 декабря 2009

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

Донни

0 голосов
/ 01 декабря 2009

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

...