您列出的顶级 makefile 是安全的-j
(尽管非常次优)。展开后$(foreach...)
,make
有效地看到:
tgt-name: deps
$(MAKE) -f $(MY_MAKEFILE) ARCH=32 mylib; $(MAKE) -f $(MY_MAKEFILE) ARCH=64 mylib; ...
当这些子 make 之一失败时(由于对 的错误处理-j
),该失败不会报告给顶级 make。你需要使用类似的东西:
tgt-name: deps
$(MAKE) -f $(MY_MAKEFILE) ARCH=32 mylib && $(MAKE) -f $(MY_MAKEFILE) ARCH=64 mylib && ... && :
如果前一个命令失败,&&
则告诉 bash 立即退出并出现错误。(:
最后是 bash 内置函数,它只会发出一个成功的退出指令——它会简化你的$(foreach ...)
.)
编辑:
当然,正确的方法是使用 make 依赖项,而不是 shell 中的串行处理。你想看到类似的东西:
tgt-name: # default target
.PHONY: target-32
target-32: deps
$(MAKE) -f ${MY_MAKEFILE} arch=32 mylib
.PHONY: target-64
target-64: deps
$(MAKE) -f ${MY_MAKEFILE} arch=64 mylib
# etc. etc.
tgt-name: target-32 target-64
@echo $@ Success
这是-j
安全的。在-j
make下会target-%
同时make所有的。好的。(尽管在这种情况下,您似乎$MY_MAKEFILE
不安全-j
(顽皮!)。)一些宏来替换样板:
LIST_OF_TYPES := 32 64 ...
LIST_OF_TARGETS := $(add-prefix,target-,${LIST_OF_TYPES})
tgt-name: # default target
.PHONY: ${LIST_OF_TARGETS}
${LIST_OF_TARGETS}: target-%: deps # Static Pattern Rule will (conveniently) set $*
$(MAKE) -f ${MY_MAKEFILE} arch=$* mylib
tgt-name: ${LIST_OF_TARGETS}
@echo $@ Success
PS我怀疑你应该将tgt-name标记为.PHONY