makefile中处理组件的顺序

Sha*_*ala 35 makefile gnu-make

在makefile中,依赖行的形式是 -

abc: x y z
Run Code Online (Sandbox Code Playgroud)

所有三个组件(x,y,z)本身都是makefile中进一步向下的依赖行中的目标.

如果调用make abc,将执行三个目标x,y,z的顺序是什么?

Eld*_*mov 50

默认情况下,执行顺序与先决条件列表中指定的顺序相同,除非在这些先决条件之间定义了任何依赖关系.

abc: x y z
Run Code Online (Sandbox Code Playgroud)

订单是x y z.

abc: x y z
y : z
Run Code Online (Sandbox Code Playgroud)

订单将是x z y.

但理想情况下,您应该设计Makefile,以便它不依赖于指定先决条件的顺序.也就是说,如果y要执行后z,有必须是一个y : z依赖.

请记住,GNU Make可以并行执行一些配方,请参阅Mat的回答.

  • @Shailesh,不客气.我添加了UPD.发布主要答案后的部分. (2认同)

Mat*_*Mat 37

你真的不应该依赖它们的执行顺序 - 在其他条件相同的情况下,这些先决条件的所有三个配方都可以并行运行.

唯一的硬性规则是在运行目标配方之前必须满足所有先决条件.

如果和,并且没有并行执行之间没有依赖关系x,GNU make似乎按照您指定的顺序运行它们,但是在文档中不能保证这一点. yz

  • 另一种表达方式:每当*是*顺序依赖时,将其显式化为Makefile规则. (3认同)
  • 简短而明确的答案。我现在不能“+1”,但我会尽量不要忘记明天回来投票。 (2认同)

Jon*_*ler 17

POSIX描述make包括一个基本原理:

make中历史最悠久的实现公用事业处理的对象中的在左到右的顺序的先决条件,并且生成文件格式要求这一点.它支持许多生成yacc程序的makefile中使用的标准习惯用法; 例如:

foo: y.tab.o lex.o main.o
     $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果make选择任意顺序,则lex.o可能无法使用正确的顺序y.tab.h.虽然可能有更好的方式来表达这种关系,但它在历史上被广泛使用.希望并行更新先决条件的实现应该需要显式扩展make或makefile格式来完成它,如前所述.

(我相信t.tab.o$(CC)线路是错字y.tab.o,但有什么理由实际上说的.)

因此,从左到右处理先决条件的观察行为在此处进行验证,尽管它仅在基本原理部分中,而不在主要描述中.基本原理还提到并行make等问题.