我遇到了一个包含以下代码的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
答案 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) ...
...