在autotools中生成标头的构建过程

时间:2015-02-25 00:43:12

标签: linux autotools automake

我将自制的makefile设置移植到autotools套件中。我遇到了一个我尚未找到合适答案的问题。可能是因为我在搜索中没有使用正确的字词。作为autotools的完全新手,我可能只是不太了解行话。

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

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

header.csv.h:
    python prebuild.py

# remainder for building objects and the file lib.a

找到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)依赖项首先列出,因此首先构建。上面的扩展链接的一些进一步阅读表明这是预期的:无法保证订单。它非常简单,可以修复":将all-local移到$(LIBRARIES)之前。但是,这只能修复一次。我必须保证这首先是建立的。

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

1 个答案:

答案 0 :(得分:1)

您不应该编写依赖于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

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