【问题标题】:GNU make - how to serialize calls to foreach $(MAKE)GNU make - 如何序列化对 foreach $(MAKE) 的调用
【发布时间】:2017-01-31 19:55:38
【问题描述】:

我有

$(foreach ___project___, $(UNIT_TEST_STUBS),$(MAKE) -C ../../$(___project___) $(UT_CMD) || exit 1;)

我希望make 在每个子制作中是并行的,但我不希望子制作并行执行。

我该怎么做?

【问题讨论】:

  • 如果你提供一个完整的规则,至少会更容易回答。但是,假设您在这里引用的是配方的内容,这将按照您想要的方式运行:每个子 make 将被串行调用,并且在每个子 make 中,目标将被并行构建。
  • @MadScientist 那么如果我希望 submakes 并行执行该怎么写呢?
  • 你不能从一个目标/配方中做到这一点。您必须为每个子 make 编写一个目标,因此 make 可以正确地并行化它们。例如:stackoverflow.com/questions/17834582/…
  • sn-p 看起来像食谱的一部分,它的扩展是$(MAKE) -C ../../foo/ ut-cmd || exit 1; $(MAKE) -C ../../bar/ ut-cmd || exit 1; etc。因此,子制作将由同一个 shell 实例串行执行。只需在$(MAKE) 之后添加-j<whatever> 即可。我在这里错过了什么吗?
  • @MichaelLivshin 我假设如果你有$(MAKE) -C A\ all\n $(MAKE) -C B\ all 两个makefile 将并行执行;这不正确吗?

标签: makefile gnu-make


【解决方案1】:

正如@Michael Livshin 指出的那样,您似乎已经回答了自己的问题。 不过,依靠 make 而不是 shell 语法将大量命令捆绑在一起可能会更整洁。 基本上你希望 make 看到这样的东西:

.PHONY: all
all:
    ${MAKE} -C ../../foo/ -j9 ut-cmd
    ${MAKE} -C ../../bar/ -j9 ut-cmd
    ${MAKE} -C ../../bum/ -j9 ut-cmd

从列表自动生成非常简单。

submakes := foo bar bum

define generate-submake
  ${MAKE} -C ../../$1/ ut-cmd

endef

.PHONY: all
all: ; $(foreach _,${submakes},$(call generate-submake,$1))

注意generate-submake 定义中的空行。这一点很重要。 使用make -j9 运行它。

如果您真的希望此 makefile 中的所有内容都串行运行(但子生成是并行的),那么只需引入一个 .NOTPARALLEL 目标。

.NOTPARALLEL:

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 2016-11-23
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多