为什么Bash-in-Makefile表达式不起作用?

时间:2015-05-11 15:42:01

标签: bash makefile gnu-make

直接粘贴到我的shell中,以下尝试3个正则表达式中的每一个并且有效(参见<source path="plugin/campaign/rpc"> <exclude name="**/impl/**"/> </source> ):

*.{jpg,png,gis.tif}

作为makefile进程,它失败并返回:

for file in ./output/India/*.{jpg,png,gis.tif}; do echo $file; openssl base64 -in $file -out ./output/India/`basename $file`.b64; done;

并返回:

task: 
  for file in ./output/India/*.{png,jpg,gis.tif} ; \
    do echo $$file ; openssl base64 -in $$file -out ./output/India/`basename $$file`.b64; \
  done

为什么当Bash在makefile中时,这个表达式不起作用?

2 个答案:

答案 0 :(得分:5)

我被提示勾勒出 make 如何为你做繁重的工作。

因此,您希望将.jpg中的所有源文件(.png.gis.tifoutput/India/)转换为其base64编码的等效文件。草图:

.PHONY: all
all: # default target

dir := output/India/
exts := jpg png gis.tif
wildcards := $(addprefix ${dir}*.,${exts})
sources := $(wildcard ${wildcards})
targets := $(addsuffix .b64,${sources})

${targets}: %.b64: %
     openssl base64 -in $< -out $@

all: ${targets}
all: ; : $@ Success

这比它需要的更冗长,通常我反对使用$(wildcard …)。哦,好吧。

那么我们在shell版本上有什么优势呢?

  1. make -j5将同时进行5次转化。如果你有四个CPU,那就好了
  2. 转换在第一个错误时停止(如磁盘完全说)
  3. 自上次转换后未更改的文件未重新转换
  4. 没有狡猾的shell语法(虽然 sh make 的重要部分)
  5. UNTESTED BTW。抱歉。

答案 1 :(得分:4)

默认使用/bin/sh,它不支持大括号展开。

通过在makefile中设置SHELL变量告诉make使用不同的shell,不要在make规则中使用大括号扩展,或者运行脚本而不是内联配方(可以运行哪个脚本)由bash / etc。)。