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(可以通过将特殊.POSIX目标添加到 makefile 中来在 GNU Make 中进行模拟)在处理先决条件时指定从左到右的顺序。

答案2

仅订单先决条件与处理它们的顺序无关。它们可以按任何顺序处理,甚至可以并行处理。仅订单意味着更新先决条件不会更新目标。看这个答案

答案3

虽然文档中并不清楚,但运行示例你会发现顺序确实是从左到右。

myrule_step1
myrule_step2
myrule

相关内容