在 autotools 中生成 headers 的构建过程

build process that generates headers in autotools

我正在将 home-baked makefile 设置移植到 autotools 套件中。我 运行 遇到了一个问题,但我还没有找到合适的答案。可能是我在搜索中没有使用正确的术语。作为 autotools 的完全新手,我可能只是对行话了解不够。

问题:我们的构建过程依赖于从 csv 文件生成的 header 文件。 (我不知道为什么,就是这样。)在我们的旧系统中,我们做了这样的事情:

.PHONY: all
all : header.csv.h $(objects)

header.csv.h:
    python prebuild.py

# remainder for building objects and the file lib.a

找到 link 到 extend default rules,我已将其添加到我的 Makefile.am

noninst_LIBRARIES = libstuff.a

# .. Additional CXXFLAGS and CPPFLAGS, and listing the sources

all-local: header.csv.h

header.csv.h:
    python prebuild.py

重制的 Makefile 仍然无效。检查为库的这一部分生成的 Makefile 显示:

# lots of stuff preceeding
all: all-am
all-am: Makefile $(LIBRARIES) all-local

all-local: header.csv.h
# the rest as above

all-am: 就是问题所在。 $(LIBRARIES) 依赖项首先列出,因此首先构建。对上面扩展 link 的一些进一步阅读表明这是可以预料的:无法保证顺序。 "fix" 很简单:将 all-local 移动到 $(LIBRARIES) 之前。但是,这只会修复一次。我必须保证它总是首先构建。

我可以在 configure 脚本中添加东西以在配置过程中执行吗?处理此类事情的正确方法是什么?

您不应该根据 Makefile 中列出的顺序编写规则。根本没有理由采用此规则(我知道这是对您的旧 Makefile 的直接翻译——这也是错误的):

all-local: header.csv.h

因为header.csv.h不是需要在制作过程结束时出现的构建产品。相反,你需要

somesourcefile.o : header.csv.h

反映了真实的事实,构建 somesourcefile.o 需要头文件存在,因为 somesourcefile.cpp 包含它。如果它包含在多个地方,您可能需要多个这样的规则。

当您正确指定依赖关系时,make 将计算依赖关系图,并以正确的顺序构建事物。

还有这条规则

header.csv.h:
    python prebuild.py

几乎可以肯定

header.csv.h : header.csv prebuild.py
    python prebuild.py

确保它在源数据或翻译规则发生变化时重建,而不是在它们不发生变化时重建。