2013-01-31 61 views
2

我使用gcc來生成我的Makefile的依賴關係。但它不使用相對路徑。例如,使gcc -MM輸出對象文件名的相對路徑

gcc -MM util/test.c ui/resource.c 

產生

test.o: util/test.h 
resource.o: ui/resource.h 

同時,允許使找到的依賴,它前人的精力產生這樣的:

util/test.o: util/test.h 
ui/resource.o: ui/resource.h 

有沒有什麼辦法讓GCC像第二個例子一樣?

回答

4

man gcc

-MT目標
改變相關性生成發出的規則的目標。默認情況下,CPP採用主輸入文件的名稱,刪除任何目錄組件和任何文件後綴(如.c),並附加平臺的通常對象後綴。結果是目標。

-MT選項會將目標設置爲您指定的字符串。如果您需要多個目標,則可以將它們指定爲-MT的單個參數,或使用多個-MT選項。

例如,-MT '$(objpfx)foo.o的' 可能給

$(objpfx)foo.o的:foo.c的

-MQ目標
同-MT ,但它會引用任何特殊的字符。 -MQ '$(objpfx)foo.o' 給出

$$(objpfx)foo.o的:foo.c的

默認的目標自動被引號,就好像它是-MQ一樣。

所以,你可以使用例如

gcc -MM -MT util/test.o util/test.c 
gcc -MM -MT ui/resource.o ui/resource.c 

更新

有幾種可能性,如果你想在一個文件中的所有依存關係。

您可以執行gcc -MM序列,並將輸出重定向

(gcc -MM -MT util/test.o util/test.c; gcc -MM -MT ui/resource.o ui/resource.c) >file.deps 

你可以使用sed或perl的後處理輸出

gcc -MM util/test.c ui/resource.c | perl -p -e 's,^(.+?)\.o: (.+?)/\1\.c.*,$2/$&,;' >file.deps 

可以改向第一輸出和附加以下一些文件

gcc -MM -MT util/test.o util/test.c >file.deps 
gcc -MM -MT ui/resource.o ui/resource.c >>file.deps 
+0

不好......這樣我需要生成一個依賴文件fo r每個源文件。我想從我的所有來源生成一個單獨的依賴文件... –

+0

@AndréWagner請參閱最新的答案。 –