GNU Makeファイルで注文専用の前提条件が処理される順序は何ですか?

GNU Makeファイルで注文専用の前提条件が処理される順序は何ですか?

私は読んでいた文書しかし、まだ注文がどのように処理されるのかわかりません。例では:

myrule: | myrule_step1 myrule_step2
    @echo "$(@)"

myrule_step1:
    @echo "$(@)"

myrule_step2:
    @echo "$(@)"

何を最初に印刷しますか? myrule_step1またはmyrule_step2

答え1

順序は指定されていないどの順序でも実行できます。これは単なる理論的な質問ではありません。並列ビルド中に発生する可能性があります。質問と同じMakefileを想定して、次を実行します。

watch -n 0.1 make -j8

印刷に数秒しかかかりませんでした。

myrule_step2
myrule_step1
myrule

また、見ることができますこのStackOverflowの答え著者: Jörg W Mittag:

いいえ、順序は定義されていません。これはすべてですより宣言的依存性指向プログラミングを使用している場合:コンピュータは最高の評価順序を選択するか、実際に評価することもできます。同時に

しかし、mosvyが指摘したように、これはGNU Makeでのみ機能します。 POSIX make(makefileに特別なターゲットを追加して.POSIXGNU Makeでエミュレートできる)は、前提条件を処理するときに左から右の順序を指定します。

答え2

注文の前提条件だけが処理順序とは無関係です。順序に関係なく、並列に処理することもできます。順序のみは、前提条件を更新してもターゲットが更新されないことを意味します。バラよりこの回答

答え3

ドキュメントには明確ではありませんが、例を実行すると、順序が実際には左から右であることがわかります。

myrule_step1
myrule_step2
myrule

関連情報