2

私は現在、makefile ターゲットがどのように機能するかについて混乱しています。私は現在理解していますが、読んでいるチュートリアルがあまり明確ではないため、それが正しいかどうかはわかりません. ここに私の現在の理解があります

  1. ターミナルで「make」を実行すると、makefile ユーティリティは makefile 内の最初のターゲットを見つけて実行しようとしますが、その前にファイル内のすべての依存関係を調べます。
  2. (これが私が混乱し始めるところです): 依存関係がメイクファイルのターゲットであるが、メイクファイルのディレクトリにファイルとして存在しない場合、make は単にターゲットを実行します。依存関係がファイル名であり、メイクファイルのターゲットではない場合、ユーティリティはファイルの存在をチェックし、ファイルが存在しない場合、ユーティリティは警告を発します。依存関係がディレクトリに存在するファイルでありターゲットである場合、ファイルターゲットが依存するファイルのいずれかが関連ファイルよりも新しい場合、ターゲットが実行されます。

私はそれを正しく持っていますか?私が考えているよりも簡単ですか?

4

2 に答える 2

4

多かれ少なかれそのとおりですが、もう少し明確に述べることができます。make が最初のターゲットを選択する方法については正しいですが、もちろん、ユーザーが make コマンドラインで特定のターゲットを指定した場合は、最初のターゲットの代わりにそのターゲットが使用されます。

次に、make は基本的に、各ターゲットに対して次のように機能する再帰アルゴリズムを実装します。

  1. そのターゲットを構築するためのルールを見つけます。ターゲットをビルドするルールがない場合、make は失敗します。
  2. ターゲットの前提条件ごとに、その前提条件をターゲットとしてこのアルゴリズムを実行します。
  3. ターゲットが存在しない場合、または前提条件の変更時間がターゲットの変更時間よりも新しい場合は、ターゲットに関連付けられたレシピを実行します。レシピが失敗すると、(通常) make は失敗します。

それでおしまい!もちろん、これには多くの複雑な問題が隠されています。特に、項目 1 (ルールの検索) は、ターゲットに対する暗黙のルールがない状況では複雑になる可能性があります。また、ルールが失敗した場合の動作なども変更できます。

しかし、それは基本的なアルゴリズムです!

于 2013-06-02T15:18:27.917 に答える