首页 > 解决方案 > 不管 --jobs 是什么,GNU Make 只使用 4 个线程

问题描述

无论--jobs我提出什么论点,我总是得到 4 个线程。

在我可以看到以,make --jobs=1 target开头的标准输出行时,我只期望一个线程。make[1]:make[2]:make[3]:make[4]:

如果我使用相同的结果make --jobs=100 target,我得到 4 个线程而不是 100 个。

我不确定这是否相关,但我在 docker 容器中运行 make 并且 docker 有 7 个可用的本地主机内核。

>docker info
Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 7

在 Alpine Linux docker 容器内

>make --version
GNU Make 4.2.1
Built for x86_64-alpine-linux-musl

>grep -c ^processor /proc/cpuinfo
7

确认容器有 7 个核心。

有什么我可以运行的东西可以帮助我缩小为什么 make 会这样吗?

标签: dockermakefilegnu-make

解决方案


我认为有些混乱:后面的数字make不是线程号。Make实际上不是多线程的,它是单线程的。

该数字是正在调用的递归 make 进程的深度。无论您的值有多大(或小),它总是显示完全相同(给定相同的目标)-j,因为它表示已调用了多少 make 递归实例。

也就是说,如果你有类似的东西:

recurse:
        $(MAKE) ...

然后来自 make 的顶级实例的消息将是 ,来自配方make调用的子 make 的消息将是,等等。recursemake[1]


推荐阅读