2

GNU Makeバージョン3.81では、.DEFAULT_GOALという名前の特別な変数が導入されました。この変数を使用して、コマンドラインでターゲットが指定されていない場合にどの目標(またはターゲット)を構築するかをMakeに指示できます。それ以外の場合、Makeは最初に遭遇したターゲットを作成します。

検討:

バー:abc
        $ {MAKE_BAR_COMMANDS}

foo:xyz
        $ {MAKE_FOO_COMMANDS}

上記の架空のMakefileを使用makeすると、Makeが最初に遭遇するターゲットであるため、実行すると「バー」が作成されます。しかし、.DEFAULT_GOALを追加すると、次のようになります...

.DEFAULT_GOAL:= foo#最初でなくても、デフォルトでfooをビルドします。

バー:abc
        $ {MAKE_BAR_COMMANDS}

foo:xyz
        $ {MAKE_FOO_COMMANDS}

...次に、Make(バージョン3.81)を実行すると、「foo」がビルドされますmake

この.DEFAULT_GOAL変数は、私が作成したモジュール式の再利用可能なMakefile「フレームワーク」で非常に役立つことがわかりました。ただし、多くのシステムにはまだGNU Make 3.80以前があり、この変数をサポートしていないことがわかりました。

いろいろ試してみると、空のターゲットルールを指定するだけで、3.81より前のバージョンのGNU Makeでも、.DEFAULT_GOALと同じ効果があるように見えることに気付きました。

foo:#空のターゲットルール

バー:abc
        $ {MAKE_BAR_COMMANDS}

foo:xyz
        $ {MAKE_FOO_COMMANDS}

この方法で追加のターゲットルールを指定することにより、ターゲットのルールや前提条件に追加することが有効かつ合法であることを私は知っています。ただし、これを行うと、.DEFAULT_GOALを使用した場合には発生しない潜在的に望ましくない副作用が発生する可能性があるのではないかと思います。

単純な空のターゲットルールで同じことを達成できるのに、なぜ.DEFAULT_GOALが導入されたのか疑問に思っていると思います。これは、それらがまったく同じ動作をもたらさない可能性があることを私に疑わせます。

したがって、最終的な質問は次のとおりです。.DEFAULT_GOALを使用する場合と空のターゲットルールを使用する場合の間に、外部から検出可能な違いはありますか?

4

2 に答える 2

2

私はあなたに明確な答えを与えることはできませんが、その導入の他の理由を提案することができます:

  1. 何をするのかはすぐにわかり.DEFAULT_GOALます。つまり、ラベルに書かれていることです。1行の空のターゲットの存在と意味は、特に大きなMakefileでは簡単にわかります。
  2. $(.DEFAULT_GOAL)Makefileの他の場所で実際にbackの値を読み取ることができます。テストでは、明示的に設定されているか、最初のルールを選択して決定されているかどうかに違いはないことが示されています。
于 2009-07-10T21:02:10.000 に答える
2

「foo:#空のターゲットルール」がダブルコロンルールと競合しています。

それらを除外すると(::ルール)、それが最初のルールである場合にのみ機能します。したがって、最初に「include-variables.mk」を使用し、一般にインクルードファイルの複雑なネットがある場合、この「.DEFAULT_GOAL」により、デフォルトにできるルールは1つだけであることが明確になります。

于 2011-11-21T09:56:29.333 に答える