在Racket的构建系统中,我们有一个构建步骤,可以调用一次可以运行多个并行任务的程序。由于这是从make
调用的,因此尊重最初调用-j
的{{1}}选项会很好。
但是,据我所知,没有办法从make
内部获取-j
选项的值,或者甚至作为{{1}的程序中的环境变量调用。
有没有办法获取此值,或者Makefile
被调用的命令行,或者具有相关信息的类似内容?只在GNU make中使用它是可以的。
答案 0 :(得分:2)
在make 4.2.1
中,他们最终得到了MAKEFLAGS
。也就是说,您可以在Makefile中拥有目标
opts:
@echo $(MAKEFLAGS)
并使它会告诉你-j
参数的值。
$ make -j10 opts
-j10 --jobserver-auth=3,4
(在make 4.1
中它仍然被打破)。毋庸置疑,您可以调用脚本来正确解析echo
MAKEFLAGS
。
答案 1 :(得分:1)
注意:此答案涉及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进程之间传递有关管道端点的信息。这揭示了引擎盖下发生的一些事情......