0

我正在使用 GNU make,其中我有一个顶级makefile,它调用另一个makefile,用于不同类型的构建,例如:

LIST_OF_TYPES: 32 64 ...

tgt-name: deps
          $(foreach i,$(LIST_OF_TYPES), \
            $(MAKE) -f $(MY_MAKEFILE) ARCH=$i mylib;)

当以诸如等更高的j因素运行时-j100,其中一个构建失败,但返回值仍然0如此,我无法确定构建是否真的有效!我使用foreach构造的方式有什么问题吗?或者它只是导致问题的更高j版本foreach

4

2 回答 2

1

您列出的顶级 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

于 2013-01-15T17:13:29.123 回答
0

我从来没有见过这种用法foreach,但它似乎对你有用。通常我使用bashfor 循环

tgt-name: deps
    for i in $(LIST_OF_TYPES); do $(MAKE) -f $(MY_MAKEFILE) ARCH=$$i mylib; done

但这不是问题,因为在任何一种情况下,makes 都是按顺序运行的,AFAICS。

由于您构建了一个库,因此可能会同时将两个对象插入到存档中。发生这种情况时,存档可能会损坏。

与每次并行执行一样,无论是创建作业还是线程,您都必须保护共享资源(在您的情况下是存档)。您必须在库构建结束时添加对象或使用某种锁(例如man lockfile或类似的)保护插入。

当然,可能还有其他问题。注意同时访问共享资源(目标文件、档案等)或不完整定义的依赖关系。

更新

foreach似乎不是问题。设置LIST_OF_TYPES为单一类型(例如32仅),然后执行make -j100 mylib. 如果问题在于构建单个存档,那么它也只会因一种类型而失败。

您也可以使用make ARCH=32 -j100 mylib. 这也应该显示问题。

于 2012-12-29T12:53:45.053 回答