2017-08-11 3 views
0

私は非常に複雑で、やや古いメイクファイル(そう、それは時間をかけてbogotifiedたかもしれない)、およびこのレシピのパターンを持っているの通知ルールに取り組んでいます:

SUBDIRS = lib1 lib2 lib3 

all: prerequisites 
     $(MAKE) subdirs 

subdirs: $(SUBDIRS) 
# (empty recipe body) 

です(またはあった)が書き込みする理由代わりに、単に

all: prerequisites subdirs 
# (empty recipe body) 

のこのようにall規則は、両者の間の微妙な違いはありますか?私はGNU make 4.1と両方の違いを見ずに走っています。

メイクファイルはLinux用とOS/X用であり、と若干古くなった設定をサポートする予定ですが、それほど大きくはありません(3歳のgcc 4.7が必要です)。

+0

の適宜添加されなければならない、いや、違いはありません。しかし、あなたが記述したパターンは、makefileに他のコードがあれば目的を果たすことができます。例えば、 '前提条件'レシピは、Makefileが 'include'に組み込むファイルを構築し、' subdirs'ルールがルール*を実行する前に持っていなければならない変数を含んでいるかもしれません。エキゾチックなケースですが、それらは起こります。しかし、メイクファイルは初心者によって書かれた可能性が高いでしょう。 – Beta

+0

原則として、細かい依存関係を許さないので、再帰的なmakeを使用しないでください。 – o11c

答えて

1

微妙な違いがありますが、これは特定の状況では重要ではなく意図的なものでもありません。

ここにはいくつかの小さな違いがありますが、これに限定されません。

まず違い: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に置き換えることができない、これは意味を持たないだろう。 しかし、これはたぶん誰かがあなたが遭遇したことを書いたのではなく、内なる呼び出しなしで他の方法で書かなかった理由です。、物事を書くより一般的な方法だと間違って考えています。

0

大きな違いと重要な違いが1つあります。 これを3つの別々のターゲットとして記述すると、-jフラグが正しく機能します。 make -j9は、9つのジョブを同時に実行するようにmakeに指示します.8つのCPUがある場合は非常に便利です。

これはメイクファイルの良いテストであり、全体の点はです。 IMHOです。

あなたが提示パターンがサブディレクトリが建物を開始前に完了している前提条件を確保しようとしています。当然のことを書くのより直接的な方法があります:

all: ${SUBDIRS} 
    echo [email protected] Success 

${SUBDIRS}: prerequisites 
    echo Building [email protected] 

subdirs: ${SUBDIRS} ; # Empty symbolic target 

サブディレクトリターゲットはmake subdirsを入力したい人には便利なものとしてのみ存在しています。 (私はsubdirs` `の` prerequisites`前提条件になるだろうが)書かれたよう

PHONY:もちろん

+1

makeは、自身が実行されたときにmakeが検出することを除いて、サブmakeはメインのjobserverと引き続き対話します。 – o11c

関連する問題