【发布时间】:2010-10-06 10:12:51
【问题描述】:
当我更改一个 Makefile 时,它的规则可能已经改变,因此应该重新评估它们,但 make 似乎不这么认为。
有没有办法在 Makefile 中说,它的所有目标,不管是哪一个,都依赖于 Makefile 本身? (不管它的名字。)
我正在使用 GNU make。
【问题讨论】:
当我更改一个 Makefile 时,它的规则可能已经改变,因此应该重新评估它们,但 make 似乎不这么认为。
有没有办法在 Makefile 中说,它的所有目标,不管是哪一个,都依赖于 Makefile 本身? (不管它的名字。)
我正在使用 GNU make。
【问题讨论】:
这看起来像是 Make 应该能够做的一件更简单、有用、合乎逻辑的事情,但事实并非如此。
这是一种解决方法。如果 clean 规则设置正确,Make 可以在 makefile 被更改时执行它,使用空的 dummy 文件作为标记。
-include dummy
dummy: Makefile
@touch $@
@$(MAKE) -s clean
这适用于大多数目标,即作为实际文件并被 clean 删除的目标,以及依赖于它们的任何目标。副作用目标和一些PHONY 目标会漏网。
【讨论】:
make clean。
make clean自动生成规则?我现在的 Makefile 没有。
clean 规则,听起来好像你在解决错误的问题。你有多少目标?
由于 GNU make 版本 4.3 现在可以使用这两个 special variable:
让每个目标都依赖于当前的 make 文件:
将以下行放在文件顶部附近(在任何包含之前,因为它会影响 MAKEFILE_LIST):
.EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))
让每个目标都依赖于当前的 make 文件以及包含的 make 文件
将以下行放在文件末尾:
.EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))
【讨论】:
我知道的唯一答案是将 makefile 显式添加到依赖项中。例如,
%.o: %.c makefile
$(CC) $(CFLAGS) -c $<
【讨论】:
$(CPPFLAGS) 添加到规则中以匹配对应的implicit rule 是个好主意