【问题标题】:Using makefile wildcard command for file names with spaces对带空格的文件名使用 makefile 通配符命令
【发布时间】:2012-12-20 00:36:24
【问题描述】:

我有一个用来压缩图片的makefile:

src=$(wildcard Photos/*.jpg) $(wildcard Photos/*.JPG)
out=$(subst Photos,Compressed,$(src))

all : $(out)

clean:
    @rmdir -r Compressed

Compressed:
    @mkdir Compressed

Compressed/%.jpg: Photos/%.jpg Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "$@"

Compressed/%.JPG: Photos/%.JPG Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "$@"

但是,当我的图片名称中有空格时,例如Piper PA-28-236 Dakota.JPG,我会收到以下错误:

make: *** No rule to make target `Compressed/Piper', needed by `all'.  Stop.

我认为这是wildcard 命令中的问题,但我不确定要更改什么才能使其正常工作。

如何修改我的 makefile 以允许文件名中包含空格?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    通常在文件名中包含空格对于 make 来说是个坏主意,但对于您的情况,这可能有效:

    src=$(shell find Photos/ -iname '*.JPG' | sed 's/ /\\ /g')
    
    out=$(subst Photos,Compressed,$(src))
    
    all : $(out)
    
    Compressed:
      @mkdir Compressed
    
    Compressed/%: Photos/% Compressed
      @echo "Compressing $<"
      @convert "$<" -scale 20% "$@"
    

    【讨论】:

    • 感谢您的帮助,它可以解决通配符问题中的空格问题。我将其修改为src=$(shell ls Photos | sed 's/ /\\ /g;s/.*/Photos\/\0/') 以允许JPG 和jpg。但是,现在我收到错误 make: *** No rule to make target 'Compressed/Piper PA-28-236 Dakota.JPG', needed by 'all'. Stop. 所以现在我需要弄清楚如何让带有空格的目标工作。
    • 我得到了它的工作,感谢您的所有帮助。替换为 ? 修复了目标问题,但在结果文件中添加了 ?。我最终使用了一个调用函数:replace = echo $(1) | sed 's/?/ /g',然后将它与这个命令一起使用:@convert "$&lt;" -scale 20% "`$(call replace,$@)`"
    • 我应该接受您的回答还是应该创建自己的答案,详细说明我为使其正常工作所做的一切,并显示最终的 Makefile?
    • 嗯,当我将新图像添加到Photos 目录或从Compressed 目录中删除一个压缩图像时,Makefile 会压缩所有图片,而不仅仅是新图片或一个没有压缩版本的。
    • 感谢更新的答案,它更简单。但是,我在上一条评论中描述的问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2018-12-02
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    相关资源
    最近更新 更多