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を使用する場合と空のターゲットルールを使用する場合の間に、外部から検出可能な違いはありますか?