Usando o comando curinga makefile para nomes de arquivos com espaços

8

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 no nome, por exemplo, Piper PA-28-236 Dakota.JPG , recebo este erro:

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

Acho que isso é um problema no comando wildcard , mas não tenho certeza do que alterar para que funcione.

Como modifico meu makefile para permitir espaços em nomes de arquivos?

    
por iBelieve 20.12.2012 / 00:29

1 resposta

4

Eu perguntei no Stack Overflow e um usuário chamado perreal me ajudou a resolver isso, aqui é a resposta dele.

Veja o que eu fiz para funcionar:

  1. Use src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/wildcard/') para corrigir o problema de espaços no comando ? e fazer com que os destinos trabalhem com espaços.

  2. Isso deixa um ponto de interrogação no arquivo resultante, portanto, use uma função de chamada para substituir replace = echo $(1) | sed 's/?/ /g' por um espaço no arquivo final: @convert "$<" -scale 20% "''$(call replace,$@)''" . Chame isso de %code% (eu usei apenas um backtick, mas não sei como obtê-lo para exibir corretamente).

Então, aqui está meu Makefile final:

src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/
src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/%pre%/')
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,$@)'"
/') 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,$@)'"
    
por iBelieve 20.12.2012 / 03:28

Tags