2013-05-19 30 views
1

Here本教程对它进行了相当精美的解释,其中大部分工作正常。以下是本教程最后的Makefile它假设你有一个像下面这样的目录结构:在make中自动生成依赖关系并将它们包括在依赖项列表中

root-----Makefile 
    |-----All source files here. 

编译的结果将在root目录。以下是Makefile:

OBJS := foo.o bar.o 

# link 
proggie: $(OBJS) 
    gcc $(OBJS) -o proggie 

# pull in dependency info for *existing* .o files 
-include $(OBJS:.o=.d) #NOTE THIS 

%.o: %.c #NOTE THIS 
    gcc -c $(CFLAGS) $*.c -o $*.o 
    gcc -MM $(CFLAGS) $*.c > $*.d 
    @cp -f $*.d $*.d.tmp 
@sed -e 's/.*://' -e 's/\\$$//' < $*.d.tmp | fmt -1 | \ 
    sed -e 's/^ *//' -e 's/$$/:/' >> $*.d 
@rm -f $*.d.tmp 
# remove compilation products 
clean: 
    rm -f proggie *.o *.dOBJS := foo.o bar.o 

我不明白教程中的一件事。它说pull in dependency info for *existing* .o files和相应的.d文件被创建,但是这些文件是如何处理的,因为在仍然保留%.o: %.c的目标的依赖列表中没有对其进行修改。

事实上,从我注意到它只是不适合我。任何人都可以解释这里发生了什么。如果本教程有误(我非常怀疑),请提及如何将依赖项从.d文件包含到依赖项列表中。

回答

1

gcc MM创建的相关文件将包含类似的规则:

foo.o: stdio.h myinc.h # ... 

,在这里这条线包括依赖文件列表中的每个对象:

-include $(OBJS:.o=.d) 

只看foo.d例如。

According to this

一个文件可以是几种规则的目标。所有规则中提到的所有先决条件都合并到目标的先决条件列表中。如果目标比任何规则中的任何先决条件都早,则会执行配方。

因此,即使您有规则%.o: %.c,include语句也会导入将规则与相关性扩展的规则。

+0

但仍然依赖列表仍然是“%.o:%.c”。内部做这件事。 –

+0

更新了答案 – perreal