【问题标题】:Why Bash-in-Makefile expression doesn't work?为什么 Bash-in-Makefile 表达式不起作用?
【发布时间】:2015-05-11 15:42:01
【问题描述】:

直接粘贴到我的 shell 中,以下尝试了 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 中编写了一个 shell for 循环,那么你可能做错了。在这里,您将 .png 转换为 .b64(例如)。这听起来像是 make 的直接工作。这样做有很多好处:增量构建、并行操作、错误检查......
  • @bobbogo:谢谢你的评论,你有什么实际的例子可以展示/链接,以便我们学习你的方法吗?随时以您处理此问题的方式发布答案,这将对善意的学习者有所帮助,我肯定会 +1。

标签: bash makefile gnu-make


【解决方案1】:

我被提示简要说明 make 如何为您完成繁重的工作。

因此,您希望将 output/India/ 中的所有源文件(.jpg、.png、.gis.tif)转换为它们的 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 的重要组成部分)

未经测试顺便说一句。抱歉。

【讨论】:

  • 感谢这个速成课程。个人笔记:addprefix、wildcard、addsuffix 如果我做对了,请制定特定的语法。 %.b64: % 从 ${targets} 中删除 .b64 扩展名。新手很难,而且超级有趣!
  • 是的,gnu make 带有一些函数,所有函数都通过$(funcname args) 语法访问。 %.b64: % 实际上是静态模式规则 的一部分,并且(在这种情况下)简洁地表示当相应的% 文件发生更改时.b64 文件已过期(它取决于它)。
【解决方案2】:

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

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

【讨论】:

  • 好的,按照你的回答,我很残忍:for file in ./output/$(NAME)/*.png ./output/$(NAME)/*.jpg ./output/$(NAME)/*.gis.tif:D
猜你喜欢
  • 2015-04-13
  • 2014-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多