Это невозможно сделать за один проход; Make определяет, какие цели должны быть перестроены, прежде чем оно фактически выполнит какое-либо правило, и в этом случае полный список целей не существует, пока не будет выполнено одно из правил.
Это должно сделать это:
FOO_FILES := $(shell cat foo.files)
foo.tar: foo.files
$(MAKE) foo-tarball
.PHONY: foo-tarball
foo-tarball: $(FOO_FILES)
tar -cf foo $^
EDIT:
Как указывает ОП, это не будет работать так, как написано; Я оставил обязательное условие:
foo.tar: foo.files $(FOO_FILES)
...
Обратите внимание, что это будет повторяться, даже если foo.files
не изменился, что не является строго необходимым; это можно исправить, но не элегантно. (Для сравнения, выбранное решение, которое, я признаю, чище моего, повторяется, даже если цель не имеет ничего общего с foo.tar
.)