ソースファイル(.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)
ありがとう:
は、どのように私は、ルール(または同じ目標を達成し、いくつかの他の構築)のように動作します書くことができます。
aha!すばらしいです!私はどのようにコンパイルルールを呼び出すのだろうかと思っていましたが、最初にforeachが呼び出されますか?あなたはSRC_EXT変数を設定した直後に呼び出されるので、ファイルにそこに座っていますか? .oファイルが最新であっても、強制的にすべてのソースファイルの再コンパイルが強制されますか? – user487100
メイクファイルの解析は、すべて拡大することです。 makeが "即時のコンテキスト"(GNU makeマニュアルの "Make Makefileをどのように読み込むか"を参照)で変数や関数に遭遇するたびに、それが展開されます。それはもちろん、多くのステップを含むことができます。展開が完了すると、残っているものはすべてメイクファイルとして解析されます。評価関数は特別なものです。基本的に、このforeachループは、makefileを読み込むときにmakeによって展開され、解析されます。そして、もしあなたがそれらを書き出したのと同じ方法でルールを定義します。したがって、他のmakeルールのように動作します(再コンパイルを強制しません)。 – MadScientist
非常にクールです。ありがとう! – user487100