Цикл в Makefile
Возникла у меня такая задача: в действиях одной из целей Makefile выбрать из каталога файлы по маске *.eps и скормить их программе epstopdf. Проблема в том, что epstopdf принимает в командной строке только один файл. Нужен цикл. Я нашел два решения.
Первое — использовать шелловский for:
build: for epsfile in `ls *.eps`;\ do\ epstopdf $$epsfile;\ done
Здесь две хитрости: экранирование концов строк (потому что for — фактически одна команда) и использование $$ перед именем переменной (потому что иначе она будет считаться макросом Make).
Второй способ использует возможности самого Make:
%.pdf: %.eps epstopdf $? build: $(patsubst %.eps, %.pdf, $(wildcard *.eps))
Такой подход имеет большое преимущество: теперь epstopdf не будет вызываться для EPS-файлов, которые не изменились с момента последнего вызова. К тому же это короче, хотя и, как мне кажется, хуже воспринимается визуально.
К сожалению, все это не удастся сократить до такого:
build: $(wildcard *.eps) epstopdf $?
Здесь макрос $? развернется в строку, содержащую имена сразу всех EPS-файлов, что противоречит условию.

