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



我一直在尝试调试一个makefile.am,它偶尔会导致make中的构建失败。在这个文件中,源文件是自动生成的.c文件,头文件是自动产生的.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上创建一个依赖项。既然它们都是自动生成的,我该怎么做?此外,任何替代解决方案也将受到欢迎。

希望我的格式不会混淆。

编辑更多细节:

这些文件由protocol-c编译器自动生成:https://github.com/protobuf-c/protobuf-cprotocol-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包括其相应的标头nameX.pb-ca.h.该标头包括nameY.pb-c.h.,这让我认为nameX.proto在编译nameY.proto之前被编译为nameX.pb-c/nameX.pb-c.h。由于nameX.pb-c.h和nameY.pb-c.h之间存在include关系,因此生成失败,因为nameX.pb-ca.h需要nameY.pb-ca.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文件都是中间文件(它们是生成的,然后在整个构建过程中被丢弃(,所以我无法查看它们的外观。

像这样在整个生成文件中使用@...@替换是非常不寻常的。通常情况下,您会将替换项分配给make变量一次,然后使用该变量(除了"读起来更好"之外,如果愿意,这还允许用户在make命令行上重写该值(:

BUILDDIR = @buildDirectory@
..._SOURCES = $(BUILDDIR)/x.c
$(BUILDDIR)/y.c
$(BUILDDIR)/z.c
..._HEADERS = $(BUILDDIR)/x.h
$(BUILDDIR)/y.h
$(BUILDDIR)/z.h

此外,在我看来,可能已经有标准的automake变量覆盖了这个值;如果是这样的话,使用标准的比发明新的要好。。。但很明显,如果不了解更多的环境,就无法知道这一点。

无论如何,对于您的问题,我们需要了解更多关于这种自动生成操作的信息。你现在的自动生成规则是什么样子的?在生成.h文件之前,是否真的不能生成.c文件?这很不寻常。

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

最新更新