Menggunakan perintah wildcard makefile untuk nama file dengan spasi

8

Saya memiliki makefile yang saya gunakan untuk mengompres gambar:

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% "$@"

Namun, ketika saya memiliki gambar dengan spasi di namanya, misalnya Piper PA-28-236 Dakota.JPG, saya mendapatkan kesalahan ini:

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

Saya pikir ini adalah masalah dalam wildcardperintah, tetapi saya tidak yakin apa yang harus diubah untuk membuatnya berfungsi.

Bagaimana cara memodifikasi makefile saya untuk memungkinkan spasi dalam nama file?

aku percaya
sumber
Saya telah menanyakan pertanyaan ini tentang Stack Overflow di sini .
iBelieve

Jawaban:

4

Saya bertanya pada Stack Overflow dan seorang pengguna bernama perreal membantu saya untuk menyelesaikan ini, inilah jawabannya.

Inilah yang saya lakukan untuk membuatnya bekerja:

  1. Gunakan src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')untuk memperbaiki masalah spasi dalam wildcardperintah dan dapatkan target untuk bekerja dengan spasi.

  2. Ini daun tanda tanya dalam file yang dihasilkan, sehingga menggunakan fungsi panggilan untuk mengganti ?dengan ruang dalam file akhir: replace = echo $(1) | sed 's/?/ /g'. Sebut ini dengan @convert "$<" -scale 20% "``$(call replace,$@)``"(saya hanya menggunakan satu backtick, tapi saya tidak tahu bagaimana cara menampilkannya dengan benar).

Jadi, inilah Makefile terakhir saya:

src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
out=$(subst Photos,Compressed,$(src))

replace = echo $(1) | sed 's/?/ /g'

all : $(out)

clean:
    @rmdir -r Compressed

Compressed:
    @mkdir Compressed

Compressed/%.jpg: Photos/%.jpg Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "`$(call replace,$@)`"

Compressed/%.JPG: Photos/%.JPG Compressed
    @echo "Compressing $<"
    @convert "$<" -scale 20% "`$(call replace,$@)`"
aku percaya
sumber