2011-09-16 32 views
2

我目前正在使用相當廣泛的模板使用模板,並在實例化時運行到內存約束中。我已經將實例化分解成許多非常簡單的文件,這些文件都是由僅包含的三行組成。在automake中生成生成源的列表(a foreach)

我讓它們由Makefile.am中的規則生成。現在我有一個很長的應該在我的Makefile中生成的文件列表,並且希望用類似foreach的表達式來重構這個列表。在更具體的方面:我有一個像

libfoo_la_SOURCES = a_0.cpp a_1.cpp ... b_0.cpp b_1.cpp ... c_0.cpp c_1.cpp ... 

一個線,可以更簡明地表述爲

libfoo_la_SOURCES = $(foreach i,a b ...,$(foreach j,0 1 ...,$i_$j.cpp)) 

但是,第二結構不僅告誡由automake,但也不起作用:以這種方式給出的文件既不被編譯也不被清除。

我目前的解決方法是通過shell腳本生成此文件列表。

任何想法如何實現這個迭代?

回答

4

我會忘記製作循環:GNU擴展不是標準的,Automake不能理解。您可以在此處使用的一種標準(和便攜式)make構造是macro expansion with substitution:在將任何詞的subst1後綴替換爲subst2後,$(var:subst1=subst2)將展開爲值$(var)。 Automake明白這一點。

如果subst1爲空,如在$(var:=subst2)中,那麼將subst2附加到$(var)中的所有文件中。你可以用這個來構建您的文件列表如下:

f = a b c d e f 
g = $(f:=_0) $(f:=_1) $(f:=_2) $(f:=_3) 
all_files = $(g:=.cpp) 

echo: 
     @echo $(all_files) 

運行make echo上述Makefile會顯示所有文件從a_0.cppf_3.cpp

+0

謝謝,出色地將20行的10行sh生成的115行Makefile減少到20行的便攜式製作。 – thiton

1

和你一樣,我發現GNU make foreach函數不會像這樣工作,因爲 源文件在Makefile生成時需要在那裏。因此,我使用GNU Autogen(也是here)生成一個makefile片段,隨後將其包含在Makefile.am中。所以它可能與你的shell腳本方法不同。