一種方法我們採取了(這是不是因爲我們跑出來的命令行空間,只是因爲我們希望有一個更清潔的構建系統)是讓每個「模塊」嗎其構建通行證。
因此,舉例來說,假設你有3個模塊,A,B和C
你控制的makefile只需調用每個模塊具有相同目標的Makefile。
然後我們將目標設置爲一致的clean,header,lib和exec。
因此,控制生成文件是這樣的:
modules=A B C
clean:
for i in $modules:
(cd $i ; make clean ; cd ..)
header:
for i in $modules:
(cd $i ; make header ; cd ..)
lib:
for i in $modules:
(cd $i ; make lib ; cd ..)
exec:
for i in $modules:
(cd $i ; make exec ; cd ..)
每個模塊有被其他模塊所需的頭文件複製這些頭文件到一箇中心位置在頭部階段。然後,在lib或exec階段,每個模塊只需使用該中心位置來定位它的所有標題。這也限制了模塊僅使用那些由其他模塊發佈到中心位置的頭文件。
同樣,每個創建exec階段所需的庫的模塊都將該庫複製到中央位置。這極大地減少了構建命令中的-I
(包含目錄)和-L
(庫目錄)子句。
使用該方案,您可以通過在頂層執行make clean header lib exec
來重建整個事件(或者考慮到依賴關係,不要在clean
之前進行適當的構建版本)。
這是解決您的問題的一種方法,但我實際上想知道如何超出限制。 8K,即使每個路徑有25個字符,也需要大約300個不同的包含路徑。你的等級體系真的很龐大嗎?
更新1:
如果你正在尋找一個quick'n'dirty方式得到它的工作不改變makefile的「建築」,你寫它,因爲目錄列表的腳本,會將這些目錄中的所有頭文件複製到中心位置。
然後將其作爲所有規則的第一步運行,並在編譯行中修改include語句以引用該位置而不是大表。您甚至可以分階段進行復制(例如,一次20個目錄x 20次,總共可處理400個目錄)。
這給你與我提出的解決方案相同的效果,對makefile的更改較小。
更新2:其它
一個解決方案,因爲你在你的註釋說明,是別名路徑。
你應該能夠做到這一點與這樣subst.exe
:
> subst x: "c:\Documents and Settings\Pax\My Documents\Not my directory"
> dir x:
Volume in drive X has no label.
Volume Serial Number is 8AA3-703A
Directory of X:\
08/09/2009 10:12 AM <DIR> .
08/09/2009 10:12 AM <DIR> ..
24/08/2009 01:54 PM 6,409 p0rn_sites.txt
09/07/2008 02:49 PM <DIR> downloaded_p0rn
: : :
09/07/2008 02:52 PM <DIR> other_suspect_stuff
3 File(s) 18,520 bytes
18 Dir(s) 63,840,849,920 bytes free
> subst x: /d
> dir x:
The system cannot find the path specified.
Pax,謝謝你的回答。是的,構建是相當龐大的,並有很多包括路徑:) 說實話,現在的重點只是使系統運行沒有任何堵塞。 謝謝, -HJSBlogger – hjsblogger 2009-09-08 06:31:36
@hjsblogger,如果你正在尋找一種快速的方法來讓它工作,編寫一個腳本,給定目錄列表,將所有的頭文件從這些目錄複製到中央位置。然後將其作爲所有規則的第一步,並將編譯行中的include語句修改爲僅引用該位置而不是大型列表。您甚至可以分階段進行復制(例如,一次20個目錄x 20次,總共可處理400個目錄)。 – paxdiablo 2009-09-08 06:39:57
@Pax:謝謝你的代碼片段,肯定會試圖抓住這一個,看看它是否有效。與此同時,我還在研究是否可以爲ALIAS路徑例如C:\ Inc_Folder \ src \ ..這樣的路徑創建一個ALIAS到X:這樣我所有的INC路徑將從X:\開始,從而導致使用量減少的cmd緩衝區。 我將cmd輸出重定向到一個文件,發現在8K之外,由於每個組件開始的起始路徑很大,接近3K。 你對此有何看法。我仍在使用Google搜索並檢查是否有可能。我也會嘗試並行查看您的解決方案。 – hjsblogger 2009-09-08 07:21:38