Herramienta de compilación personalizada VS2010 para generar archivos .h

Estoy tratando de integrar una herramienta de compilación personalizada en VS2010 que genera un archivo .h a partir de un archivo fuente. Creé un .xml, .targets y .props para el paso. El XML se copia y pega principalmente del archivo MASM y termina con:

<ItemType Name="FOO" DisplayName="Foo compiler" />
<FileExtension Name="*.foo" ContentType="FOO" />
<ContentType Name="FOO" DisplayName="Foo compiler" ItemType="FOO" />

Esto asigna todos mis archivos .foo al compilador Foo que está definido en .props:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <PropertyPageSchema Include="$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml" />
    <AvailableItemName Include="FOO">
      <Targets>FooCompile</Targets>
    </AvailableItemName>
  </ItemGroup>
  <UsingTask TaskName="FOO" TaskFactory="XamlTaskFactory" AssemblyName="Microsoft.Build.Tasks.v4.0">
    <Task>$(MSBuildThisFileDirectory)$(MSBuildThisFileName).xml</Task>
  </UsingTask>
  <Target Name="FooCompile" BeforeTargets="$(FOOBeforeTargets)" AfterTargets="$(FOOAfterTargets)" Condition="'@(FOO)' != ''" Outputs="%(FOO.Outputs)" Inputs="%(FOO.Identity);%(FOO.AdditionalDependencies);$(MSBuildProjectFile)" DependsOnTargets="_SelectedFiles">
    <Message Importance="High" Text="@(FOO)" />
    <FOO Condition="'@(FOO)' != '' and '%(FOO.ExcludedFromBuild)' != 'true'"
         CommandLineTemplate="%(FOO.CommandLineTemplate)"
         OutputFileName="%(FOO.OutputFileName)"
         Inputs="%(FOO.Identity)" />
  </Target>
</Project>

Cuando compilo mi proyecto, identifica y compila con éxito mis archivos foo:

1>FooCompile:
1>  apa.foo
1>FooCompile:
1>  banan.foo
1>ClCompile:
1>  test.cpp
1>  main.cpp

Mi pregunta es ¿por qué imprime "FooCompile:" una vez para cada archivo mientras que ClCompile no lo hace? ¿Hay alguna manera de cambiar esto?

Si cambio un archivo cpp y compilo, también obtendré este resultado una vez para cada archivo, lo que quiero evitar:

1>FooCompile:
1>Skipping target "FooCompile" because all output files are up-to-date with respect to the input files.
1>FooCompile:
1>Skipping target "FooCompile" because all output files are up-to-date with respect to the input files.

preguntado el 27 de agosto de 11 a las 16:08

1 Respuestas

El destino de FooCompile utiliza "procesamiento por lotes de destino", lo que hace que el destino se repita una vez para cada elemento de la matriz especificada para el atributo Salidas,% (Foo). El destino ClCompile, por otro lado, opera utilizando toda la matriz de elementos @ (ClCompile).

Puede alterar la verbosidad del registrador para evitar los mensajes, especifique / v: mínimo, pero, por supuesto, también puede estar filtrando otra información.

Respondido 28 ago 11, 09:08

Establecer Outputs = "@ (FOO -> '% (OutputFileName)')" y Inputs = "@ (FOO) ..." hace que funcione mucho mejor, pero no se limpia correctamente. ¿Me estoy perdiendo algún paso? - user408952

¿Qué estás haciendo para apoyar a Clean? No es automático, debes conectarlo tú mismo. Eche un vistazo a @ (FileWrites) que podría ser suficiente (todo esto está cubierto en mi nuevo libro "MSBuild Trickery") - Brian Kretzler

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.