【问题标题】:Reassign Makefile Parameters重新分配 Makefile 参数
【发布时间】:2014-08-05 08:14:50
【问题描述】:

在当前系统中,存在用于启动系统并行构建的 ghetto hack。例如,调用并行 make 需要 make JOBS=8 而不是 make -j8。我已经修复了 makefile,但是之前在调用 make 的脚本中对 JOBS 标志有很多依赖。我希望递归调用 make 作为一种解决方法:

ifdef JOBS
%:
  $(MAKE) $(MAKECMDGOALS) JOBS= -j$(JOBS)
endif

这有一些奇怪的行为。它应该首先调用make JOBS= -j8,但在此规则完成后,它似乎继续并再次重建$(MAKECMDGOALS) 中的所有内容。

#Example
TARGETS = lib0 lib1 lib2
ifdef JOBS
%:
    $(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
endif

all: $(TARGETS)

lib%:
    @echo g++ $@

命令:make JOBS=8.

这对于大多数规则来说都很好,但是它一直在浪费时间重建 PHONY 规则,所以应该修复这个问题。有没有办法将make JOBS=N 命令完全重新路由到make -j$(JOBS),而无需在任一范围内冗余地执行任何其他规则? (意味着除了make JOBS=N 中的子make 之外什么都不执行,并且子make 只调用一次所有$(MAKECMDGOALS) 一次。)

编辑:我还想避免使用大的ifdef; else; endif 语句,最多在文件顶部放置一个自包含的语句。我开始认为解决方案可能需要类似的东西:

TARGETS = lib0 lib1 lib2

ifdef JOBS
%: unique_make
    @echo $@ built > /dev/null

.PHONY: unique_make
unique_make:
    $(MAKE) $(MAKECMDGOALS) -j$(JOBS) JOBS=
else

all: $(TARGETS)

lib%:
    @echo g++ $@
endif

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    在 GNU make 中,您可以修改 Makefile 中的 make 标志。为什么不尝试这样的事情:

    ifdef JOBS
    MAKEFLAGS+=-j$(JOBS)
    endif
    

    【讨论】:

    • 我的 derps 的程度甚至无法用语言表达。谢谢先生。
    • 请注意,如果您使用的是 GNU make 4.0 或更高版本,我认为这只会在当前的 make 实例上启用并行性。
    猜你喜欢
    • 2010-11-11
    • 2019-06-12
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多