“自定义编译器”的 VS2022 C++ 自定义构建步骤

问题描述 投票:0回答:1

在我的 C++ 项目中,我有(大量).foo 文件,这些文件使用在 .foo 文件上运行 foo2bar 的自定义构建步骤转换为 .bar 文件。

生成的 .bar 输出文件不会在任何构建步骤中进一步使用。然而,它在运行 c++ 项目可执行输出时使用。

这里的问题是 .foo 文件处理它们自己内部嵌套的类似 #include 的依赖文件处理。这会扰乱自定义构建步骤。 这不仅仅是 .foo => .bar 它是 .foo +(从 .foo 内容派生的大量包含)=> .bar

我基本上希望自定义构建步骤始终运行构建命令,并让 foo2bar 编译器确定输出 .bar 是否是最新的。 如何做到这一点?

尝试过:

  1. “简单”的解决方案似乎是在自定义构建步骤中列出所有包含依赖项。 这几乎是不可能的,手动管理和维护是不可行的。
  2. 将输出设置为 neverExists.bleh 这有效,它总是会触发构建。 但最后你会得到一个错误,提示输出从未创建。 2b) 您可以通过将自定义构建步骤标志“验证依赖项和输出是否存在”设置为“否”来解决该问题...但是在 Azure 构建代理上构建解决方案时,它无法检测构建错误,并且构建错误地通过不应该。 foo2bar.exe 的返回值(即错误级别)被忽略(本地构建似乎可以处理这个问题)。 任何错误消息都会被忽略(本地构建从控制台输出中捕获这些消息)。

如何使 vc++ 项目在项目源文件上运行“具有自己的包含依赖项处理的自定义编译器”? 它本身不一定是自定义构建步骤。

visual-c++ msbuild visual-studio-2022
1个回答
0
投票

如果您希望始终让 MsBuild 调用自定义构建步骤,这里有一个解决方法:

只需在 Outputs 中指定一些不存在的文件,自定义构建步骤将始终运行。即使您的项目是最新的,它也会运行,因为永远找不到输出文件。

例如

<ItemDefinitionGroup>
  <CustomBuildStep>
    <Command>xxxx</Command>
    <Outputs>$(TargetName).missing</Outputs>
    <Inputs>xxxx</Inputs>
  </CustomBuildStep>
</ItemDefinitionGroup>

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.