bash - 如何测试 Makefile 是否缺少依赖项?

标签 bash makefile gnu build-dependencies

有没有一种方法可以测试在编译具有多个作业的项目时出现的缺失依赖项(-jN,其中 N > 1)?

我经常遇到软件包,大部分是开源的,只要我使用 -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

最佳答案

我不知道有任何开源解决方案,但这正是 ElectricAccelerator 的问题,一个 GNU make 的高性能实现,是为了解决这个问题而创建的。它将并行执行构建并动态检测和纠正缺失的依赖项,以便构建输出与串行运行时相同。它可以生成带注释的构建日志,其中包含有关缺少的依赖项的详细信息。例如,这个简单的 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 的架构师)

关于bash - 如何测试 Makefile 是否缺少依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26001483/

相关文章:

node.js - 在 gruntfile 中执行 shell 脚本并将结果赋值给变量

maven - 多语言项目构建系统

c - 如何在整个项目(由其他人创建)中添加标志(例如-g)?

linux - linux init进程运行在内核态还是用户态?

windows - 如何使用/安装 GNU binutils (objdump)

c - 使用 gnuC 进行预处理时如何删除 __extension__

linux - 使用 for 循环将变量连接成以逗号分隔的单个变量

regex - 在 GNU Linux (AWK/SED/GREP) 中选择与模式文件中的任何模式不匹配的 CSV 行

bash - 在 bash "for file in $list"构造中一次取两个

c++ - GLEW 在一个项目上正确链接,但在另一个项目上链接不正确(带有 MinGW Make 的 C++)