1

假设我有一个 make 规则:

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

这会创建一堆文件,例如auto1.src,auto2.src等等auto3.src

*.src如果我现在有从文件构建目标的规则,如下所示:

$(patsubst %.src,%.target,$(wildcard *.src)): %.target: %.src
        build $< > $@

如何告诉 make 先执行gen规则,然后扩展第二个规则模板的先决条件?欢迎使用 GNU 扩展。

注意:我想将其保留在一次 make调用中;一个简单的解决方案是将第二条规则放在辅助规则中并在处理后Makefile.secondrun调用。但我想知道是否有更好的选择。$(MAKE) -f Makefile.secondrungen

4

2 回答 2

6

建立 Beta 的答案,这是在 GNU make 中使用makefile 重新制作的方法,这与递归 make 不同。相反,它使用主 makefile 中的规则更新包含的 makefile,然后重新启动原始 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 $< > $@'
于 2012-04-15T20:41:33.153 回答
1

简短的回答:你不能。Make 在执行任何规则之前确定它必须执行的所有规则。

更长的答案:也许你可以。正如您所说,您可以显式地使用递归 Make,或者通过构建一个您的 makefile 将使用的文件include(我在看着您,Jack Kelly)来偷偷摸摸地使用。或者,如果您能以某种方式获得gen将要构建的文件列表,您可以围绕它编写规则。或者,您可以像这样大步向前:

%.target: %.src
        build $< > $@

%.src: gen;
于 2012-04-15T19:23:13.720 回答