Makefile 我怎样才能知道提供了什么-j选项

Makefile 我怎样才能知道提供了什么-j选项,makefile,gnu-make,Makefile,Gnu Make,在的构建系统中,我们有一个构建步骤,该步骤调用一个可以同时运行多个并行任务的程序。由于这是从make调用的,因此最好尊重make最初使用的-j选项 但是,据我所知,无法从Makefile内部获取-j选项的值,甚至无法将其作为生成调用的程序中的环境变量 是否有方法获取此值,或调用make的命令行,或类似的内容,以获取相关信息?在GNU make中只使用此选项是可以的。注意:此答案与make3.82版及更早版本有关。有关4.2版之后的更好答案,请参阅Dima Pasechnik的答案 您无法判断提

在的构建系统中,我们有一个构建步骤,该步骤调用一个可以同时运行多个并行任务的程序。由于这是从
make
调用的,因此最好尊重
make
最初使用的
-j
选项

但是,据我所知,无法从
Makefile
内部获取
-j
选项的值,甚至无法将其作为
生成
调用的程序中的环境变量


是否有方法获取此值,或调用
make
的命令行,或类似的内容,以获取相关信息?在GNU make中只使用此选项是可以的。

注意:此答案与
make
3.82版及更早版本有关。有关4.2版之后的更好答案,请参阅Dima Pasechnik的答案


您无法判断提供了什么-j选项。根据以下引用,无法通过常规方式从make或其子流程访问有关作业数量的信息:

top make及其所有子make流程使用管道与进行通信 彼此确保在所有品牌中启动的作业不超过N个

(摘自make 3.82源代码树中名为NEWS的文件)

top make进程充当作业服务器,通过管道将令牌分发给子make进程。您的目标似乎是完成自己的并行处理,并且仍然遵守为
make
提供的指定最大并发作业数。为了实现这一点,您必须以某种方式通过该管道将自己插入到通信中。但是,这是一个未命名的管道,据我所知,您自己的进程无法加入作业服务器机制


顺便说一下,您提到的“标志的预处理版本”包含表达式
--jobserver fds=3,4
,用于在make进程之间传递有关管道端点的信息。这暴露了引擎盖下发生的一些事情…

make4.2.1
中,他们最终获得了
MAKEFLAGS
的正确答案。也就是说,您可以在Makefile中有一个目标

opts:
    @echo $(MAKEFLAGS)
设置它将告诉您
-j
参数的正确值

$ make -j10 opts
-j10 --jobserver-auth=3,4

(在
make4.1
中,它仍处于损坏状态)。不用说,
-j
选项的目的不是允许Make自身管理依赖项解析的多个并行跟踪,而不是调用脚本来正确解析
MAKEFLAGS

?因此,您的构建系统已经并行化了,而不需要显式地并行化所涉及的各个应用程序。@OliCharlesworth,构建系统的大部分都是使用make进行管理的,其中
-j
是合适的工具。然后,有一个阶段调用Racket程序,它在内部可以并行运行。我们希望让用户控制这两个地方,在这两个地方,并行任务通过单个控制点生成。另外,整个构建是通过调用
make
开始的,因此
-j
是指定所需并行性的最简单方法。通常,
$(MAKEFLAGS)
会为您提供此类信息。你试过玩这个吗?@Reinier,很遗憾,
$(MAKEFLAGS)
得到了一个经过预处理的标志版本,对于所有大于1的
-j
选项都是相同的。我会给这个问题添加一个答案,但这不是一个解决方案。这很奇怪。如果在标记的预处理版本中丢失了信息,那么在我看来这就像是
make
中的一个bug。好吧,这不是我所希望的答案,但似乎确实是答案。谢谢。如果你真的很想获得所需的作业数量和make进程的活动数量的信息,我想你可以为
make
做一个
ps-ef
grep
,并解析输入——包括PID树和子PID。这样,您可以找到
-j
的值以及活动作业的数量。不过,您仍然无法完全参与作业服务器流程。祝你好运:-)