VS2010自定义构建工具,用于生成.h文件

发布于 2024-12-01 20:38:16 字数 2151 浏览 1 评论 0原文

我正在尝试在 VS2010 中集成一个自定义构建工具,该工具从源文件生成 .h 文件。我已经为该步骤创建了 .xml、.targets 和 .props。 XML 大部分是从 MASM 文件复制粘贴的,并以以下内容结尾:

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

这将我所有的 .foo 文件映射到 .props 中定义的 Foo 编译器:

<?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>

当我编译我的项目时,它成功识别并编译我的 foo 文件:

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

我的问题这就是为什么它为每个文件打印一次“FooCompile:”,而 ClCompile 却没有?有什么办法可以改变这个吗?

如果我更改 cpp 文件并构建,我还将为每个文件获得一次此输出,这是我想避免的:

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.

I'm trying to integrate a custom build tool in VS2010 that generates a .h-file from a source file. I've created a .xml, .targets and .props for the step. The XML is mostly copy-pasted from the MASM-file and ends with:

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

This maps all my .foo files to the Foo compiler that's defined in the .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>

When I compile my project it successfully identifies and compiles my foo files:

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

My question is why does it print "FooCompile:" once for each file while the ClCompile doesn't? Is there any way to change this?

If I change a cpp file and build, I'll also get this output once for each file, which I want to avoid:

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帥小哥 2024-12-08 20:38:16

FooCompile 目标使用“目标批处理”,这会导致目标对为输出属性 %(Foo) 指定的数组中的每个项目迭代一次。另一方面,ClCompile 目标使用整个项目数组 @(ClCompile) 进行操作。

您可以更改记录器的详细程度以避免出现消息,指定 /v:minimal,但当然您也可能会过滤掉其他信息。

The FooCompile target is using "target batching" which causes the target to iterate once for each item in the array specified for the Outputs attribute, %(Foo). The ClCompile target on the other hand operates using the entire item array @(ClCompile).

You can alter the verbosity of the logger to avoid the messages, specify /v:minimal, but of course you may be filtering out other information as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文