【问题标题】:parallelize external Makefile并行化外部 Makefile
【发布时间】:2012-09-20 10:04:39
【问题描述】:

我有这个 Makefile

framework:
    @$(MAKE) -C $(HIGGSBASESELECTOR) 
    @$(MAKE) -C $(MATRIX4)
    @$(MAKE) -C $(SUBSELECTOR)
    @$(MAKE) -C $(MCSUBSELECTOR)
    @$(MAKE) -C $(MATRIXSUBSELECTOR)
    @$(MAKE) -C $(CHECKSUBSELECTOR)
    ...

如果我跑

 make -j framework

它只使用一个进程。重构此 Makfile 以使编译并行化的最佳(和快速)方法是什么?

【问题讨论】:

    标签: makefile multiple-makefiles


    【解决方案1】:

    您的规则按顺序执行$(MAKE) 命令,因此您一次只能看到一个进程也就不足为奇了。

    一种快速而肮脏的方法(如果没有等待这些调用的结果)是

    framework:
        @$(MAKE) -C $(HIGGSBASESELECTOR) &
        @$(MAKE) -C $(MATRIX4) &
        @$(MAKE) -C $(SUBSELECTOR) &
        @$(MAKE) -C $(MCSUBSELECTOR) &
        @$(MAKE) -C $(MATRIXSUBSELECTOR) &
        @$(MAKE) -C $(CHECKSUBSELECTOR) &
    

    如果这让你的血液变冷(它应该)你可以这样做:

    framework: $(HIGGSBASESELECTOR) $(MATRIX4) $(SUBSELECTOR) ...
        do things after the calls
    
    .PHONY: $(HIGGSBASESELECTOR) $(MATRIX4) $(SUBSELECTOR) ...
    $(HIGGSBASESELECTOR) $(MATRIX4) $(SUBSELECTOR) ...:
        @$(MAKE) -C $@
    

    【讨论】:

    • 我在.PHONY 线上得到:Makefile:88: *** multiple target patterns. Stop.
    • 我认为HIGGSBASESELECTORMATRIX4 等等都是简单的路径。这些是什么? (另外,我假设你知道 ... 是指其余的目标目录,MCSUBSELECTOR 等等。)
    • 你能举一个产生错误的路径的例子吗?另外,您使用的是哪个版本的 Make?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多