2012-02-15 65 views
2

我想让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 [email protected] $< -o [email protected] 

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目标,因为它是假的。但是,尽管不需要在后续目标中创建任何内容,但这意味着inclues的依赖目标自上次调用以来已重新构建,因此它将重新构建包含并重新启动。

有没有很好的解决这个问题?我得到的最简单的想法是使.d文件直接依赖标题external/some_header.hh并跳过两者之间的目标。当测试这工作正常。然而,在真实情况下,我有一大堆生成的头文件,我希望能够轻松地一次性重建所有头文件。

我的另一个想法是在某个地方添加一个文件,这个文件实际上叫做external-headers,每次调用这个目标时都会触摸这个文件。这种方式可以在最后重建目标时进行存储,并且实际上注意到它不需要执行任何操作。

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

+1

如果您“想要轻松地一次重建[所有外部头文件]”,为什么不按照您所说的使'.d'文件依赖于特定的头文件,而是在您想要的时候保持PHONY目标重建他们所有的人? – Beta 2012-02-15 21:18:15

+0

@Beta:这实际上是我目前使用的解决方案。我想我现在会这样,因为make似乎没有提供更好的选择。 – LiKao 2012-02-16 09:19:13

+0

相关问题:http://stackoverflow.com/questions/5229561/gnu-make-generating-automatic-dependencies-with-generated-header-files – kostmo 2015-03-01 03:53:38

回答

1

围绕此问题产生的文件是生成file.tmp文件,并且如果它们不同,则用file.tmp替换file。这种方式make没有看到一个新的文件,并没有重新启动一切。请看Makefile的自动工具创建舞蹈./configure,它广泛使用。