代码之家  ›  专栏  ›  技术社区  ›  Patrick Sanan

GNU Make:检查并行作业的数量

  •  7
  • Patrick Sanan  · 技术社区  · 6 年前

    我想向(GNU)makefile添加一个快速检查,它可以提醒用户 -j / --jobs (平行制造)。也就是说

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

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

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

    建议对GNU进行修改 https://github.com/esantoro/make/commit/b0334e7f3009dc58dbc8e6e6fdec94711537fb3b

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

    2 回复  |  直到 6 年前
        1
  •  11
  •   2240    3 年前

    最简单/最好的解决方案是将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
    
        2
  •  5
  •   Maxim Egorushkin    6 年前

    您可以使用 make Jobserver protocol :

    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
    

    然后:

    $ make 
    TIP: this will build faster if you use use "make -j8"
    $ make -j12
    Building with 12 jobs.