makefile 中处理组件的顺序

问题描述 投票:0回答:5

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

abc: x y z

所有三个组件 (x,y,z) 本身都是 makefile 中依赖行中更下方的目标。

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

makefile gnu-make
5个回答
71
投票

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

abc: x y z

顺序是

x y z

abc: x y z
y : z

顺序是

x z y

但理想情况下,您应该设计 Makefile,使其不依赖于指定先决条件的顺序。也就是说,如果

y
应该在
z
之后执行,那么一定有一个
y : z
依赖。

请记住,GNU Make 可以并行执行一些食谱,请参阅Mat 的回答


58
投票

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

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

如果

x
y
z
之间没有依赖关系,并且没有并行执行,GNU make 似乎会按照您指定的顺序运行它们,但文档中不保证这一点。


22
投票

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

大多数历史实现中的

make
实用程序按从左到右的顺序处理目标的先决条件,并且 makefile 格式需要这样做。它支持许多生成
yacc
程序的 makefile 中使用的标准习惯用法;例如:

foo: y.tab.o lex.o main.o
     $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o

在此示例中,如果

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

我相信

t.tab.o
行中的
$(CC)
y.tab.o
的拼写错误,但这就是其实际意义。

因此,观察到的先决条件从左到右处理的行为在这里得到了验证,尽管它只在基本原理部分,而不是在主要描述中。基本原理还提到了并行

make
等问题。


0
投票

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
,则必须从源代码构建。


-5
投票

https://stackoverflow.com/a/22638294/636849,您可以添加管道符号:

abc: | x y z

来自制作手册: 可以通过在先决条件列表中放置管道符号 (|) 来指定仅顺序先决条件:管道符号左侧的任何先决条件都是正常的;右侧的任何先决条件均仅限订购:

目标:正常先决条件 |仅订购先决条件

© www.soinside.com 2019 - 2024. All rights reserved.