Вот так работает Make. Makefile анализируется и вызываются все функции Makefile, затем оценивается один или несколько рецептов.
Есть ли причина, по которой вы не просто используете цикл оболочки?
foo:
touch foo
for f in *foo*; do \
echo "$$f"; \
done
Обратите внимание, как знак доллара нужно удвоить, чтобы избежать его оценки make
, а также как переменные оболочки обычно должны заключаться в двойные кавычки, если вам специально не требуется, чтобы оболочка выполняла токенизацию пробелов и расширение подстановочного знака для значения .
С другой стороны, более гибкий подход заключается в явном документировании любых зависимостей.
.PHONY: all
all: foo
printf '%s\n' $^
foo:
touch $@
Теперь all
зависит от foo
, поэтому Make знает, что он должен создать foo
, прежде чем сможет выполнить рецепт all
, если foo
не существует или устарел по отношению к своему собственному. зависимости (которых, конечно, в настоящее время нет).
Переменная make
$^
относится к зависимостям текущей цели, а $@
расширяется до текущей цели рецепта. Сценарий оболочки printf
- это просто более экономичный способ печати одной вещи в строке без цикла.