我正在使用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
导致问题?
答案 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
进行测试。这也应该表明问题。