2013-03-14 166 views
5

我使用GCC中的-MM標誌爲對象生成makefile依賴關係。該makefile簡要看起來像這樣:GCC makefile依賴關係生成路徑

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

來源位於文件夾src。然而,autodep文件將包含對象目標沒有他們的相對路徑:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

如何,我應該把他們變成這樣:

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

我試過使用-MT標誌,但它似乎完全放棄了對象目標。

回答

6

-MT設置整個目標名稱。如果你想爲每個源不同的目標,你需要一個不同的-MT參數爲每個源,這意味着編譯器的多個調用和foreach循環:

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

或者,你可以使用SED按摩輸出

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

更容易還是把每一個源文件的依賴關係到它自己.D文件,並使用-MMD標誌產生,當你編譯源文件:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
+0

謝謝!我使用'foreach'循環,'autodep'的內容現在是正確的。但它似乎並不奏效。使用這個問題的例子,如果我更改'src/bar.h'並運行'make',我只是'make:\'src/foo.o'是最新的'。 – 2013-03-15 13:48:08

+0

通過在'all:'之後放置'-include'來解決它。 – 2013-03-15 18:38:58