Makefile - построить все возможные цели - PullRequest
2 голосов
/ 14 июля 2009

Я хотел бы использовать make-файл для преобразования набора svgs в pngs. Следующий фрагмент показывает, что я сделал до сих пор.

%.png: origs/%.svg
    convert -resize "32x" $< $@

make foo.png работает сейчас. но я застрял с целью all . Я хотел бы преобразовать все (все svgs, что есть) с помощью одной команды.

Во всех примерах я обнаружил, что цель all делает что-то вроде этого:

all: ${OBJECTS}

Но я уверен, что есть более простой способ для моего случая, пожалуйста, помогите мне найти его! : D

Ответы [ 3 ]

5 голосов
/ 14 июля 2009

В зависимости от используемой вами версии make, вы можете определить набор целей на основе всех имеющихся svgs. Например, в GNU сделать:

SVG = $(wildcard *.svg)
PNG = $(SVG:.svg=.png)

all: $(PNG)
0 голосов
/ 14 июля 2009

То, что у вас есть, есть шаблонное правило. Он говорит make, как сделать цель типа certian (заканчивающуюся на «.png»), а не какую-либо конкретную цель. Так что у вас есть что-то, что позволяет вам набирать произвольный «make foo.png», и он будет знать, как это сделать.

Способ, которым я бы обобщил это, чтобы создать правило для создания "всех .png, которые вы можете сделать из этого каталога", будет использовать переменную. Поместите строку в верхнюю часть вашего make-файла:

SVGs = *.svg
PNGs = $(subst .svg,.png,$(SVGs))

В первой строке будут созданы переменные SVG, которые содержат все файлы в вашем каталоге, оканчивающиеся на «.svg». Второй создает переменные PNG, содержащие тот же список, но с ".png" в конце.

Затем вы должны создать правило для сборки всех SVG-файлов следующим образом:

allsvgs : $(PNGs)

Обратите внимание, что я не назвал это "все". Цель «all» - это неофициальная стандартная цель, которая всегда должна означать «создать каждую цель, которую поддерживает мой make-файл». В вашем случае, я полагаю, вы могли бы создать «allsvgs» для списка целей all, но по мере роста вашего make-файла вы нужно будет что-то добавить.

0 голосов
/ 14 июля 2009

Я не помню, может ли это сделать make.

Вы можете добавить оператор оболочки foreach ко всем:

(cd origs; для файла в * .svg; do; конвертировать $ {file}; done)

Вам нужны парены, чтобы foreach совместно использовали одну и ту же среду (оболочку).

У меня слишком много точек с запятой; Я никогда не могу вспомнить, где они нужны и не нужны, когда команда многострочной оболочки превращается в однострочник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...