【发布时间】:2023-03-24 05:40:01
【问题描述】:
我正在尝试让 make 自动构建一些生成的标头,然后自动创建依赖 (.d) 文件。但是我不确定如何让 make 以正确的顺序正确地完成这两个目标。
这是我目前所拥有的:
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 的文件,并在每次调用此目标时触摸该文件。这样,make 可以存储上次重建目标的时间,并且实际上注意到它不需要做任何事情。
有没有更好的方法来处理这样的事情?
【问题讨论】:
-
如果您“希望能够轻松地一次重建 [所有外部头文件]”,为什么不让
.d文件依赖于您所说的特定头文件,但保留 PHONY 目标什么时候要重建所有这些? -
@Beta:这实际上是我目前使用的解决方案。我想我现在就这样吧,因为 make 似乎没有提供更好的选择。
标签: dependencies makefile