ルールがあると仮定します:
a: b c d e
とb
、c
、d
およびe
は互いに独立しています。
b
、c
、d
、を作る順番は決まっていe
ますか?一般的には、、、、の順番で作られているようですが、b
場合c
によっては順番が違うことはありませんか?d
e
ルールがあると仮定します:
a: b c d e
とb
、c
、d
およびe
は互いに独立しています。
b
、c
、d
、を作る順番は決まっていe
ますか?一般的には、、、、の順番で作られているようですが、b
場合c
によっては順番が違うことはありませんか?d
e
いいえ、順序は定義されていません。これが、宣言型の依存性指向プログラミングを使用する際の要点です。つまり、コンピューターが最適な評価順序を選択できるか、実際にはそれらを同時に評価できるということです。
GNU make はどのような順序で前提条件を作成しますか?
前提条件の種類によって異なります。GNU Make Manual、セクション4.2によると:
GNU make が認識する前提条件には、実際には 2 つの異なるタイプがあります。前のセクションで説明したような通常の前提条件と、注文のみの前提条件です。通常の前提条件は 2 つのステートメントを作成します。最初に、レシピが呼び出される順序を課します。ターゲットのすべての前提条件のレシピは、ターゲットのレシピが実行される前に完了します。次に、依存関係を課します。前提条件がターゲットよりも新しい場合、ターゲットは古いと見なされ、再構築する必要があります。
通常、これはまさにあなたが望むものです: ターゲットの前提条件が更新された場合、ターゲットも更新されるべきです。
ただし、ルールの 1 つが実行された場合にターゲットを強制的に更新せずに、呼び出すルールに特定の順序を適用したい場合があります。その場合、注文のみの前提条件を定義します。注文のみの前提条件は、パイプ記号 (|) を前提条件リストに配置することで指定できます。パイプ記号の左側の前提条件はすべて正常です。右側の前提条件は注文のみです。
targets: normal-prerequisites | order-only-prerequisites
もちろん、通常の前提条件セクションは空の場合があります。また、同じターゲットに対して複数行の前提条件を宣言することもできます。それらは適切に追加されます (通常の前提条件は通常の前提条件のリストに追加され、注文のみの前提条件は注文のみの前提条件のリストに追加されます)。同じファイルを通常の前提条件と注文のみの前提条件の両方として宣言すると、通常の前提条件が優先されることに注意してください (注文のみの前提条件の動作の厳密なスーパーセットがあるため)。
ターゲットを別のディレクトリに配置する例を考えてみましょう。そのディレクトリは、
make
実行前には存在しない可能性があります。この状況では、ターゲットを配置する前にディレクトリを作成する必要がありますが、ファイルが追加、削除、または名前変更されるたびにディレクトリのタイムスタンプが変更されるため、すべてのターゲットを再構築する必要はありません。ディレクトリのタイムスタンプの変更。これを管理する 1 つの方法は、順序のみの前提条件を使用することです。ディレクトリをすべてのターゲットで順序のみの前提条件にします。OBJDIR := objdir OBJS := $(addprefix $(OBJDIR)/,foo.o bar.o baz.o) $(OBJDIR)/%.o : %.c $(COMPILE.c) $(OUTPUT_OPTION) $< all: $(OBJS) $(OBJS): | $(OBJDIR) $(OBJDIR): mkdir $(OBJDIR)
これで、必要に応じて「.o」が構築される前に「objdir」ディレクトリを作成するルールが実行されますが、「objdir」ディレクトリのタイムスタンプが変更されたため、「.o」は構築されません。
指定したルールに基づいて、適切な順序で。あなたの特定の例では、それはいくつかの異なる(メモリから4!= 24)注文のいずれかを意味する可能性があります。
すべてのmake
プログラムは、依存関係が尊重される限り、好きな順序を自由に選択できます。あなたの例に他のルールがあった場合、たとえば 、c: b
前c
に作成されますb
(ただし、指摘したように、そうではありません)。
特定の順序に依存する必要がある場合は、それを適用するためのルールがさらに必要になります。それ以外の場合make
は、好きなことを行うことができます。GNU Makeのドキュメントには、ルールがどのように処理されるかのみが記載されており、ルール内の依存関係が処理される順序は記載されていません。最も論理的な順序 (とにかく、私にとって) は、それらがリストされている順序ですが、それは保証されていません。
いいえ、依存関係がない場合、順序を当てにすることはできません。
確かに、私が を使用するmake -j a
と、それらはすべて同時にビルドされる可能性があります ( b
、c
、d
、またはe
順番に他の/相互に関連する依存関係があるかどうかによって異なります)。