0

我想使用 shell 脚本运行回归,该脚本应该通过make命令启动每个测试。以下是我的脚本的简单版本:

#!/bin/sh                                                                                                                                                                                                                                                                       

testlist="testlist.txt"
while read line;
do
    test_name=$(echo $line | awk '{print $1}')
    program_path=$(echo $line | awk '{print $2}')
    make sim TEST_NAME=$test_name PROGRAM_PATH=$program_path
done < "$testlist"

上述脚本的问题在于,当 make 命令启动一个程序时,该脚本会进入下一个迭代,而无需等待上一个迭代中该程序的完成,并继续从文件中读取下一行。

make 实用程序中是否有任何选项可以确保它等待程序完成?也许我错过了其他东西。

这是 Makefile 的相关部分:

sim:
    vsim -i -novopt \
    -L $(QUESTA_HOME)/uvm-1.1d \
    -L questa_mvc_lib \
    -do "add wave top/AL_0/*;log -r /*" \
    -G/path=$(PROGRAM_PATH) \
    +UVM_TESTNAME=$(TEST_NAME) +UVM_VERBOSITY=UVM_MEDIUM -sv_seed random
4

1 回答 1

1

正如 OP 在评论中所说,他注意到vsim分叉了几个其他进程,这些进程在完成后仍在运行vsim。所以他需要等到其他进程完成。我用一个分叉一些睡眠进程的脚本来
模拟你的命令:vsim

#!/bin/bash
forksome() {
   sleep 3&
   sleep 2&
   sleep 5&
}

echo "Forking some sleep"
forksome

我制作了一个 Makefile,它在make normal.
当您知道哪些进程被分叉时,您可以像我演示的那样制定解决方案make new

normal: sim
        ps -f

new: sim mywait
        ps -f

sim:
        ./vsim

mywait:
        echo "Waiting for process(es):"
        while pgrep sleep; do sleep 1; done
于 2020-02-14T13:07:55.777 回答