2012-04-15 3 views
0

Предположим, у меня есть правило грим:Генерация кода и сделать расширение правил

.PHONY:gen 
gen: auto.template 
     generate-sources auto.template 

, что создает кучу файлов, например, auto1.srcauto2.src, auto3.src и так далее.

Если теперь у меня есть правила для создания целевых от *.src файлов, например:

$(patsubst %.src,%.target,$(wildcard *.src)): %.target: %.src 
     build $< > [email protected] 

Как я могу сказать, чтобы сделать первый выполнить gen правило, а затем расширить предпосылки для второго шаблона правила? Расширения GNU приветствуются.

Примечание: Я хотел бы сохранить его в одинmake вызова; Тривиальным решением для этого было бы поставить второе правило во вторичном Makefile.secondrun и позвонить $(MAKE) -f Makefile.secondrun после обработки gen. Но мне было интересно, есть ли лучший вариант.

+0

У вас есть другие файлы '.src', не созданные' gen'? – Beta

+0

@Beta: Возможно, да. – bitmask

+0

Тогда мне может понадобиться корректировка в зависимости от того, как вы создаете другие. – Beta

ответ

2

Строительство от ответа Беты, вот как вы можете это сделать с помощью Makefile Переделки в GNU сделать, что не то же самое, как рекурсивный макияж. Скорее, он обновляет включенный make-файл с использованием правила в основном make-файле, затем перезапускает оригинал экземпляра. Вот как обычно создаются и используются файлы зависимостей *.d.

# Get the list of auto-generated sources. If this file doesn't exist, or if it is older 
# than auto.template, it will get built using the rule defined below, according to the 
# standard behavior of GNU make. If autosrcs.mk is rebuilt, GNU make will automatically 
# restart itself after autosrcs.mk is updated. 

include autosrcs.mk 

# Once we have the list of auto-generated sources, getting the list of targets to build 
# from them is a simple pattern substitution. 

TARGETS=$(patsubst %.src,%.target,$(AUTO_SRCS)) 

all: $(TARGETS) 

# Rule describing how to build autosrcs.mk. This generates the sources, then computes 
# the list of autogenerated sources and writes that to autosrcs.mk in the form of a 
# make variable. Note that we use *shell* constructs to get the list of sources, not 
# make constructs like $(wildcard), which could be expanded at the wrong time relative 
# to when the source files are actually created. 

autosrcs.mk: auto.template 
     ./generate-sources auto.template 
     echo "AUTO_SRCS=`echo *.src`" > autosrcs.mk 

# How to build *.target files from *.src files. 

%.target: %.src 
     @echo 'build $< > [email protected]' 
+0

Отличный ответ. Благодарю. Но у меня все еще есть вопрос; Не было бы достаточно просто «коснуться autosrcs.mk» и иметь 'AUTO_SRCS: = $ (wildcard * .src)' внутри 'Makefile'? – bitmask

+0

@bitmask: да, это будет работать и в этом случае. Я предпочитаю подход, показанный в моем ответе, потому что для меня это немного менее загадочно, и это позволяет вам делать сколь угодно сложные вещи для определения списка автоматически сгенерированных источников, если $ (wildcard) по какой-то причине недостаточно. –

+0

Недостатком этого метода является то, что он будет запускать некоторые из рецептов, чтобы определить граф зависимостей - в идеале это должны быть две отдельные фазы. (В моем собственном Makefile, где у меня есть эта проблема, эти рецепты дороги.) – reinierpost

1

Короткий ответ: вы не можете. Make определяет все правила, которые он должен выполнить, прежде чем он выполнит какое-либо правило.

Более длинный ответ: возможно, вы можете. Как вы говорите, вы можете использовать рекурсивный Make явно или скрытно, скажем, для создания файла, который ваш makefile будет include (я смотрю на вас, Джек Келли). Или, если вы каким-то образом сможете получить список файлов, которые будет строить gen, вы можете написать правило об этом. Или вы могли бы взять прыжок веры, как это:

%.target: %.src 
     build $< > [email protected] 

%.src: gen; 
+0

Хорошо, я думаю, мне придется пойти с рекурсивным звонком. Возможно, это не так уж плохо. Но, возможно, кто-то придумает способ сделать это, поэтому я дам им шанс и оставлю вопрос открытым. – bitmask

Смежные вопросы