4

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

但是,据我所知,没有办法-j从内部获取选项的值Makefile,甚至无法作为make调用程序中的环境变量。

有没有办法获得这个值,或者make调用的命令行,或者类似的东西,会有相关的信息?让它只在 GNU make 中工作是可以的。

4

2 回答 2

2

最后make 4.2.1他们做MAKEFLAGS对了。也就是说,您可以在 Makefile 中有一个目标

opts:
    @echo $(MAKEFLAGS)

并让它告诉你-j参数权的值。

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

(在make 4.1它仍然被打破)。不用说,echo 您可以调用一个脚本来正确解析MAKEFLAGS

于 2016-09-29T15:25:26.277 回答
1

注意:此答案涉及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 进程之间传达有关管道端点信息的表达式。这暴露了引擎盖下发生的一些事情......

于 2012-06-25T01:17:57.410 回答