2011-07-24 86 views
2

我想写一个makefile来打包一些PHP脚本。我也想它来检查语法错误(使用内置的PHP皮棉工具)建立最终的zip文件之前,以防止打滑任何意外的错误。如何中止makefile中的shell命令错误?

到目前为止,我有

all: dist 
clean: 
    rm -f output.zip 
dist: clean 
    for i in `find . -name "*.php"`; do php -l $$i; done 
    zip -r output.zip src -x "*/.*" "*/tests*" 

这的作品,但如果有一个PHP错误,我希望它打破并不继续构建zip文件(出于显而易见的原因)。目前他们可能会迷失在成功的lint运行和zip文件的输出页面中。

我对此有何看法?我应该使用make循环而不是shell循环吗?如何让shell中的命令错误中止?

回答

5

你可以做这样的事情:

for i in `find . -name "*.php"`; do \ 
    php -l $$i; \ 
    if [ $$? -ne 0 ] ; then exit 42 ; fi \ 
done 
3

外壳for循环在你dist配方隐藏的php -l make的退出状态,所以它不知道退出。 Mat's answer展示了如何通过让she​​ll命令在出错时退出来解决这个问题。

外壳循环可以完全避免这样的:

all: dist 
clean: 
    rm -f output.zip 
LINT_TARGETS := $(addprefix lint-,$(shell find . -name "*.php")) 
.PHONY: $(LINT_TARGETS) 
$(LINT_TARGETS):lint-%:% 
    php -l $< 
dist: clean $(LINT_TARGETS) 
    zip -r output.zip src -x "*/.*" "*/tests*" 

现在有一个static pattern rule一个phony target运行每个php -l命令。如果其中任何一个失败,那么dist配方将不会运行。这可能比shell循环更难读取,但这意味着a)来自make的错误消息会为您指出问题文件,并且b)使用make -j您可以拥有多线程的皮棉检查:-)