我一直在读文档但我仍然不清楚订单是如何处理的。在示例中:
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