我将自制的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
脚本吗?处理这样的事情的正确方法是什么?
答案 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
确保在源数据或转换规则发生变化时重建,而不是在它们不变时重建。