2014-05-19 69 views
4

在一個大型的C項目中,我有一個頂級的Makefile和許多子Makefile在不同的子目錄中。我需要收集編譯的所有依賴關係。爲此,我添加了-MMDCFLAGS並獲得一堆.d依賴文件。如何收集大型Makefile項目的所有依賴關係?

這些.d文件分散在子目錄中。此外,依賴關係有時被編寫爲絕對路徑,有時作爲與編譯目錄相關的路徑,有時包含符號鏈接。我編寫了一個腳本,用於查找所有.d文件,遍歷其目錄,並解析所有找到的路徑。這有效,但有數以萬計的依賴關係文件,這個依賴關係集合持續大約與編譯相同的時間! (這是等待太久:))

有沒有更快的方法來獲取單個文件中的所有依賴關係?這是ANSI C,GCC和Linux如果重要的話。提前致謝。

回答

1

而不是-MMD,您可以使用-MM,它將依賴項發送到標準輸出。

然後,您可以收集所有的輸出到頂層目錄中的一些依賴文件,

gcc -MM ... file.c >>$(top)/all.d 

如果後處理是在一個文件中收集輸出的唯一原因,你可以帶濾波器的輸出管

gcc -MM ... file.c | sh filter.sh >file.d 

並保持依賴文件分開。

如果某個本地包含文件(defs.h)或主要源文件的路徑很重要,則可以通過給出適當的-I選項(例如,)來強制gcc包含路徑。

gcc -MM -I$(top)/path/to ... $(top)/path/to/file.c >>$(top)/all.d 

gcc -MM -I$(top)/path/to ... $(top)/path/to/file.c | sh filter.sh >file.d 

代替

file.o: file.c defs.h 

GCC將發射

file.o: /absolute/path/to/file.c /absolute/path/to/defs.h 

這適用於作爲相對路徑,當然。

+0

但是我有許多相同的文件名,比如'dir1/defs.h'和'dir2/defs.h',它們由相應的目錄中的源文件包含相對路徑(使用'#include「defs.h 「')。 'gcc -MM ... file.c >> $(top)/ all.d'只輸出'defs.h',我不知道使用了哪個'defs.h'。 – user3608247

+0

第二種方案如何? –

+0

第二種選擇與我現在所做的沒有多大區別:過濾器必須接收除stdin之外正在執行的** gcc **的路徑。現在我的腳本從** find **的輸出接收** .d **文件的路徑。 我想唯一可以做到的「更快」是GCC的一個選項,它可以爲依賴文件生成**解析絕對**路徑。沒有這樣的選項似乎存在... – user3608247

0

您可以在第一次編譯運行時創建依賴文件。

在第一次運行期間,對象還沒有存在,所以無論如何編譯器都會被調用。首先創建空的依賴項文件,然後在編譯時更新它們。

應該可以擴展minimal Makefile for a single-directory C++ project以使用子目錄。