gnu make:规则执行顺序
gnu make: rule execution order
我正在阅读https://www.gnu.org/software/make/manual/make.pdf。在第 24 页上写着
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c #first rule
$(COMPILE.c) $(OUTPUT_OPTION) $<
all: $(OBJS)
$(OBJS): | $(OBJDIR) #third rule
$(OBJDIR):
mkdir $(OBJDIR)
现在,如果需要,创建 objdir 目录的规则将是 运行,在任何“.o”之前
建成
不明白为什么会先创建目录??创建目标 all 时,它会查看先决条件 $(OBJDIR)/foo.o... 并且对于此先决条件,两个规则适用:第一条和第三条规则。为什么第三条规则在第一条规则之前执行?如果应用两个或多个规则,make 通常如何决定先应用哪个规则?
这一行:
$(OBJS): | $(OBJDIR)
表示所有目标文件(在 OBJS
变量中)都有目录(在 OBJDIR
变量中)作为先决条件。
因此,在目录规则完成之前,none 个目标文件可以开始构建。
如果有多个规则(当然只有一个可以有配方),那么所有先决条件将合并到一个列表中。在你的例子中,你也可以这样写:
$(OBJDIR)/%.o : %.c | $(OBJDIR)
$(COMPILE.c) $(OUTPUT_OPTION) $<
这将是等效的。
我正在阅读https://www.gnu.org/software/make/manual/make.pdf。在第 24 页上写着
OBJDIR := objdir
OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o)
$(OBJDIR)/%.o : %.c #first rule
$(COMPILE.c) $(OUTPUT_OPTION) $<
all: $(OBJS)
$(OBJS): | $(OBJDIR) #third rule
$(OBJDIR):
mkdir $(OBJDIR)
现在,如果需要,创建 objdir 目录的规则将是 运行,在任何“.o”之前 建成
不明白为什么会先创建目录??创建目标 all 时,它会查看先决条件 $(OBJDIR)/foo.o... 并且对于此先决条件,两个规则适用:第一条和第三条规则。为什么第三条规则在第一条规则之前执行?如果应用两个或多个规则,make 通常如何决定先应用哪个规则?
这一行:
$(OBJS): | $(OBJDIR)
表示所有目标文件(在 OBJS
变量中)都有目录(在 OBJDIR
变量中)作为先决条件。
因此,在目录规则完成之前,none 个目标文件可以开始构建。
如果有多个规则(当然只有一个可以有配方),那么所有先决条件将合并到一个列表中。在你的例子中,你也可以这样写:
$(OBJDIR)/%.o : %.c | $(OBJDIR)
$(COMPILE.c) $(OUTPUT_OPTION) $<
这将是等效的。