make gnu-并行运行目标
收藏

我有这个makefile并且我想并行运行两个目标,自动运行make而不是make -j...
我使用make文件中每个操作系统的makeflags和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”


最佳答案:

是的,这是可能的,如果NPROCS > 1并且您的平台支持parallel make,那么您的makefile将执行您想要的操作。例如,请参见GNU make manual
如果您希望
选项,例如'-k'(请参阅选项摘要),在每次运行时设置
制造。只需在环境中为MAKEFLAGS设置一个值。你
也可以在makefile中设置MAKEFLAGS,以指定
也应该对该生成文件有效。
如果你愿意,你也可以自己测试。下面证明了使用NPROCS+1配方以并行模式运行。每个配方都会打印第一条消息,睡眠2秒,然后打印第二条消息。
如果以并行模式运行,您应该会看到打印的NPROCSrun moduleX with NPROCS=Y消息,以及2秒后的NPROCSdone 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

    公众号
    关注公众号订阅更多技术干货!