Можно ли добавить условные определения в командной строке msbuild?

У меня есть следующий пример кода:

program boohoo;

{$APPTYPE CONSOLE}

{$IFDEF boo}
{$MESSAGE warn 'boo'}
{$ENDIF}

{$IFDEF hoo}
{$MESSAGE warn 'hoo'}
{$ENDIF}

begin
end.

В параметрах проекта определен условный boo. Я хотел бы иметь возможность добавить условный hoo как часть моей командной строки msbuild.

Я пробовал это следующим образом:

msbuild boohoo.dproj /p:Config=Release;DCC_Define="$(DCC_Define);hoo"

На выходе отображается hoo, но не boo. Когда я использую подробный вывод для просмотра команды dcc32, я вижу

-D$;hoo

Ясно, что я могу сделать это следующим образом:

msbuild boohoo.dproj /p:Config=Release;DCC_Define="boo;hoo"

но, естественно, я хочу использовать любые условные выражения в параметрах проекта плюс то, что я указываю в командной строке.

Есть ли способ указать это свойство со ссылкой на значение из базовой конфигурации?

Ответ 1

Отказ от ответственности: еще не используйте MsBuild, все взятые из документов и некоторых экспериментов IDE

В соответствии с ссылкой командной строки MsBuild (http://msdn.microsoft.com/en-us/library/ms164311.aspx):

/свойство: имя = значение

Устанавливает или переопределяет эти свойства на уровне проекта, где имя имя свойства и значение - это значение свойства. Используйте точку с запятой или запятой, чтобы отделить несколько свойств или указать каждое свойство в отдельности. /p также приемлемо. Например: /Свойство: WarningLevel = 2; OutputDir = Bin\Debug

настройка или переопределение - это все, что вы можете сделать для значения свойства. Добавление к значению свойства из файла проекта либо невозможно, либо случай скрытой функции.

Но я предполагаю, что вы можете сделать это, чтобы определить настраиваемое свойство в вашем файле dproj с "по умолчанию":

<PropertyGroup>
  <ExtraDefines> </ExtraDefines>
</PropertyGroup>

ссылается на инструкцию

<DCC_Define>DUNIT;$(ExtraDefines);$(DCC_Define)</DCC_Define>

который в IDE должен быть DUNIT;$(ExtraDefines)

а затем укажите его в командной строке:

msbuild boohoo.dproj /p:Config=Release;ExtraDefines="hoo"

Я тестировал добавление $(ExtraDefines) к параметрам Include для проекта с использованием IDE. И, по крайней мере, это не задело меня, даже не имея опцию, определенную в dproj. Командная строка IDE, полученная от этого, была:

...rad studio\7.0\bin\dcc32.exe --no-config -B -Q -DDEBUG;DUNIT; -E....

Который, кажется, указывает, что $(ExtraDefines) был ликвидирован, поскольку он не имел никакой ценности. И что его нужно взять с помощью MSBuild и указать значение в командной строке.

Ответ 2

Почти 5 лет спустя, но все ответы не совсем элегантны))

Недавно я столкнулся с той же проблемой

И вот решение:

Обычно DCC_Define определяется в файле .dproj следующим образом:

<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <DCC_Define>boo;$(DCC_Define)</DCC_Define>

Мы все пытались определить DCC_Define через /property:DCC_Define=blah-blah

Но в соответствии с Как создать одинаковые исходные файлы с различными параметрами:

Значение свойства, указанное в командной строке, имеет приоритет над любым значением, установленным для того же свойства в файле проекта, и это значение в файле проекта имеет приоритет над значением в переменной среды.

Итак, сбой (вот вопрос здесь!)

НО! Практическое руководство. Использование переменных среды в сборке

Чтобы использовать переменную среды в проекте MSBuild

  • Ссылка на переменную среды так же, как вы указали бы переменную в файле проекта. Например, следующее код ссылается на переменную среды BIN_PATH:

    <FinalOutput>$(BIN_PATH)\MyAssembly.dll</FinalOutput>
    

Итак, мы должны определить переменную среды с именем DCC_Define и значениями наших ДОПОЛНИТЕЛЬНЫХ условных обозначений

> set DCC_Define=hoo;doo;moo;foo

а затем просто запустите

> msbuild boohoo.dproj /p:Config=Release

DCC32 получит -Dboo;hoo;doo;moo;foo

Ответ 3

Простым решением является создание новой конфигурации сборки (скажем, boohooRelease), добавьте к ней условные обозначения boo и hoo и скомпилируйте как msbuild boohoo.dproj /p:Config=boohooRelease. Не совсем то, что вы пытаетесь сделать, но оно работает.

Ответ 4

Другой способ - создать файл проекта-обертки следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Full" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Full">
  <CreateProperty Value="$(DCC_Define);$(ExtraDefines)">
    <Output TaskParameter="Value" PropertyName="DCC_Define"/>
  </CreateProperty>
</Target>
<Import Project="example.dproj" />
</Project>

и вызывается следующим образом:

msbuild.exe "/t:Clean;Full;Build" "/p:config=Debug" /p:ExtraDefines=SOME_DEFINE wrapper.proj

Это, конечно, менее изящно, но вам не нужно изменять файл .dproj.

Ответ 5

Я просто попробовал следующее, и это сработало, поэтому не знаю, изменила ли Microsoft его:

msbuild "myApp.dproj" /t:build /property:DCC_Define="boo"

не забудьте добавить двойную кавычку "", иначе она не будет работать