在Racket的构建系统中,我们有一个构建步骤,它调用一个可以同时运行多个并行任务的程序。由于这是从 调用的make
,因此最好尊重最初调用 的-j
选项。make
但是,据我所知,没有办法-j
从内部获取选项的值Makefile
,甚至无法作为make
调用程序中的环境变量。
有没有办法获得这个值,或者make
调用的命令行,或者类似的东西,会有相关的信息?让它只在 GNU make 中工作是可以的。
最后make 4.2.1
他们做MAKEFLAGS
对了。也就是说,您可以在 Makefile 中有一个目标
opts:
@echo $(MAKEFLAGS)
并让它告诉你-j
参数权的值。
$ make -j10 opts
-j10 --jobserver-auth=3,4
(在make 4.1
它仍然被打破)。不用说,echo
您可以调用一个脚本来正确解析MAKEFLAGS
注意:此答案涉及make
版本 3.82 及更早版本。有关 4.2 版的更好答案,请参阅 Dima Pasechnik 的答案。
您无法分辨出提供了什么 -j 选项。根据以下引用,无法从 make 或其子流程以常规方式访问有关作业数量的信息:
顶级 make 及其所有子 make 进程使用管道相互通信,以确保在所有 make 中启动的作业不超过 N 个。
(取自 make 3.82 源代码树中名为 NEWS 的文件)
顶层 make 进程充当作业服务器,通过管道将令牌分发给子 make 进程。您的目标似乎是进行自己的并行处理,并且仍然遵守提供给make
. 为了实现这一点,您必须以某种方式通过该管道将自己插入到通信中。但是,这是一个未命名的管道,据我所知,您自己的进程无法加入作业服务器机制。
顺便说一句,您提到的“标志的预处理版本”包含--jobserver-fds=3,4
用于在 make 进程之间传达有关管道端点信息的表达式。这暴露了引擎盖下发生的一些事情......