我正在寻找一种优雅的方式在GNU make中实现作业的并行化。这是我到目前为止所做的一个示例。Make以串行方式处理目录dir-1、dir-2和dir-3,这符合逻辑,但不是我的意图:
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“选项支持这些目录的并行处理?
发布于 2009-11-05 23:03:47
SUBDIRS = a b c
default: all
$(SUBDIRS)::
$(MAKE) -C $@ $(MAKECMDGOALS)
all clean : $(SUBDIRS)发布于 2009-11-06 01:30:00
这可能不会直接回答您的问题,但除了其他答案所建议的之外,我还建议研究非递归make技术。这确实是一种优雅的并行化构建方式,尽管根据现有的Makefile,可能需要大量的工作。非递归make的优势不仅限于容易并行化:它可以看到一个完整的依赖图,因此不需要构建太少或太多,这意味着更快(有时更快)的构建时间。
一些资源:
发布于 2012-05-01 05:07:10
我发现在使用::(双冒号规则)时,如果app、lib和doc之间存在依赖关系,则无法找到强制排序的方法。在阅读了GNU make手册的大部分内容后,我提出了以下规则,以便在使用通用递归Make的同时执行依赖关系。请注意,.PHONY规则用于强制make进入该目录,即使该目录已经存在。
SUBDIRS = app lib doc
default: all
app: lib
.PHONY: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@ $(MAKECMDGOALS)
all clean install: $(SUBDIRS)https://stackoverflow.com/questions/1681006
复制相似问题