Использование подстановочной команды makefile для имен файлов с пробелами

8

У меня есть make-файл, который я использую для сжатия изображений:

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

Однако, когда у меня есть изображение с пробелом в имени, например Piper PA-28-236 Dakota.JPG, я получаю эту ошибку:

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

Я думаю, что это проблема в wildcardкоманде, но я не уверен, что изменить, чтобы заставить это работать.

Как я могу изменить мой make-файл, чтобы в пробелах были указаны пробелы

Я считаю
источник
Я задал этот вопрос о переполнении стека здесь .
iBelieve 20.12.12

Ответы:

4

Я спросил о переполнении стека, и пользователь с именем perreal помог мне решить эту проблему, вот его ответ.

Вот что я сделал, чтобы заставить его работать:

  1. Используется src=$(shell ls Photos | sed 's/ /?/g;s/.*/Photos\/\0/')для исправления проблемы пробелов в wildcardкоманде и получения целей для работы с пробелами.

  2. Это оставляет знак вопроса в полученном файле, поэтому используйте функцию вызова , чтобы заменить ?пробелом в конечном файле: replace = echo $(1) | sed 's/?/ /g'. Назовите это с @convert "$<" -scale 20% "``$(call replace,$@)``"(я использовал только одну обратную черту, но я не знаю, как заставить это отображаться правильно).

Итак, вот мой последний Makefile:

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,$@)`"
Я считаю
источник