Как выполнить все цели make-файла, которые соответствуют шаблону - PullRequest
2 голосов
/ 26 марта 2019

Учитывая Makefile:

all: build/a build/b build/c    # need to change this to    all: build/*

build/a:
   ...

build/b:
   ...

build/c:
   ...

Я хотел бы изменить цель all, чтобы автоматически создавать все цели, соответствующие build/*. Этот вопрос кажется очень похожим, за исключением того, что он печатает результат, а не воздействует на него. Кроме того, я не уверен, что этот ответ будет работать на Linux и Mac.

1 Ответ

1 голос
/ 26 марта 2019

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:
    ...

Конечно, это не получится, если цели находятся во включенных файлах или содержат подстановки и т. Д. Однако это работаетдля "простых случаев".

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