2009-02-04 82 views
3

我有一個名爲OBJECTS的Makefile變量中的對象列表,對於命令緩衝區來說太大了。所以我用下面的方法來創建一個文件中列出的對象(傳遞給AR):從一個大的Makefile變量創建一個文件

objects.lst: 
    $(foreach OBJ,$(OBJECTS),$(shell echo "$(OBJ)">>[email protected])) 

雖然這工作是極其緩慢(在Cygwin至少)我不喜歡依靠shell命令和重定向。

此外,foreach不是爲此目的而設計的 - 它在任何命令運行之前都會被評估,這意味着在追加之前我不能例如rm -f objects.lst

有沒有更好的方法?我不想使用增量歸檔,因爲這會導致多個作業出現問題。

我能想到的唯一事情就是用一個單獨的腳本解析Makefile以讀取對象列表或將對象列表存儲在單獨的文件中。兩種解決方案都有其自身的問題。

回答

1

在下面的例子中,我也換成回聲一個簡單的Perl腳本參數分離到新的生產線,但是這是它的JIST ..

objects.lst: 
    echo $(wordlist 1,99,$(OBJECTS))>[email protected] 
    echo $(wordlist 100,199,$(OBJECTS))>>[email protected] 
    echo $(wordlist 200,299,$(OBJECTS))>>[email protected] 
    echo $(wordlist 300,399,$(OBJECTS))>>[email protected] 
    ... 
1

嘗試類似:

OBJECTS:=a b c d 
objects.lst: 
     echo > [email protected] <<EOF  $(OBJECTS) 

即使用的是內置在外殼的<<EOF功能。它沒有任何最大長度限制。

+0

不過打這個 化妝錯誤:execvp:/ bin/sh:參數列表太長 make:*** [objects.lst]錯誤127 – sholte 2012-10-01 23:51:20

0

怎麼是這樣的:

OBJECTS_AM=$(filter a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS)) 
OBJECTS_NZ=$(filter-out a% b% c% d% e% f% g% h% i% j% k% l% m%,$(OBJECTS)) 

objects.lst: 
$(shell echo "$(OBJECTS_AM)">[email protected]) 
$(shell echo "$(OBJECTS_NZ)">>[email protected]) 

您可能需要把它分解一個或兩個以上的時間,但它不是那麼糟糕,尤其是作爲文件名的分配不改變這一切常常。

+0

感謝這一點,它啓發了我自己的解決方案,使用wordlist,它確保了每個變量中的一致數目的對象。 – 2009-02-05 13:22:05

0

下面是GNU做出直接讓你一個補丁將一個變量寫入一個文件。 它創建了一個新的「寫文件」功能,類似於現有的「信息」的功能,不同的是它的文件名參數並寫入文件:

https://savannah.gnu.org/bugs/?35384

相關問題