2012-01-23 11 views
6

ソースファイル(.cpp、.c、.cc)とヘッダーファイル(.hpp、.h、.hh)のさまざまな拡張機能を持つC++プロジェクトがあります)。ソースファイルはSRCと呼ばれるディレクトリに配置され、ヘッダファイルがINCというディレクトリに予想どおりにされている。メイクファイル内で複数のソースファイル拡張子を扱う

私はもちろんの

vpath %.c $(SRC) 

%.o: %.c 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

このようなルールでソースをコンパイルしたい場合には動作します私はソースファイルが%.c形式になることを知っていますが、複数の可能なファイル拡張子の場合、%.cppと%.ccの同様の規則を作成する必要があります。もちろん、3つのルールは大したことではありませんが、ルールを書き直すことなく、異なる言語であっても、このメイクファイルを任意のプロジェクトのドラッグ&ドロップとして使用することができればうれしいでしょう。あなたの助けのための

SRC_EXT = cpp c cc 
vpath %.$(SRC_EXT) $(SRC) 

%.o: %.$(SRC_EXT) 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

ありがとう:

は、どのように私は、ルール(または同じ目標を達成し、いくつかの他の構築)のように動作します書くことができます。

答えて

3

標準のPOSIX makeでは使用できません。しかし、vpathについて言及して以来、私はあなたがGNU makeを使用していると仮定します。あなたは、十分に新しいGNU makeを持っていない、または代替ソリューションを好むだろう場合

SRC_EXT = cpp c cc 

define compile_rule 
%.o : %.$1 
     $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC) 
endef  
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

:あなたは十分に新しいバージョン(3.81以降)をお持ちの場合は、通話とはevalで簡単に十分にこれを行うことができます生成されたmakefileで同じことができます。

+0

aha!すばらしいです!私はどのようにコンパイルルールを呼び出すのだろうかと思っていましたが、最初にforeachが呼び出されますか?あなたはSRC_EXT変数を設定した直後に呼び出されるので、ファイルにそこに座っていますか? .oファイルが最新であっても、強制的にすべてのソースファイルの再コンパイルが強制されますか? – user487100

+1

メイクファイルの解析は、すべて拡大することです。 makeが "即時のコンテキスト"(GNU makeマニュアルの "Make Makefileをどのように読み込むか"を参照)で変数や関数に遭遇するたびに、それが展開されます。それはもちろん、多くのステップを含むことができます。展開が完了すると、残っているものはすべてメイクファイルとして解析されます。評価関数は特別なものです。基本的に、このforeachループは、makefileを読み込むときにmakeによって展開され、解析されます。そして、もしあなたがそれらを書き出したのと同じ方法でルールを定義します。したがって、他のmakeルールのように動作します(再コンパイルを強制しません)。 – MadScientist

+0

非常にクールです。ありがとう! – user487100

関連する問題