web-dev-qa-db-fra.com

Utilisation de la commande makefile wildcard pour les noms de fichier avec des espaces

J'ai un fichier makefile que j'utilise pour compresser des 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 commande wildcard, mais je ne sais pas quoi changer pour que cela fonctionne.

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

8
iBelieve

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

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

  1. Utilisez src=$(Shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/') pour résoudre le problème des espaces dans la commande wildcard et pour que les cibles fonctionnent avec des espaces.

  2. Cela laisse un point d'interrogation dans le fichier résultant. Utilisez donc une fonction d'appel pour remplacer ? par 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,$@)`"
4
iBelieve