Параметры задачи MSBuild CL - PullRequest
       25

Параметры задачи MSBuild CL

0 голосов
/ 09 февраля 2020

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

Я хочу добавить собственный флаг CL.exe в мой конвейер компиляции: установить соглашение о вызовах fastcall (в cl.exe это передается как / гр). Это означает, что параметр cdecl по умолчанию (/ Gd) необходимо перезаписать.

Я попытался установить свойство MSBuild, но это не сработало:

MSBuild.exe / p: PlatformToolset = v141 / p: платформа = x64 / p: конфигурация = выпуск / p: CallingConvention = / Gr

Я также хочу сделать это с парой других флагов, так что это не изолировано для соглашения о вызовах , Я также wi sh, чтобы сделать это без редактирования каких-либо файлов конфигурации, только сделать это с помощью CLI.

Как я могу сделать это с MSBuild?

Спасибо!

1 Ответ

2 голосов
/ 10 февраля 2020

Я попытался установить свойство MSBuild, но это не сработало. Как я могу сделать это с MSBuild?

См. Msbuild Глобальные свойства , командная строка получает только свойства msbuild, тогда как CallingConvention не является свойством msbuild.

Я создал один проект C ++ и изменил /Gd to /Gr в C/C++=>Advanced в конфигурации Debug | X86, а затем я вижу что-то вроде этого:

  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      ...
      <CallingConvention>FastCall</CallingConvention>
    </ClCompile>
    <Link>
      ...
    </Link>
  </ItemDefinitionGroup>

Очевидно, что CallingConvention это просто один Metadata из Item CLCompile. Это не свойство msbuild. Поэтому мы не можем установить его в командной строке msbuild следующим образом: msbuild /p:xxx.

Возможный обходной путь :

Так как единственная разница между использованием /Gr и /Gd - это строка метаданных:

enter image description here

Поэтому я думаю, что мы можем сделать одну копию этого ItemDefinitionGroup в файле проекта и установить их условия например:

  <!--ItemDefinitionGroup when using default /Gd-->
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' == ''">
    <ClCompile>
     ...
    </ClCompile>
     ...
  </ItemDefinitionGroup>
  <!--ItemDefinitionGroup when using /Gr-->
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' != ''">
    <ClCompile>
      ...
      <CallingConvention>FastCall</CallingConvention> <!--The only difference here.-->
    </ClCompile>
      ...
  </ItemDefinitionGroup>

Затем, если мы передадим значение в пользовательское свойство UseFastCall, например: MSBuild.exe /p:PlatformToolset=v141 /p:Platform=x86 /p:Configuration=Debug /p:UseFastCall=true. Следует использовать метаданные /Gr. И если мы не передадим значение этому свойству, оно будет использовать defaut /Gd. Поэтому обходной путь - создать собственное свойство для управления этим поведением. (Это только для Debug | win32, возможно, вам придется изменить также и для других конфигураций.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...