2011-03-14 63 views
21

我一直在寻找一个小时,这个信息似乎是无处-j ...GNU做:提取参数中的Makefile

我希望能够提取(也可能使用)在Makefile中通过-j选项传递的请求make“jobs”的数量,或者在sub-make的情况下通过Make自身的数量。

我迄今看到的最有希望的事情是$(MAKEFLAGS)变量,但在我的系统上(如果我这样做,使-j2)这个变量的内容只是“--jobserver-fds = 3,4 -j“。有没有什么办法可以获得通过-j传递的实际工作数量?

+1

你为什么要这样做?这是违反make的精神,我敢肯定有更好的方法来实现你想做的事情。 – 2011-03-14 20:29:53

+0

您可以将顶层Makefile中的作业数设置为一个可变参数,它将在内部调用'make -j'。 – aaz 2011-03-14 20:54:39

+0

@static_rtti,我希望能够更多地了解make的实际执行情况(特别是当它使用$(MAKE)调用时)。例如,所有子作品的job_slots值是1还是sub可以传递顶层可用的N个作业的一部分?按照Raphael的建议读取源代码可能是确定这种情况的方法,但我认为试验make本身可能会更简单。 – 2011-03-15 18:58:20

回答

11

实际上有一种方法可以在* nix的makefile中完全实现它。

MAKE_PID := $(shell echo $$PPID) 
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)"))) 
JOBS  := $(subst -j,,$(JOB_FLAG)) 

ps,grep也需要安装,但它几乎是给定的。它可以进一步改善处理 - 上班

+0

我刚试过这个,它效果很好!如果用户没有传递任何'-j'来做,我可能会做一个小小的修改来设置'$ JOB_FLAG'为1。谢谢! – 2015-12-16 17:13:57

+0

您也可以读取'/ proc/$ PPID/cmdline'来代替'ps'的输出。 – 2018-01-05 07:22:21

12

对不起,但没有办法确定并行作业的数量 - 无需编写扫描进程列表以识别调用参数的应用程序或脚本。

检查源代码http://cvs.savannah.gnu.org/viewvc/make/main.c?revision=1.246&root=make&view=markup。搜索job_slots > 1

更新:如果您可以控制操作范围,则可以用自己的程序/脚本包装make应用程序,解析参数,设置专用环境变量并在之后调用原始的make。

+2

Upvote for go to the source。 – 2011-03-14 22:48:57

+0

嗨拉斐尔,谢谢你的回答。这是我害怕的!现在我只是简单地修改了我的Makefile文件,因此不需要-j的实际值......我认为这更符合“make的精神”; -P – 2011-03-15 18:55:41