Verwenden des Platzhalterbefehls makefile für Dateinamen mit Leerzeichen

8

Ich habe ein Makefile, mit dem ich Bilder komprimiere:

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

Wenn ich jedoch beispielsweise ein Bild mit einem Leerzeichen im Namen habe, wird folgende Piper PA-28-236 Dakota.JPGFehlermeldung angezeigt:

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

Ich denke, dies ist ein Problem im wildcardBefehl, aber ich bin nicht sicher, was ich ändern soll, damit es funktioniert.

Wie ändere ich mein Makefile, um Leerzeichen in Dateinamen zuzulassen?

Ich glaube
quelle
Ich habe diese Frage zu Stack Overflow hier gestellt .
iBelieve

Antworten:

4

Ich habe nach Stack Overflow gefragt und ein Benutzer namens perreal hat mir geholfen, dieses Problem zu lösen. Hier ist seine Antwort.

Folgendes habe ich getan, um es zum Laufen zu bringen:

  1. Verwenden Sie src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')diese Option, um das Leerzeichenproblem im wildcardBefehl zu beheben und Ziele dazu zu bringen, mit Leerzeichen zu arbeiten.

  2. Dies hinterlässt ein Fragezeichen in der resultierenden Datei. Verwenden Sie daher eine Aufruffunktion, um sie ?durch ein Leerzeichen in der endgültigen Datei zu ersetzen : replace = echo $(1) | sed 's/?/ /g'. Nennen Sie dies mit @convert "$<" -scale 20% "``$(call replace,$@)``"(Ich habe nur einen Backtick verwendet, aber ich weiß nicht, wie ich ihn richtig anzeigen kann).

Also, hier ist mein letztes 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,$@)`"
Ich glaube
quelle