Make не имеет такой встроенной функциональности.И, на самом деле, поддерживать список целей в актуальном состоянии вручную намного проще и проще, чем любое альтернативное решение.Лично я, вероятно, начну с чего-то вроде этого:
# second expansion is needed to get the value of
# $(targets) after the whole file was preprocessed
.SECONDEXPANSION:
all: $$(targets)
targets += build/a
build/a:
...
targets += build/b
build/b:
...
targets += build/c
build/c:
...
Я не верю, что требование добавить одну строку на цель (targets+=xxx
) может быть настолько раздражающим для вас.
Тем не менее, вот как мы можем "предварительно обработать" Makefile самостоятельно:
# assume all targets are explicitly defined in Makefile
targets != grep -o '^ *build/\w* *:' Makefile | sed 's/^ *//;s/ *:$$//'
all: $(targets)
build/a:
...
build/b:
...
build/c:
...
Конечно, это не получится, если цели находятся во включенных файлах или содержат подстановки и т. Д. Однако это работаетдля "простых случаев".