如何判断提供的-j选项

时间:2012-06-05 13:47:46

标签: makefile gnu-make

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

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

有没有办法获取此值,或者Makefile被调用的命令行,或者具有相关信息的类似内容?只在GNU make中使用它是可以的。

2 个答案:

答案 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进程之间传递有关管道端点的信息。这揭示了引擎盖下发生的一些事情......

相关问题