Eu tenho um makefile que eu uso para compactar imagens:
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% "$@"
No entanto, quando tenho uma imagem com um espaço em seu nome, por exemplo Piper PA-28-236 Dakota.JPG
, recebo este erro:
make: *** No rule to make target `Compressed/Piper', needed by `all'. Stop.
Eu acho que isso é um problema no wildcard
comando, mas não tenho certeza do que alterar para fazê-lo funcionar.
Como modifico meu makefile para permitir espaços nos nomes dos arquivos?
Respostas:
Eu perguntei no Stack Overflow e um usuário chamado perreal me ajudou a resolver isso, aqui está a resposta dele.
Aqui está o que eu fiz para fazê-lo funcionar:
Use
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')
para corrigir o problema de espaços nowildcard
comando e fazer com que os alvos trabalhem com espaços.Isso deixa um ponto de interrogação no arquivo resultante, então use uma função chamada para substituir
?
com um espaço no arquivo final:replace = echo $(1) | sed 's/?/ /g'
. Chame isso com@convert "$<" -scale 20% "``$(call replace,$@)``"
(usei apenas um backtick, mas não sei como exibi-lo corretamente).Então, aqui está o meu Makefile final:
fonte