【问题标题】:How to get make to correctly create dependencies when generated headers are involved涉及生成的标头时如何正确创建依赖项
【发布时间】: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


【解决方案1】:

解决这个问题的方法是将文件生成为file.tmp,如果它们不同,则将file 替换为file.tmp。这样make 就看不到新文件,也不会重新启动所有内容。看看Makefiles 自动工具创建的./configure 舞蹈,它广泛使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2014-01-23
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多