GNU Make 4.3(MinGW-w64端口)无法并行运行部分目标的问题咨询
GNU Make 部分目标串行、部分并行的实现问题
问题场景
使用mingw32-make 4.3(Windows32版本),默认通过-j选项运行时,Make会并行执行所有目标。但启用.NOTPARALLEL: target0后,所有目标都变为串行执行。这并非操作错误或bug,而是对.NOTPARALLEL特性的理解偏差。需求是实现部分目标并行运行,部分目标强制串行执行。
参考Makefile
.DEFAULT_GOAL := all .PHONY: all all: target0 target1 target2 # 启用此行会让所有目标串行执行 #.NOTPARALLEL: target0 .PHONY: target0 target0: @python delayed_print.py 0 .PHONY: target1 target1: @python delayed_print.py 1 .PHONY: target2 target2: @python delayed_print.py 2
其中delayed_print.py是一个简单的Python脚本,会延迟数秒后打印传入参数,用于观察并行执行效果。
版本信息
mingw32-make --version GNU Make 4.3 Built for Windows32 Copyright (C) 1988-2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.
原因说明
.NOTPARALLEL是GNU Make的全局特殊目标,无论是否指定依赖,只要定义了该目标,整个Make会话都会强制串行执行所有任务,无法实现局部目标的串行控制。
实现需求的两种方法
方法1:通过依赖分组实现串行+并行
如果需要让某一个/一组目标先串行执行,再让其他目标并行,可以通过构建依赖链实现:
.DEFAULT_GOAL := all .PHONY: all # 先执行串行的target0,再并行执行target1和target2 all: target0 parallel_targets .PHONY: parallel_targets parallel_targets: target1 target2 .PHONY: target0 target0: @python delayed_print.py 0 .PHONY: target1 target1: @python delayed_print.py 1 .PHONY: target2 target2: @python delayed_print.py 2
执行mingw32-make -j时,会先等待target0执行完成,再并行启动target1和target2。
方法2:通过子Make进程实现局部串行
如果需要让某一组目标内部强制串行,同时与其他目标并行,可以通过子Make进程指定-j1实现:
.DEFAULT_GOAL := all .PHONY: all all: serial_group parallel_group # 子Make强制串行执行target0和targetA .PHONY: serial_group serial_group: @mingw32-make -j1 target0 targetA # 并行执行target1和target2 .PHONY: parallel_group parallel_group: target1 target2 .PHONY: target0 target0: @python delayed_print.py 0 .PHONY: targetA targetA: @python delayed_print.py A .PHONY: target1 target1: @python delayed_print.py 1 .PHONY: target2 target2: @python delayed_print.py 2
这种方式下,serial_group内部的target0和targetA会串行执行,而serial_group与parallel_group之间可以并行运行。
内容的提问来源于stack exchange,提问作者jgreen81
相关产品推荐
相关产品推荐

