首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU make中递归作业的并行化

GNU make中递归作业的并行化
EN

Stack Overflow用户
提问于 2009-11-05 22:46:05
回答 4查看 8.9K关注 0票数 15

我正在寻找一种优雅的方式在GNU make中实现作业的并行化。这是我到目前为止所做的一个示例。Make以串行方式处理目录dir-1、dir-2和dir-3,这符合逻辑,但不是我的意图:

代码语言:javascript
复制
SUBDIRS=dir-1 dir-2 dir-3

default: all

all:
  @for dir in $(SUBDIRS); do (cd $$dir; $(MAKE)); done

.PHONY: clean

clean:
  @for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) clean); done

有没有办法在不为每个目录指定特定目标的情况下,使用"-j“选项支持这些目录的并行处理?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-05 23:03:47

代码语言:javascript
复制
SUBDIRS = a b c

default: all

$(SUBDIRS)::
    $(MAKE) -C $@ $(MAKECMDGOALS)

all clean : $(SUBDIRS)
票数 16
EN

Stack Overflow用户

发布于 2009-11-06 01:30:00

这可能不会直接回答您的问题,但除了其他答案所建议的之外,我还建议研究非递归make技术。这确实是一种优雅的并行化构建方式,尽管根据现有的Makefile,可能需要大量的工作。非递归make的优势不仅限于容易并行化:它可以看到一个完整的依赖图,因此不需要构建太少或太多,这意味着更快(有时更快)的构建时间。

一些资源:

  • Discussion on SO
  • The classic text about trouble with recursive make
  • Design of non-recursive makefile
  • Implementation
  • Another implementation
  • Benchmarks (quite outdated though)
票数 5
EN

Stack Overflow用户

发布于 2012-05-01 05:07:10

我发现在使用::(双冒号规则)时,如果applibdoc之间存在依赖关系,则无法找到强制排序的方法。在阅读了GNU make手册的大部分内容后,我提出了以下规则,以便在使用通用递归Make的同时执行依赖关系。请注意,.PHONY规则用于强制make进入该目录,即使该目录已经存在。

代码语言:javascript
复制
SUBDIRS = app lib doc

default: all

app: lib

.PHONY: $(SUBDIRS)

$(SUBDIRS):
    $(MAKE) -C $@ $(MAKECMDGOALS)

all clean install: $(SUBDIRS)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1681006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档