【问题标题】:make gnu - Run targets on parallelmake gnu - 并行运行目标
【发布时间】:2019-02-21 06:38:32
【问题描述】:

我有这个makefile,我想并行运行两个目标,自动运行make而不是make -j... 我使用 make 文件中每个操作系统的 makeflages 和 NPROCS (这里是达尔文) 是否可以 ?

all: module1 module2

NPROCS = $(shell sysctl hw.ncpu  | grep -o '[0-9]\+')
MAKEFLAGS += -j$(NPROCS)

.PHONY: module1
module1:
    @echo "run module 1"
    @echo $(DIR)

.PHONY: module2
module2:
    @echo "run module2”

【问题讨论】:

    标签: linux makefile gnu-make


    【解决方案1】:

    是的,这是可能的,如果NPROCS > 1 并且您的平台支持并行 make,您的 makefile 将执行您想要的操作。例如,参见GNU make manual

    MAKEFLAGS 变量也很有用,如果你想有某些 选项,例如“-k”(请参阅​​选项摘要),每次运行时设置 制作。您只需在您的环境中为 MAKEFLAGS 设置一个值。你 还可以在 makefile 中设置 MAKEFLAGS,以指定附加标志 该 makefile 也应该有效。

    如果您愿意,您也可以自己测试。以下证明 make 使用 NPROCS+1 配方以并行模式运行。每个配方打印第一条消息,休眠 2 秒并打印第二条消息。

    如果 make 在并行模式下运行,您应该会看到 NPROCS run moduleX with NPROCS=Y 消息打印,并在 2 秒后看到 NPROCS done moduleX 消息。然后您应该会看到最后一条 run moduleX with NPROCS=Y 消息,然后在 2 秒后看到最后一条 done moduleX 消息。

    否则,如果它不以并行模式运行,您将看到交替出现run moduleX with NPROCS=Y 消息和done moduleX 消息。

    演示:

    $ cat Makefile
    SHELL       := bash
    NPROCS      := $(shell sysctl hw.ncpu  | grep -o '[0-9]\+')
    MAKEFLAGS   += -j$(NPROCS)
    MODULES     := $(shell for (( i = 1; i <= $(NPROCS) + 1; i++ )); do printf 'module%d ' "$$i"; done)
    
    .PHONY: all $(MODULES)
    
    all: $(MODULES)
    
    $(MODULES):
        @echo "run $@ with NPROCS=$(NPROCS)"; sleep 2; echo "done $@"
    
    $ make
    run module1 with NPROCS=8
    run module2 with NPROCS=8
    run module3 with NPROCS=8
    run module4 with NPROCS=8
    run module5 with NPROCS=8
    run module6 with NPROCS=8
    run module7 with NPROCS=8
    run module8 with NPROCS=8
    done module2
    done module3
    done module6
    done module8
    done module1
    done module7
    done module4
    done module5
    run module9 with NPROCS=8
    done module9
    

    【讨论】:

    • 非常感谢!在这里您将模块更改为 dynamically ,是否可以保留我发布的结构(以模块1和模块2为目标)并将其用作并行?
    • 当然可以,而且要简单得多。我动态生成了目标,以便演示适用于NPROCS 的任何值,但您可以将MODULES 变量分配替换为MODULES := module1 module2。您甚至可以取消此变量并将所有$(MODULES) 替换为module1 module2
    • 对不起 :) 所以在这种情况下,我不确定我在问题中发布的内容有什么区别,如果你能更新你的答案会很棒,因为我错过了增量......
    • 我展示的是一个 make 以并行模式运行的演示器,这是您使用自己的 makefile 看不到的。我在配方中添加了sleep 命令,这样,查看输出,很明显 make 是否并行运行配方。如果不是,您会看到run moduleX with NPROCS=Ydone moduleX 消息交替出现。看?只是一个演示,没有别的。它对所有moduleX 目标和NPROCS+1 模块目标的自动生成进行了一些分解,以便更好地演示,但没有什么重要的。如果您愿意,请忽略它。
    • 我的答案中唯一重要的部分是第一个词:“Yes”。如果对您没有意义,请忽略其余部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多