2013-05-19 54 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