如何在生成标头时正确创建依赖关系

时间:2012-02-15 16:21:40

标签: dependencies makefile

我试图让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的文件,并在每次调用此目标时触摸此文件。这种方式可以在最后一次重建目标时存储,并且实际上注意到它不需要做任何事情。

有没有更好的方法来处理这样的事情?

1 个答案:

答案 0 :(得分:1)

周围的问题是生成file.tmp文件,如果file不同,请将file.tmp替换为make。这样Makefile没有看到新文件,也没有重启所有内容。查看使用./configure舞蹈创建的{{1}}个autotools,它会广泛使用它。