GNU Make 4.3中.NOTPARALLEL指定目标后全局串行问题求助
问题原因与解决方法
你遇到的问题源于对.NOTPARALLEL特殊目标用法的误解。官方文档中“若.NOTPARALLEL带前置条件,仅该前置条件目标的任务串行”的表述,正确的用法是将.NOTPARALLEL作为目标的依赖,而非把目标作为.NOTPARALLEL的依赖。
你的原写法中,.NOTPARALLEL: notpara会让make认为.NOTPARALLEL这个特殊目标依赖notpara,而只要.NOTPARALLEL在Makefile中被定义(无论是否带依赖),make会默认全局串行执行,这就导致para目标也被强制串行。
修正后的Makefile
t%: @ echo "$@..." @ sleep 0.0$* @ echo "$@ - done" # 将.NOTPARALLEL作为notpara的依赖,仅构建notpara时串行 notpara: .NOTPARALLEL t4 t3 t2 t1 @ echo "Done!" para: t4 t3 t2 t1 @ echo "Done!" # 定义空的.NOTPARALLEL目标,不带依赖 .NOTPARALLEL:
验证效果
- 运行
make -j notpara:t4到t1会串行执行,符合预期。 - 运行
make -j para:t4到t1会并行执行,输出顺序会打乱,恢复正常并行行为。
内容的提问来源于stack exchange,提问作者hudac
相关产品推荐
相关产品推荐

