你如何在makefile中中止shell命令错误?

时间:2011-07-24 06:11:58

标签: php makefile

我正在尝试编写一个makefile来打包一些PHP脚本。我还希望在构建最终的zip文件之前检查语法错误(使用内置的php lint工具),以防止任何意外错误滑入。

到目前为止我已经

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循环吗?如何让make中止shell命令错误?

2 个答案:

答案 0 :(得分:5)

您可以这样做:

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

答案 1 :(得分:3)

for食谱中的shell dist循环隐藏了php -l的退出状态,因此它不知道退出。 Mat's answer显示了如何通过让she​​ll命令在出错时退出来解决这个问题。

可以完全避免shell循环:

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*"

现在有phony targetstatic pattern rule来运行每个php -l命令。如果其中任何一个失败,dist配方将无法运行。这可能比shell循环更难阅读,但它意味着a)来自make本身的错误消息将为您指出有问题的文件,b)使用make -j您可以进行多线程lint检查: - )