You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:11:05