bash – 如何测试Makefile是否缺少依赖项?
有没有办法测试在编译具有多个作业的项目时出现的缺失依赖项(-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 解决方法
我不知道任何开源解决方案,但这正是创建了一个GNU make的高性能实现
ElectricAccelerator来解决的问题.它将并行执行构建并动态检测并更正缺少的依赖项,以便构建输出与串行运行时相同.它可以生成带注释的构建日志,其中包含有关缺少的依赖项的详细信息.例如,这个简单的makefile在abc和def之间有一个未声明的依赖关系:
all: abc def abc: echo PASS > abc def: cat abc 使用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> 特别是< depList>部分显示这个作业,Jf42015c0(换句话说,def),取决于作业Jf4201588,因为后者修改了文件/ tmp / foo / abc. 您可以免费试用ElectricAccelerator Huddle. (免责声明:我是ElectricAccelerator的架构师) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |