由于自动生成文件 (automake),我偶尔会看到构建失败。如何在自动生成的文件之间创建依赖关系?

I'm seeing occasional build failure due to auto generated files (automake). How do I create dependencies between autogenerated files?

我一直在尝试调试 makefile.am,它偶尔会导致 make 中的构建失败。在此文件中,源是自动生成的 .c 文件,headers 是自动生成的 .h 文件。

..._SOURCES = @buildDirectory@/x.c
              @buildDirectory@/y.c
              @buildDirectory@/z.c

..._HEADERS = @buildDirectory@/x.h
              @buildDirectory@/y.h
              @buildDirectory@/z.h

失败看起来像这样

<failedproto>.proto: "symbol1" is not defined.
<failedproto>.proto: "symbol2" is not defined.
<failedproto>.proto: "symbol3" is not defined.
...
<failedproto>.proto: warning: Import <failedproto>.proto but not used.
make: *** [<failedproto>.c] Error 1
make: *** Waiting for unfinished jobs....

所有这些符号都出现在相应的.h中。这让我认为 .c 是在 .h 之前生成的,而且它只是一场直线竞赛。我已将 ..._SOURCES 和 _HEADERS 添加到 BUILT_SOURCES,但我仍然看到失败。所以我的下一个直觉是为 .c 创建对 .h 的依赖。我该怎么做,因为它们都是自动生成的?此外,任何替代解决方案也将受到欢迎。

希望我的格式没有混淆。

编辑更多细节:

这些文件由 protoc-c 编译器自动生成:https://github.com/protobuf-c/protobuf-c protoc-c 获取这些 .proto 文件并生成 .pb-c.c 和 .pb-c.h 文件,让我觉得这两个毕竟不依赖。一些内部代码也是 运行,它会生成其他 .proto 文件,我将它们称为 nameX.proto 和 nameY.proto,它们又会生成 nameX.pb-c.c/nameX.pb-c.h 和 nameY.pb-c.c/nameY.pb-c.h。 Makefile.am 更准确的例子是这样的:

..._SOURCES = @buildDirectory@/name.pb-c.c
              @buildDirectory@/nameX.pb-c.c
              @buildDirectory@/nameY.pb-c.c

..._HEADERS = @buildDirectory@/name.pb-c.h
              @buildDirectory@/nameX.pb-c.h
              @buildDirectory@/nameY.pb-c.h

我一直在尝试跟踪这些依赖关系,我将尝试描述我得出的结论。 nameX.pb-c.c 包含其对应的 header nameX.pb-c.h。 header 包含 nameY.pb-c.h,让我认为 nameX.proto 正在被编译成 nameX.pb-c.c/nameX.pb-c。 h之前nameY.proto可以编译。由于nameX.pb-c.h和nameY.pb-c.h存在include关系,构建失败,因为nameX.pb-c.h需要nameY.pb-c.h .这让我想到了两条我从一开始就怀疑的规则。这些规则概括如下:

$(OUT_DIRECTORY)/%nameX.proto:$(SRC_DIRECTORY)/name.proto $(SRC_DIRECTORY)/nameY.proto
        command $(OUT_DIRECTORY) $(FLAGS) $<

$(OUT_DIRECTORY)/%nameX.proto:$(SRC_DIRECTORY)/name.proto 
        command $(OUT_DIRECTORY) $(FLAGS) $<

这会是个问题吗?如果第二条规则确实需要第一条规则,是什么阻止了它成为 运行?

更糟糕的是,许多 .proto 文件是中间文件(它们在整个构建过程中生成然后被丢弃)所以我无法查看它们以了解它们的外观。

像这样在您的 makefile 中使用 @...@ 替换是非常不寻常的。通常你会将替换分配一次,给一个 make 变量,然后使用该变量代替(除了 "nicer to read",这允许有人在 make 命令行上覆盖这个值,如果他们想的话) :

BUILDDIR = @buildDirectory@

..._SOURCES = $(BUILDDIR)/x.c
          $(BUILDDIR)/y.c
          $(BUILDDIR)/z.c

..._HEADERS = $(BUILDDIR)/x.h
          $(BUILDDIR)/y.h
          $(BUILDDIR)/z.h

另外,在我看来,标准的 automake 变量可能已经涵盖了这个值;如果是这样,最好使用标准的而不是发明新的...但显然,如果不了解您的环境,就无法知道这一点。

无论如何,对于您的问题,我们需要了解更多有关此自动生成操作的信息。您现在的自动生成规则是什么样的?难道真的是.c文件的生成要等到.h文件才生成吗?这很不寻常。

如果您列出了输出文件、输入文件和所需的命令,那么编写正确的规则就非常简单了。