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 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 wildcardcomando, mas não tenho certeza do que alterar para fazê-lo funcionar.

Como modifico meu makefile para permitir espaços nos nomes dos arquivos?


Eu fiz essa pergunta no Stack Overflow aqui .
IBelieve

Respostas:


4

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:

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

  2. 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:

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,$@)`"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.