Yan*_*ler 5 bash gnu makefile build-dependencies
有没有办法测试在编译具有多个作业的项目时出现的缺失依赖项(-jN,其中N> 1)?
我经常遇到包,主要是开源,只要我使用-j1,或者-jN,其中N是一个相对较低的值,如4或8,但是如果我使用更高的值,如4,有点不常见,那么构建过程正常工作,由于缺少依赖性,它开始失败.
我试图构建一个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
Run Code Online (Sandbox Code Playgroud)
我不知道有任何开源解决方案,但这正是ElectricAccelerator(GNU make 的高性能实现)的创建目的来解决的问题。它将并行执行构建,并动态检测和纠正缺失的依赖项,以便构建输出与串行运行时的输出相同。它可以生成带注释的构建日志,其中包含有关缺少的依赖项的详细信息。例如,这个简单的 makefile 在abc
和 之间有一个未声明的依赖关系def
:
all: abc def
abc:
echo PASS > abc
def:
cat abc
Run Code Online (Sandbox Code Playgroud)
使用 emake 而不是 gmake 运行此命令并启用--emake-annodetail=history
,生成的注释文件包含以下内容:
<job id="Jf42015c0" thread="f4bfeb40" start="5" end="6" type="rule" name="def" file="Makefile" line="6" neededby="Jf42015f8">
<command line="7">
<argv>cat abc</argv>
<output>cat abc
</output>
<output src="prog">PASS
</output>
</command>
<depList>
<dep writejob="Jf4201588" file="/tmp/foo/abc"/>
</depList>
<timing invoked="0.356803" completed="0.362634" node="chester-1"/>
</job>
Run Code Online (Sandbox Code Playgroud)
特别是,该<depList>
部分显示此作业Jf42015c0
(换句话说,def
)依赖于作业Jf4201588
,因为后者修改了文件/tmp/foo/abc
。
您可以使用ElectricAccelerator Huddle免费尝试一下。
(免责声明:我是 ElectricAccelerator 的架构师)