在 makefile 中,依赖行的形式为 -
abc: x y z
所有三个组件 (x,y,z) 本身都是 makefile 中依赖行中更下方的目标。
如果调用 make abc,三个目标 x,y,z 将以什么顺序执行?
默认情况下,执行顺序与先决条件列表中指定的顺序相同,除非这些先决条件之间定义了任何依赖关系。
abc: x y z
顺序是
x y z
。
abc: x y z
y : z
顺序是
x z y
。
但理想情况下,您应该设计 Makefile,使其不依赖于指定先决条件的顺序。也就是说,如果
y
应该在z
之后执行,那么一定有一个y : z
依赖。
请记住,GNU Make 可以并行执行一些食谱,请参阅Mat 的回答。
您确实不应该依赖它们的执行顺序 - 在其他条件相同的情况下,这些先决条件的所有三个配方都可以并行运行。
唯一的硬性规则是在运行目标配方之前必须满足所有先决条件。
如果
x
、y
和 z
之间没有依赖关系,并且没有并行执行,GNU make 似乎会按照您指定的顺序运行它们,但文档中不保证这一点。
make
的 POSIX 描述包含一个基本原理:
大多数历史实现中的
实用程序按从左到右的顺序处理目标的先决条件,并且 makefile 格式需要这样做。它支持许多生成make
程序的 makefile 中使用的标准习惯用法;例如:yacc
foo: y.tab.o lex.o main.o $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o
在此示例中,如果
选择任意顺序,则make
可能无法使用正确的lex.o
制作。尽管可能有更好的方式来表达这种关系,但它在历史上被广泛使用。想要并行更新先决条件的实现应该需要对y.tab.h
或 makefile 格式的显式扩展来完成它,如前所述。make
(我相信
t.tab.o
行中的 $(CC)
是 y.tab.o
的拼写错误,但这就是其实际意义。)
因此,观察到的先决条件从左到右处理的行为在这里得到了验证,尽管它只在基本原理部分,而不是在主要描述中。基本原理还提到了并行
make
等问题。
GNU make 4.4 的新功能,我们有
.WAIT
先决条件!
将其设置为依赖项,它将暂停其right的所有依赖项,直到left的所有依赖项完成。
all: please_run_me and_me .WAIT before_me
请注意,
please_run_me
和 and_me
之间的顺序并不相关,但两者都会在 before_me
开始之前完成。
您可以在一条线上扔多个
.WAIT
。
还添加了另一种方法来执行此操作 -
.NOTPARALLEL
,您可以在更改日志或手册中阅读相关内容
虽然它于 2022 年 10 月 31 日发布,但某些发行版(例如:Ubuntu)可能尚未预装它。
如果您想为此类设备安装
make
,则必须从源代码构建。
从https://stackoverflow.com/a/22638294/636849,您可以添加管道符号:
abc: | x y z
来自制作手册: 可以通过在先决条件列表中放置管道符号 (|) 来指定仅顺序先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件均仅限订购:
目标:正常先决条件 |仅订购先决条件