有没有一种方法可以测试编译多个作业(-jN,其中N> 1)时出现的缺失依赖关系?如何测试缺少依赖关系的Makefile?
我经常遇到包,主要是开源的,只要我使用-j1或-jN,其中构建过程工作正常,其中N是一个相对较低的值,如4或8,但如果我使用较高的值喜欢48 ,有点不寻常,它由于缺少依赖关系而开始失败。
我试图构建自己的bash脚本,给定目标,找出所有依赖关系,并尝试使用-j1显式构建每个这些依赖关系,以验证没有任何依赖关系缺失。它似乎可以使用小型/中型软件包,但对于uClibc等更重要的软件包却失败了。
我在这里分享我的脚本,因为有些人可能更好地理解我的意思是通过阅读代码。我也希望有一个更强大的解决方案存在并且可以共享回来。
#!/bin/bash
TARGETS=$*
echo "TARGETS=$TARGETS"
for target in $TARGETS
do
MAKE="make"
RULE=`make -j1 -n -p | grep "^$target:"`
if [ -z "$RULE" ]; then
continue
fi
NEWTARGETS=${RULE#* }
if [ -z "$NEWTARGETS" ]; then
continue
fi
if [ "${NEWTARGETS}" = "${RULE}" ]; then
# leaf target, we do not want to test.
continue
fi
echo "RULE=$RULE"
# echo "NEWTARGETS=$NEWTARGETS"
$0 $NEWTARGETS
if [ $? -ne 0 ]; then
exit 1
fi
echo "Testing target $target"
make clean && make -j1 $target
if [ $? -ne 0 ]; then
echo "Make parallel will fail with target $target"
exit 1
fi
done
我不知道确切的问题是什么......我不认为有一个为详尽比一个验证并行正确性什么更好的方法您已经描述过:为每个目标运行构建并验证它是否有效。不过,我不认为你必须限制构建到'-j1'。如果他们在'-j1'上失败,那么他们肯定会在更高的'-j'上失败,所以你不妨加快你的构建。 – MadScientist 2014-09-23 17:50:16
这对大型项目有什么影响?它是否以实际的方式失败或仅仅是从运行时间/手动调用角度的困难? – 2014-09-23 17:59:50
我认为迫使'-j1'口罩尽可能多的prereq问题,因为它迫使公开。假设prereq是按照列出的顺序构建的,那么任何'target:prereqA prereqB',其中'prereqA'依赖于'prereqB',而不会声明失败时使用'-j1',但可能使用'-jN'来传递。反转这些先决条件的顺序('prereqB prereqA')和'-j1'永远不会失败,但是'-jN'可能会(但是同样可能不会,你必须确定prereq顺序)。 – 2014-09-23 18:09:31