9

Makefile の "偽の" ルールのターゲットが ".PHONY" である理由はまだわかりません。前提条件としては、はるかに論理的です。

これについて詳しく説明する必要がありますか?Aに依存しBB偽物である場合は、A偽物でもあります。したがって、依存関係グラフ.PHONY←<code>B→<code>A は、→<code>B→<code>A と比べてかなり驚くべきもの.PHONYです。(別の議論は、 の実装がターゲットを非常に特別にmake処理しなければならないというものです。).PHONY

この批判はかなり理論的に (無意味に) 見えるかもしれませんが、「make は非常に古いものなので、その構文は定着しています」。ただし、構文の変更を提案しているわけではありません。代替手段があります。

GNU Make では (少なくとも)、次の Makefile は phony を宣言しますtarget_A

target_A: _PHONY
        touch target_A

_PHONY:
        #noop

質問 1 :これはとてもシンプルでクリーンです。確かに私はその最初の発明者ではありません。実際、この代替案を考えると、なぜmake特別な構文が必要だったのでしょうか?

これは、偽のターゲットのワイルドカードに関する質問も非常にうまく解決し、初心者が疑うときに .PHONY の意味に光を当てることさえできるように私には思えます。

質問 2 :このアプローチが劣っている状況を思いつきますか? (呼び出しは役に立ちmake .PHONYますか?)

(私は他makeの s を呼び出しましたが、GNU Make は Makefile の読み取りと書き込みの経験がある唯一の実装です。)

4

1 に答える 1

4

使用に関する大きな問題の1つtarget_A: .PHONYは、makeの組み込み変数の多くを使用するのがはるかに難しくなることです。この一般的なレシピを例として取り上げます。

%.a: $(OBJ_FILES)
    $(LD) $(LFLAGS) -o $@ $^

$^変数は、前提条件としてリストされているすべてのものを取り込みます。そこにもリストされている場合.PHONYは、コマンドラインでリンカーに渡されますが、これはおそらく何も良いことにはなりません。前提条件としてのようなメタターゲットを使用すると、使用されるたびに.PHONY多くの追加処理が必要になるため、これらの組み込み変数の有用性が大幅に低下します。$(filter-out .PHONY,$^)関係を反転し、代わり.PHONYにターゲットを作成することは、依存関係ツリーについて考えるために少し厄介ですが、makefileの残りの部分をクリーンアップします。

于 2012-07-20T22:35:19.157 に答える