GNU Make:检查并行作业数

Pat*_*nan 3 makefile gnu-make

我想对(GNU)生成文件添加快速检查,以提醒用户-j/ --jobs(并行生成)的可用性。也就是说,类似

$ make
  TIP: this will build faster if you use use "make -j"
  Building ..

$ make -j 
  Building in parallel ..
Run Code Online (Sandbox Code Playgroud)

执行Makefile时,如何确定并行作业的数量?

这里有个窍门 http://blog.jgc.org/2015/03/gnu-make-insanity-finding-value-of-j.html

以及对GNU的建议更改在此处 https://github.com/esantoro/make/commit/b0334e7f3009dc58dbc8e6e6fdec94711537fb3b

但是也许有些更新和/或更容易的东西。

Max*_*kin 5

通过使用make Jobserver 协议,您可以比博客建议的更容易和更快地确定作业数量:

SHELL := /bin/bash

all:
    @${MAKE} --no-print-directory job_count_test

job_count_test: 
    @+[[ "${MAKEFLAGS}" =~ --jobserver[^=]+=([0-9]+),([0-9]+) ]] && ( J=""; while read -t0 -u $${BASH_REMATCH[1]}; do read -N1 -u $${BASH_REMATCH[1]}; J="$${J}$${REPLY}"; done; echo "Building with $$(expr 1 + $${#J}) jobs."; echo -n $$J >&$${BASH_REMATCH[2]} ) || echo "TIP: this will build faster if you use use \"make -j$$(grep -c processor /proc/cpuinfo)\""

.PHONY: all job_count_test
Run Code Online (Sandbox Code Playgroud)

进而:

$ make 
TIP: this will build faster if you use use "make -j8"
$ make -j12
Building with 12 jobs.
Run Code Online (Sandbox Code Playgroud)


Mad*_*ist 5

最简单/最佳的解决方案是将您的GNU make版本升级到4.2或更高版本。从该版本开始,该MAKEFLAGS变量将提供完整的-j选项,包括数字。新闻文件显示:

  • 即使启用了作业服务器,并行度的数量也可以通过查询MAKEFLAGS来确定(以前,启​​用作业服务器时,MAKEFLAGS始终只包含“ -j”,而没有数字)。

所以:

$ make --version
GNU Make 4.2.1
  ...

$ echo 'all:;@echo $(MAKEFLAGS)' | make -f-

$ echo 'all:;@echo $(MAKEFLAGS)' | make -f- -j
-j
$ echo 'all:;@echo $(MAKEFLAGS)' | make -f- -j10
-j10 --jobserver-auth=3,4
$ echo 'all:;@echo $(patsubst -j%,%,$(filter -j%,$(MAKEFLAGS)))' | make -f- -j10
10
Run Code Online (Sandbox Code Playgroud)