使用foreach的sub make随机失败(具有更高的J因子)

时间:2012-12-23 13:16:34

标签: makefile gnu-make

我正在使用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构造的方式有什么问题吗? 或者只有较高的jforeach导致问题?

1 个答案:

答案 0 :(得分:0)

我从未见过foreach的这种用法,但它似乎对你有用。通常我使用bash进行循环

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

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

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

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

当然可能还有其他问题。注意同时访问共享资源(目标文件,存档,...)或未完成定义的依赖项。

更新

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

您还可以使用make ARCH=32 -j100 mylib进行测试。这也应该表明问题。