Utilisation de la commande générique makefile pour les noms de fichiers avec des espaces

8

J'ai un makefile que j'utilise pour compresser les images:

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

Cependant, lorsque j'ai une image avec un espace dans son nom, par exemple Piper PA-28-236 Dakota.JPG, j'obtiens cette erreur:

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

Je pense que c'est un problème dans la wildcardcommande, mais je ne sais pas quoi changer pour le faire fonctionner.

Comment modifier mon makefile pour autoriser les espaces dans les noms de fichiers?

Je crois
la source
J'ai posé cette question sur Stack Overflow ici .
iBelieve

Réponses:

4

J'ai demandé sur Stack Overflow et un utilisateur nommé perreal m'a aidé à résoudre ce problème, voici sa réponse.

Voici ce que j'ai fait pour le faire fonctionner:

  1. Permet src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')de résoudre le problème des espaces dans la wildcardcommande et d'obtenir des cibles pour travailler avec les espaces.

  2. Cela laisse un point d'interrogation dans le fichier résultant, utilisez donc une fonction d'appel pour remplacer ?un espace dans le fichier final: replace = echo $(1) | sed 's/?/ /g'. Appelez cela avec @convert "$<" -scale 20% "``$(call replace,$@)``"(je n'ai utilisé qu'un seul backtick, mais je ne sais pas comment l'afficher correctement).

Alors, voici mon Makefile final:

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,$@)`"
Je crois
la source