несколько правил сборки с использованием vc2010 и msbuild - PullRequest
2 голосов
/ 03 декабря 2010

Я управляю проектом C ++ в VS2010 и хочу, чтобы ВСЕ файлы .cpp проходили через внешний инструмент перед переходом к компилятору C ++.Все признаки указывают на то, что это возможно.См., Например, здесь .

Поскольку это произойдет в нескольких проектах, имеет смысл поместить эту функцию в лист свойств, а затем просто импортировать этот лист свойств везде.До того, как я коснулся листа свойств, он выглядел в целом следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
    <ExtensionsToDeleteOnClean>...</ExtensionsToDeleteOnClean>
    <CustomBuildBeforeTargets>ClCompile</CustomBuildBeforeTargets>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <ClCompile>
      <AdditionalIncludeDirectories>...</AdditionalIncludeDirectories>
      <ForcedIncludeFiles>%(ForcedIncludeFiles)</ForcedIncludeFiles>
    </ClCompile>
    <Link>
      <AdditionalDependencies>...</AdditionalDependencies>
    </Link>
      <Outputs>...</Outputs>
    </CustomBuildStep>
  </ItemDefinitionGroup>
</Project>

Согласно приведенному выше связанному документу, я добавил следующие строки:не имеют никакого эффекта, и мой пользовательский инструмент сборки никогда не запускается до ClCompile.Я пробовал различные способы перемещения объектов и переименования тегов (редактор Xml жалуется, что, например, CustomBuild недействителен в соответствии со схемой), но ничего не работает.

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 мая 2017

Кроме того, вы можете сэкономить на использовании подстановочного знака, просто запустив задачу Exec на каждом включенном ClCompile.

<Target Name="ProcessClCompileFiles" BeforeTargets="ClCompile" Condition="'@(ClCompile)'!=''">
  <Message Text="== Starting processing cpp files ==" Importance="High"/>
  <Exec Command="echo processing %(ClCompile.filename)%(ClCompile.extension) &amp; ////YOUR COMMAND HERE////" />
</Target>

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

Еще одно замечание: эти задачи Exec будут всегда выполняться, если в группе элементов ClCompile есть какие-либо элементы. Если у вас есть условие, где оно должно их пропустить (например, уже обработано), используйте Условие = "A = B"

Для удобства рассмотрим, как проверить, что он не создал файл и если он создал файл; если файл устарел:

Condition="!Exists('$(OutDir)%(Filename)%(Extension)') OR ($([System.DateTime]::Parse('%(ClCompile.ModifiedTime)').Ticks) > $([System.IO.File]::GetLastWriteTime('$(OutDir)%(Filename)%(Extension)').Ticks))"
0 голосов
/ 01 июля 2013

Хотя это очень старый вопрос, я попытаюсь ответить на него.

Атрибут Include ожидает найти файлы * .cpp в каталоге Project. Если в каталоге Project нет файлов .cpp, эта «задача» CustomBuild никогда не сработает.

ОП могла бы сделать

<CustomBuild Include="**\*.cpp">
    <Message>Custombuild kicking in</Message>
    <Command>echo %(Identity)</Command>
    <Outputs>dummy</Outputs>
</CustomBuild>

вместо

<CustomBuild Include="*.cpp">
...

и он выполнил бы действие CustomBuild для всех файлов .cpp во всех подкаталогах каталога проекта, а не только для файлов .cpp, ожидающих компиляции.

Если файлы .cpp недоступны в каталоге Project (это может произойти при использовании такой структуры каталогов проекта), то OP должен явно указывать на правильный «корневой» каталог.

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