微妙な違いがありますが、これは特定の状況では重要ではなく意図的なものでもありません。
ここにはいくつかの小さな違いがありますが、これに限定されません。
まず違い:gmakeのは(まだ行っていない場合)を定義し、開始時に変数MAKELEVELをインクリメント特別な機能を持っています。このMakefileのディスプレイ実行
SUBDIRS = lib1 lib2 lib3
all: prerequisites subdirs
subdirs: $(SUBDIRS)
lib3:
echo $(MAKELEVEL)
:
SUBDIRS = lib1 lib2 lib3
all: prerequisites
$(MAKE) subdirs
subdirs: $(SUBDIRS)
lib3:
echo $(MAKELEVEL)
実行このメイクファイルが表示されます:
1
しかし、以下で
0
だから、次の二つのMakefileは異なる結果を持っています
だから、あなたのMakefileでMAKELEVELが使用される場合、物事は同じように構築されないかもしれません。たとえば、変数を定義すると、この方法は、いくつかの影響を持っているでしょう:
ifeq (1,${MAKELEVEL})
CFLAGS=-g
endif
第二の違い:デフォルトではgmakeマニュアル、に述べたように、環境またはコマンドラインから来た変数だけが渡され再帰呼び出し。ただし、変数の定義がコンテキスト依存でない場合、変数は内部呼び出しで同じ値で定義されるため影響を受けることは非常にまれです(影響を与えるには、 Makefileを最初に実行している間および再帰呼び出しを実行している間に異なるコンテキストに遭遇する)。
とにかく、サブディレクトリに他のMakefileがある場合、人は再帰呼び出しを使用することがよくあります(ただしこれはあなたの状況ではありません)。だから、私たちはしばしば、この遭遇:もちろん
SUBDIRS = lib1 lib2 lib3
all: prerequisites
$(MAKE) -C subdirs
を、これはall: prerequisites $SUBDIRS
に置き換えることができない、これは意味を持たないだろう。 しかし、これはたぶん誰かがあなたが遭遇したことを書いたのではなく、内なる呼び出しなしで他の方法で書かなかった理由です。、物事を書くより一般的な方法だと間違って考えています。
の適宜添加されなければならない、いや、違いはありません。しかし、あなたが記述したパターンは、makefileに他のコードがあれば目的を果たすことができます。例えば、 '前提条件'レシピは、Makefileが 'include'に組み込むファイルを構築し、' subdirs'ルールがルール*を実行する前に持っていなければならない変数を含んでいるかもしれません。エキゾチックなケースですが、それらは起こります。しかし、メイクファイルは初心者によって書かれた可能性が高いでしょう。 – Beta
原則として、細かい依存関係を許さないので、再帰的なmakeを使用しないでください。 – o11c