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



直接粘贴到我的外壳中,以下尝试了3条正则效果(请参阅*.{jpg,png,gis.tif}):

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

作为一个makefile过程,它失败并返回:

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

和返回:

47910543179104:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('./output/India/*.{png,jpg,gis.tif}','r')

为什么当bash在makefile中时,此表达式不起作用?

我被提示给我绘制 make 如何为您做繁重的素描。

因此,您要将output/India/中的所有源文件(.jpg.png.gis.tif)转换为其基本64编码的等效物。草图:

.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 …)。哦,好。

那么,我们在这里有什么优点?

  1. make -j5将立即进行5个转换。如果您有四个CPU
  2. 转换停止在第一个错误(如磁盘完整说)
  3. 自上次转换以来没有更改的文件未重新转换
  4. 没有狡猾的壳语法(尽管 sh make )的重要组成部分)

未经测试的btw。对不起。

默认情况下使用/bin/sh,并且不支持Brace扩展。

通过在makefile内部设置SHELL变量,请不要在制造规则中使用brace扩展,或者运行脚本而不是直列配方(可以由 bash/etc运行脚本,请不要使用brace扩展,要么告诉使用其他外壳。。

最新更新