Makefile编译中的目标和依赖项

时间:2014-01-28 20:14:58

标签: makefile

我遇到了一个包含以下代码的makefile。但是我无法理解第一行$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp,究竟是什么依赖?

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp

@$(PRINTF) "$(MESG_COLOR)Compiling: $(NO_COLOR) $(FILE_COLOR) %25s$(NO_COLOR)" "$(notdir $<)"
@$(CC) $(CPPFLAGS) -c $< -o $@ -MD 2> temp.log || touch temp.err
@if test -e temp.err; \
then $(PRINTF) $(ERR_FMT) $(ERR_STRING) && $(CAT) temp.log; \
elif test -s temp.log; \
then $(PRINTF) $(WARN_FMT) $(WARN_STRING) && $(CAT) temp.log; \
else printf "${OK_COLOR}%30s\n${NO_COLOR}" "[OK]"; \
fi;
@$(RM) -f temp.log temp.err

2 个答案:

答案 0 :(得分:2)

这是static pattern rule。它可用于构建$(OBJS)中的任何目标,并相应地构造先决条件的名称。

SRCDIR = sources
OBJDIR = objects
OBJS = objects/foo.o objects/bar.o objects/baz.o

$(OBJS): $(OBJDIR)/%.o : $(SRCDIR)/%.cpp
    @echo the target is $@, the prereq is $<

如果使用“make objects / foo.o”调用此规则,Make将1)认识到此规则适用,因为所需目标是规则的目标列表的成员,2)匹配目标名称“对象/foo.o“针对目标模式”对象/%。o“获取词干”foo“,3)将该词干放入prereq模式”sources /%。cpp“中以获取先决条件的名称,”来源/foo.cpp”。

答案 1 :(得分:1)

这是静态模式规则。基本上它意味着$(OBJS)中的每个单词,定义一个显式规则,其中目标模式$(OBJDIR)/%.o与单词匹配,前提条件是模式的扩展$(SRCDIR)/%.cpp&#34 ;

因此,如果OBJS等于$(OBJDIR)/foo.o $(OBJDIR)/bar.o $(OBJDIR)/baz.o,那么静态模式规则等同于写这个:

$(OBJDIR)/foo.o : $(SRCDIR)/foo.cpp
        @$(PRINTF) ...
        ...
$(OBJDIR)/bar.o : $(SRCDIR)/bar.cpp
        @$(PRINTF) ...
        ...
$(OBJDIR)/baz.o : $(SRCDIR)/baz.cpp
        @$(PRINTF) ...
        ...