2011-09-16 7 views
2

私は現在、非常に広範囲にテンプレートを使用し、インスタンシエーション中にメモリの制約に陥っているプロジェクトに取り組んでいます。インスタンス化をいくつかの非常に単純なファイルに分割しました。これらのファイルはすべて、3つのライナーで構成され、インクルードのみで構成されています。automakeで生成されたソース(a foreach)の生成リスト

これらをMakefile.amのルールで生成させることができます。今私はMakefileに生成されるべきファイルのかなり長いリストを持っており、このリストをforeachのような式でリファクタリングしたいと思っています。より具体的に:私は

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

は、しかし、第2の構築物は唯一のautomakeによりに対して警告されていない

ように、より簡潔に表現することができ

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

のようなラインを持っているだけでなく、動作しません。この方法で与えられたファイルはコンパイルもクリーンでもありません。

現在、このファイルリストをシェルスクリプトで生成しています。

この繰り返しを実装する方法はありますか?

答えて

4

私はループを作成することを忘れます。GNU拡張は標準ではなく、Automakeでは理解できません。あなたがここで使用できる1つの標準makeの構成は、subst2によって接尾辞subst1を置き換えた後に$(var)の値に拡張されます。macro expansion with substitution$(var:subst1=subst2)です。 Automakeはこれを理解しています。

が空の場合、$(var:=subst2)のように、$(var)のすべてのファイルにsubst2が追加されます。あなたは次のようにファイルのリストを構築するためにこれを使用することができます:

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

echo: 
     @echo $(all_files) 

a_0.cppからf_3.cppにすべてのファイルを表示します上記Makefilemake echoを実行します。

+0

おかげさまで、10行のshで生成されたMakefileの115行を、20行の携帯makeに縮小しました。 – thiton

1

あなたのように、 Makefileが生成された時点でソースが存在する必要があるため、GNU make foreach関数がこのように動作しないことを発見しました。したがって、私はGNU Autogen(またhere)を使用してMakefile.amに後で含まれるmakefileフラグメントを生成します。だから、あなたのシェルスクリプトのアプローチとはそれほど違いはないでしょう。

関連する問題