Używanie komendy makefile wildcard dla nazw plików ze spacjami

8

Mam plik makefile, którego używam do kompresji zdjęć:

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

Jednak na przykład, gdy mam zdjęcie ze spacją w jego nazwie, pojawia Piper PA-28-236 Dakota.JPGsię ten błąd:

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

Myślę, że jest to problem w wildcardpoleceniu, ale nie jestem pewien, co zmienić, aby uruchomić.

Jak zmodyfikować mój plik makefile, aby zezwolić na spacje w nazwach plików?

wierzę
źródło
Zadałem to pytanie na temat Przepełnienia stosu tutaj .
iBelieve,

Odpowiedzi:

4

Zapytałem na Stack Overflow, a użytkownik o imieniu perreal pomógł mi rozwiązać ten problem, oto jego odpowiedź.

Oto, co zrobiłem, aby to działało:

  1. Służy src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')do rozwiązania problemu ze spacjami w wildcardpoleceniu i doprowadzenia obiektów docelowych do pracy ze spacjami.

  2. Pozostawia to znak zapytania w pliku wynikowego, więc korzystać z funkcji połączenia, aby wymienić ?z miejsca w końcowej pliku: replace = echo $(1) | sed 's/?/ /g'. Zadzwoń za pomocą @convert "$<" -scale 20% "``$(call replace,$@)``"(użyłem tylko jednego kliknięcia wstecznego, ale nie wiem, jak go poprawnie wyświetlić).

Oto mój końcowy plik Makefile:

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,$@)`"
wierzę
źródło