当我修改一个Makefile时,它的规则可能已经改变,因此它们应该被重新评估,但是make似乎并不这样认为。
有没有办法在Makefile中指定,所有目标都依赖于Makefile本身,无论其名称如何?
我正在使用GNU make。
注:Makefile是一种用来描述文件之间依赖关系的格式化文件。make是一个工具程序,通过读取Makefile来自动执行一系列命令,以达到构建软件的目的。
这似乎是Make应该能够实现但却未能做到的一件简单、有用、合乎逻辑的事情。
以下是一个解决方法。如果正确设置了clean
规则,Make就可以使用一个空的dummy
文件作为标记,每当makefile被修改时执行该规则。
-include dummy
dummy: Makefile
@touch $@
@$(MAKE) -s clean
这对于大多数目标都有效,也就是那些实际上是文件并且被clean删除的目标,以及依赖它们的任何目标。副作用目标和一些PHONY
目标将会通过检查。
自GNU make 4.3版本以来,使用这两个特殊变量,现在可以实现以下功能:
使每个目标都依赖于当前make文件:
将以下行放置在文件顶部(在任何include之前,因为它会影响MAKEFILE_LIST):
.EXTRA_PREREQS:= $(abspath $(lastword $(MAKEFILE_LIST)))
让每个目标都依赖于当前的make文件以及已经被包含的make文件
将以下行放在您的文件末尾:
.EXTRA_PREREQS+=$(foreach mk, ${MAKEFILE_LIST},$(abspath ${mk}))
%.o: %.c makefile
$(CC) $(CFLAGS) -c $<
make clean
。 - reinierpost