2011-08-22 9 views
5

依存性の生成を行うMakefileを作成しましたが、(従来の)コードベースには.cpp.ccというファイルが混在しているため、ルールを複製する必要があります。それはちょっと見苦しいようです。とにかく、ターゲットの前提条件が.cppまたは.ccのいずれかのファイルになることを指定する必要はありますか?GNU Makeのルールを複製しないようにする

そうではなくなる:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

は次のように重複せずに何かを作成します。

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

またはこの強制冗長GNUのちょうど不幸な要素の設計は、作るのでしょうか?

+0

あなたが使用している場合GNU autotoolsでおそらくm4マクロを使うことができます – Kevin

答えて

3

最初のオプション、一度ルール本体を定義し、必要に応じて、それを再利用するために変数を使用します。

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

2番目のオプションを、動的ルールを生成するために$(eval)を使用します。

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

オプション1は私が探していたものです。 – Alastair

1

これは動作するはずです:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

もう一つのアイデア:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

もう一つのアイデアをGNUは、2つのパターンルールを生成させるようにすることです。 これを行うには二つの方法essentallyあります

  • GNUのmakeのinclude声明で、あなたの実際のメイクファイルの中に含まれたmakefile(%-cc.mkまたは類似)に書き込む
  • はGNU makeの$(eval)でインラインそれらを生成し、評価し、 $(call)機能
  • C/Unixの開発ツールチェーンで他のほとんどすべてのよう

は、これらの技術は、基本的に前処理の形態で本当にハードにという価格で理解し、それらが容易使用する(二重または三重のエスケープがたくさんあり、いつ展開されるのかを追跡するのは本当に難しい。少なくとも私の経験では、デバッグは王様の痛みになるかもしれません)。

もっと複雑な使用例(Stack Overflowがいくつか挙げられています)のために予約してください。

+0

これらのオプションのどちらも、より簡潔なメークファイルにはならないようです。私はおそらく元のフォームに固執するでしょう。あなたの提案をありがとう。 – Alastair

関連する問題