我试图让make自动构建一些生成的头文件,然后自动创建依赖项(.d
)文件。但是我不确定如何正确地按正确的顺序制作两个目标。
这是我到目前为止所做的:
all: test
test: test.o
g++ test.o -o test
test.o: test.cc test.d external-headers
g++ test.cc -c -o test.o
test.d: test.cc external-headers
g++ -MM -MT $@ $< -o $@
external/some_header.hh:
mkdir -p external
touch external/some_header.hh
.PHONY: external-headers
-include test.d
external-headers: external/some_header.hh
查看依赖项看起来是正确的,因为在创建任何.d
文件之前我必须创建外部标头。此外,如果缺少外部标头,则必须重新生成它们。然而,这个小的Makefile导致GNU make进入无限循环。我使用了调试选项,找出它为什么这样做。
我能看到的是,每次重新创建任何包含的文件时,make都会自动重启。这没关系,我期待的。但是,每次重新启动时,它都会重新创建external-headers
目标,因为它是虚假的。但是,虽然它不必在后续目标中创建任何内容,但这意味着自上次调用以来重建了包含的依赖目标,因此它重建了它的包含然后重新启动。
这个问题有一个很好的解决方案吗?我最简单的想法是让.d
文件直接依赖于标题external/some_header.hh
并跳过目标。经过测试,这很好用。但是在实际情况中,我有一大堆生成的标题,我希望能够轻松地立即重建所有标题。
我的另一个想法是在某个地方添加一个实际上称为external-headers
的文件,并在每次调用此目标时触摸此文件。这种方式可以在最后一次重建目标时存储,并且实际上注意到它不需要做任何事情。
有没有更好的方法来处理这样的事情?
答案 0 :(得分:1)
周围的问题是生成file.tmp
文件,如果file
不同,请将file.tmp
替换为make
。这样Makefile
没有看到新文件,也没有重启所有内容。查看使用./configure
舞蹈创建的{{1}}个autotools,它会广泛使用它。