2015-10-21 40 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”所做的 –