2015-10-21 44 views
1

以下規則清除makefile中的所有二進制文件不起作用。makefile中的bash內建命令

SHELL:=bash 
PHONY: clean 
clean: 
    for file in {"greedy","mario","pset1_mario","credit","hello"}; do \ 
     [[ -e "${file}" ]] && rm ${file}; \ 
    done 

它給出了以下錯誤信息。

recipe for target 'clean' failed make: *** [clean] Error 1 

如果我使用make文件中的相同命令調用另一個shell腳本,它將起作用。

clean: 
    bash ./cleanup.sh 

有沒有辦法將這些命令放入makefile文件本身?

+1

您需要兩個變量的美元符號:'$$ {file}'在該上下文中。 – lurker

回答

1

因爲Error 1不是你認爲的那樣。

在makefile中使用SHELL:=/bin/bash -x,你會發現你沒有運行你期望運行的東西。

具體來說,你忘了逃避make的食譜$所以不是在-e測試該列表中測試每名正在測試的空字符串([ -e "" ])。然後每次都通過循環失敗。

最後一次循環時失敗for循環結束,因爲在循環的最後一個命令以失敗返回整個循環退出,失敗的返回值結束,因此使看到了失敗告終的腳本和報道說。

你想這樣的:

SHELL:=bash 
.PHONY: clean 
clean: 
     for file in {"greedy","mario","pset1_mario","credit","hello"}; do \ 
      [[ ! -e "$${file}" ]] || rm $${file}; \ 
     done 

注意在shell變量雙$$並注意測試和條件的反轉。使配方行需要返回成功,除非你想讓它們終止make。

另請注意.PHONY那裏。 PHONY只是一個正常的目標。

更新:

這大概也是值得指出的是,這個片段特別收益從支架擴張或[[測試特定的bash全無並可以很容易地在一個sh兼容的方式改寫:

clean: 
     for file in greedy mario pset1_mario credit hello; do \ 
      [ ! -e "$${file}" ] || rm $${file}; \ 
     done 
+1

...並且「刪除如果存在,否則默默忽略」的概念正是「rm -f」所做的 –