2009-09-08 164 views
4

我們有一個在Windows 2003機器上運行的Makefile,我們使用的是mingw32-make。由於Makefile有許多包含路徑,它超過了cmd可以處理的8K的緩衝區大小[參考 - http://support.microsoft.com/kb/830473/EN-US/,因爲編譯導致「輸入行太長」問題。mingw32-make:「Input line too long」issue

我想知道以下 -

  1. 什麼是優化的Makefile的最好方式,因爲我已經刪除不需要的編譯器開關,包括路徑等

  2. 有什麼辦法我們可以將所有INCLUDE路徑放在一個.txt文件中,並將其導入到Makefile中。我找不到任何相同的mingw32文檔。

任何其他輸入/提示/參考鏈接是最歡迎

感謝,
-HJSblogger

回答

3

一種方法我們採取了(這是不是因爲我們跑出來的命令行空間,只是因爲我們希望有一個更清潔的構建系統)是讓每個「模塊」嗎其構建通行證。

因此,舉例來說,假設你有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. 
+1

Pax,謝謝你的回答。是的,構建是相當龐大的,並有很多包括路徑:) 說實話,現在的重點只是使系統運行沒有任何堵塞。 謝謝, -HJSBlogger – hjsblogger 2009-09-08 06:31:36

+0

@hjsblogger,如果你正在尋找一種快速的方法來讓它工作,編寫一個腳本,給定目錄列表,將所有的頭文件從這些目錄複製到中央位置。然後將其作爲所有規則的第一步,並將編譯行中的include語句修改爲僅引用該位置而不是大型列表。您甚至可以分階段進行復制(例如,一次20個目錄x 20次,總共可處理400個目錄)。 – paxdiablo 2009-09-08 06:39:57

+1

@Pax:謝謝你的代碼片段,肯定會試圖抓住這一個,看看它是否有效。與此同時,我還在研究是否可以爲ALIAS路徑例如C:\ Inc_Folder \ src \ ..這樣的路徑創建一個ALIAS到X:這樣我所有的INC路徑將從X:\開始,從而導致使用量減少的cmd緩衝區。 我將cmd輸出重定向到一個文件,發現在8K之外,由於每個組件開始的起始路徑很大,接近3K。 你對此有何看法。我仍在使用Google搜索並檢查是否有可能。我也會嘗試並行查看您的解決方案。 – hjsblogger 2009-09-08 07:21:38

0

使用的「讓」我有「命令行太長」的問題NACL SDK版本。

的問題的原因是,Windows殼(cmd.exe的)在命令行8191字符大小限制: http://support.microsoft.com/kb/830473/en

的問題是,當編譯達到通過使用創建庫的點「ar」,源文件太多,命令行太長。

因此,要解決這個問題,我不得不改變「nacl_llvm.mk」文件:

# 
# LIB Macro 
# 
# $1 = Target Name 
# $2 = List of Sources 
# $3 = POSIX Link Flags 
# $4 = VC Link Flags (unused) 
define LIB_RULE 
$(STAMPDIR)/$(1).stamp: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a 
    @echo "TOUCHED [email protected]" > $(STAMPDIR)/$(1).stamp 

all: $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a 
$(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a: $(foreach src,$(2),$(call SRC_TO_OBJ,$(src))) 
    $(MKDIR) -p $$(dir [email protected]) 
    $(RM) -f [email protected] 
# Comment this line!  
# $(call LOG,LIB,[email protected],$(PNACL_LIB) -cr [email protected] $$^ $(3)) 

# Add these other lines 
    $(shell echo cmd /C $(subst /,\,$(PNACL_LIB) -cr $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a) > create_lib.bat) 
    $(foreach src,$(2),$(shell echo cmd /C $(subst /,\,$(PNACL_LIB) -r $(LIBDIR)/$(TOOLCHAIN)/$(CONFIG)/lib$(1).a $(call SRC_TO_OBJ,$(src))) $(3) >> create_lib.bat)) 
    create_lib.bat 

endef 

的想法是創建一個「bat」的文件,必須執行創建的所有命令庫文件,然後逐個添加目標文件。 然後在適當的時候執行「bat」文件。

致以問候