Как автоматически генерировать список целей создания, перемещая подкаталоги? - PullRequest
10 голосов
/ 20 января 2012

Я хотел бы использовать один Makefile для генерации целей в сотнях подкаталогов. Каждый подкаталог представляет собой метку даты / времени, например: 20120119_153957, что соответствует следующему шаблону ????????_??????. Других подкаталогов, соответствующих этому шаблону, нет.

Одна цель, которую я хотел бы создать, называется ????????_??????/graph.pdf. У меня есть скрипт с именем make_graph, который сделает график с именем подкаталога. Но я не уверен, как написать Makefile, который будет автоматически отбрасывать все подкаталоги и генерировать эти цели программно.

Например, код SUBDIRS:=????????_??????, похоже, правильно отображает все подкаталоги. Я могу проверить с этим правилом:

.PHONY: print
print:
        echo $(SUBDIRS)

Однако это присвоение переменной

TARGETS:=$(SUBDIRS:%=%/graph.pdf)

, похоже, не выполняет то, что я ожидаю, и назначает множество целей. Вместо этого следующее правило просто печатает одну цель.

.PHONY: print
print:
        echo $(TARGETS)

Очень странно, что SUBDIRS должен иметь правильные подкаталоги, но TARGET имеет только один файл.

1 Ответ

17 голосов
/ 20 января 2012

В вашем примере сопоставление глобуса выполняется оболочкой.

GNU Make имеет встроенную wildcard функцию , которую вы можете использовать следующим образом:

SUBDIRS := $(wildcard ????????_??????)

Теперь вы можете использовать эту переменную для построения списка целей:

.PHONY : all
all : $(SUBDIRS:%=%/graph.pdf)

%/graph.pdf : # list prerequisites here.
    # recipe to make '$@' in directory '$(@D)' from '$^'.

См. Также: шаблон правил , автоматические переменные .

...