我希望在make退出时执行一个shell命令,无论它构建了什么目标。似乎make没有直接实现这一功能的方法。但是,以下是一个例子,在启动时让make执行一个shell命令,而不管目标是什么:
强制Makefile在构建目标之前执行脚本
是否有类似的方法可以让make在退出之前执行一次shell命令?我可以将该命令放在每个目标的底部,但是a)它会被执行多次,b)这很丑陋且难以管理。
正如Janos所说,make没有内置的功能来完成此操作。您可以使用他建议的包装器。您还可以通过递归将其推入您的makefile中,如果您愿意接受某些程度的“bleah”。它可能看起来像这样:
ifdef RECURSING
... normal makefile goes here ...
else
.DEFAULT all:
@$(MAKE) RECURSING=true $@ ; r=$$? ; \
<extra shell command here>; \
exit $$r
endif
foo bar:
make -f other.mk $@
@echo finished
.PHONY: foo bar
other.mk:
foo bar:
@echo Building $@
然后运行"make -f wrapper.mk foo",wrapper.mk运行other.mk来构建foo。.PHONY目标意味着无论文件是否存在,这些目标都将每次传递给other.mk进行考虑。
这需要在wrapper.mk中列出所有目标-可能有使用默认规则或匹配任何规则的方法可以避免这种情况。
make
,然后运行你想要的自定义操作:#!/bin/sh
make "$@" && ./custom_script.sh
将@Gavin Smith和@MadScientist的答案与以下其他问题相结合:
我建立了这个:
Makefile
ECHOCMD:=/bin/echo -e
SHELL := /bin/bash
define DEFAULTTARGET :=
printf 'Calling makerules.mk "%s"\n\n' "${MAKECMDGOALS}"
make -f makerules.mk ${MAKECMDGOALS}
printf '\n'
printf 'Running something after all rules finished\n'
endef
%:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval IS_MAKEFILE_RUNNING_TARGETS=1)
all:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval IS_MAKEFILE_RUNNING_TARGETS=1)
makerules.mk
all:
printf 'Calling my all rule\n'
foo:
printf 'Calling my foo rule\n'
bar:
printf 'Calling my bar rule\n'
xyzzy:
printf 'Calling my xyzzy rule\n'
使用示例:
make
printf '调用 makerules.mk "%s"\n\n' ""
调用 makerules.mk ""
make -f makerules.mk
make[1]: 进入目录 '/cygdrive/d/User/Downloads'
printf '调用我的所有规则\n'
调用我的所有规则
make[1]: 离开目录 '/cygdrive/d/User/Downloads'
printf '\n'
printf '在所有规则完成后运行一些东西\n'
在所有规则完成后运行一些东西
make all
printf '调用 makerules.mk "%s"\n\n' "all"
调用 makerules.mk "all"
make -f makerules.mk all
make[1]: 进入目录 '/cygdrive/d/User/Downloads'
printf '调用我的所有规则\n'
调用我的所有规则
make[1]: 离开目录 '/cygdrive/d/User/Downloads'
printf '\n'
printf '在所有规则完成后运行一些东西\n'
在所有规则完成后运行一些东西
make all foo
printf '调用 makerules.mk "%s"\n\n' "all foo"
调用 makerules.mk "all foo"
make -f makerules.mk all foo
make[1]: 进入目录 '/cygdrive/d/User/Downloads'
printf '调用我的所有规则\n'
调用我的所有规则
printf '调用我的 foo 规则\n'
调用我的 foo 规则
make[1]: 离开目录 '/cygdrive/d/User/Downloads'
printf '\n'
printf '在所有规则完成后运行一些东西\n'
在所有规则完成后运行一些东西
make all foo bar
printf '调用 makerules.mk "%s"\n\n' "all foo bar"
调用 makerules.mk "all foo bar"
make -f makerules.mk all foo bar
make[1]: 进入目录 '/cygdrive/d/User/Downloads'
printf '调用我的所有规则\n'
调用我的所有规则
printf '调用我的 foo 规则\n'
调用我的 foo 规则
printf '调用我的 bar 规则\n'
调用我的 bar 规则
make[1]: 离开目录 '/cygdrive/d/User/Downloads'
printf '\n'
printf '在所有规则完成后运行一些东西\n'
在所有规则完成后运行一些东西
make all foo bar xyzzy
printf '调用 makerules.mk "%s"\n\n' "all foo bar xyzzy"
调用 makerules.mk "all foo bar xyzzy"
make -f makerules.mk all foo bar xyzzy
make[1]: 进入目录 '/cygdrive/d/User/Downloads'
printf '调用我的所有规则\n'
调用我的所有规则
printf '调用我的 foo 规则\n'
调用我的 foo 规则
printf '调用我的 bar 规则\n'
调用我的 bar 规则
printf '调用我的 xyzzy 规则\n'
调用我的 xyzzy 规则
make[1]: 离开目录 '/cygdrive/d/User/Downloads'
printf '\n'
printf '在所有规则完成后运行一些东西\n'
在所有规则完成后运行一些东西
相关问题:
这与上面的内容相同,但现在您可以在单个Makefile
中拥有所有内容:
Makefile
ECHOCMD:=/bin/echo -e
SHELL := /bin/bash
ifeq (${IS_MAKEFILE_RUNNING_TARGETS},)
MAKEFILE_JUSTNAME := $(firstword ${MAKEFILE_LIST})
define DEFAULTTARGET :=
printf 'Calling "%s" "%s"\n\n' "${MAKEFILE_JUSTNAME}" "${MAKECMDGOALS}"
make -f ${MAKEFILE_JUSTNAME} ${MAKECMDGOALS}
printf '\n'
printf 'Running something after all rules finished\n'
endef
%:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval export IS_MAKEFILE_RUNNING_TARGETS=1)
all:
@:
# printf 'IS_MAKEFILE_RUNNING_TARGETS="%s"\n' "${IS_MAKEFILE_RUNNING_TARGETS}"
$(if ${IS_MAKEFILE_RUNNING_TARGETS},,${DEFAULTTARGET})
$(eval export IS_MAKEFILE_RUNNING_TARGETS=1)
else
all:
printf 'Calling my all rule\n'
foo:
printf 'Calling my foo rule\n'
bar:
printf 'Calling my bar rule\n'
xyzzy:
printf 'Calling my xyzzy rule\n'
endif