GNU make 中的全局先决条件 - 是否可能
Global prerequisite in GNU make - is it possible
我有一个包含大量目标的 Makefile,并且希望先执行某个脚本,而不管调用的目标是什么。我喜欢称其为全局先决条件。
我不想为脚本创建目标并将其设置为所有现有目标的先决条件(正如我所说,这些目标并不少见)。此外,其他人可以在将来添加目标而不是将我的脚本添加为他们的目标的先决条件,因此全局先决条件会解决这个问题。
GNU-make 是否提供实现此目的的方法?
有一个不修改现有 Makefile
的解决方案(与 tripleee 指向的答案的主要区别)。只需创建一个 makefile
包含:
.PHONY: all
all:
pre-script
@$(MAKE) -f Makefile --no-print-directory $(MAKECMDGOALS) MAKE='$(MAKE) -f Makefile'
post-script
$(MAKECMDGOALS): all ;
唯一的缺点是 pre- 和 post- 脚本将始终是 运行,即使没有其他事情可做。但是,如果您使用 --dry-run
选项之一调用 make,它们将不会是 运行(与 tripleee 指向的答案的其他区别)。
另一种方法:
-include dummy
.PHONY: dummy
dummy:
run-the-script
Make 将始终尝试重建 makefile 试图包含的任何文件(如果它已过期或不存在)。在这种情况下,没有这样的文件,构建它的规则运行脚本而不做任何其他事情。
我有一个包含大量目标的 Makefile,并且希望先执行某个脚本,而不管调用的目标是什么。我喜欢称其为全局先决条件。
我不想为脚本创建目标并将其设置为所有现有目标的先决条件(正如我所说,这些目标并不少见)。此外,其他人可以在将来添加目标而不是将我的脚本添加为他们的目标的先决条件,因此全局先决条件会解决这个问题。
GNU-make 是否提供实现此目的的方法?
有一个不修改现有 Makefile
的解决方案(与 tripleee 指向的答案的主要区别)。只需创建一个 makefile
包含:
.PHONY: all
all:
pre-script
@$(MAKE) -f Makefile --no-print-directory $(MAKECMDGOALS) MAKE='$(MAKE) -f Makefile'
post-script
$(MAKECMDGOALS): all ;
唯一的缺点是 pre- 和 post- 脚本将始终是 运行,即使没有其他事情可做。但是,如果您使用 --dry-run
选项之一调用 make,它们将不会是 运行(与 tripleee 指向的答案的其他区别)。
另一种方法:
-include dummy
.PHONY: dummy
dummy:
run-the-script
Make 将始终尝试重建 makefile 试图包含的任何文件(如果它已过期或不存在)。在这种情况下,没有这样的文件,构建它的规则运行脚本而不做任何其他事情。