2010-01-23 91 views

回答

19

有几种技术有代码执行的目标是前建成。你应该选择哪一个取决于你想要做什么,以及你为什么要这样做。 (zsh脚本是做什么的?你为什么要执行它?)

你可以像@约翰建议的那样做;将zsh脚本作为第一个依赖项。您应该将zsh目标标记为.PHONY,除非它实际上生成名为zsh的文件。

另一种解决方案(在GNU作出,至少)是调用​​$(shell ...)用作变量赋值的一部分:

ZSH_RESULT:=$(shell zsh myscript.zsh) 

这将一旦生成文件被解析执行脚本,并且前任何目标被执行。如果您递归调用makefile,它也会执行脚本。

+2

请注意,即使make给出-n,--just -print,--dry-run,--recon选项,'$(shell ...)'也会运行。 – thejoshwolfe 2011-07-26 03:00:38

+0

很好的答案。有什么方法可以在退出make时运行命令?在这里发布一个问题:http://stackoverflow.com/questions/20582006/force-makefile-to-execute-script-after-building-any-target-just-before-exiting – PonyEars 2013-12-14 10:15:12

9

只是要了其他目标之一的扶养

foo.obj : zsh foo.c 
    rule for compileing foo.c 

zsh: 
    rule for running zsh script. 

或替代,使你的第一个目标依赖于它

goal: zsh foo.exe 
+2

这里的第一个解决方案的问题是,即使foo.c没有被更新,它也会强制每次重建foo.obj。第二个问题是现在你不能用多个目标调用你的makefile。 – 2015-02-18 21:48:23

2

使用MAKECMDGOALS和双冒号规则在makefile中进行预处理和后处理的解决方案。

MAKECMDGOALS是在命令行中列出的目标。

第一步是从命令行获取第一个和最后一个目标, 或者如果没有列出目标,请使用默认目标。

ifneq ($(MAKECMDGOALS),) 
FIRST_GOAL := $(word 1, $(MAKECMDGOALS)) 
LAST_GOAL := $(word $(words $(MAKECMDGOALS)), $(MAKECMDGOALS)) 
else 
FIRST_GOAL := all 
LAST_GOAL := all 
endif 

双冒号规则允许按顺序执行相同目标的多个配方。您必须更改所有命令行目标以加倍冒号规则。

#Dummy rule to set the default 
.PHONY: all 
all :: 

#Preprocessing 
$(FIRST_GOAL) :: 
    echo "Starting make..." 

all :: normal_prerequistes 
    normal_recipe 

other_stuff 

#Postprocessing 
$(LAST_GOAL) :: 
    echo "All done..."