2011-07-24 85 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您可以擁有多線程的皮棉檢查:-)