【发布时间】:2020-02-13 14:20:04
【问题描述】:
我想使用 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
【问题讨论】:
-
make只运行Makefile中写入的任何内容。如果这运行一个后台进程,你应该检查你的Makefile的内容。 -
另外,您应该调用
#!/bin/bash而不是#!/bin/sh,因为您使用的是使用$()的类bash 语法。而且我建议将此处的字符串提供给 awk 而不是管道回声,例如$(awk '{print $1}' <<< $line),这样效率更高,更不容易出错。 -
使用
read -r test_name program_path others; do避免awk。 -
也许在
make之后添加wait会有所帮助,但这是一种解决方法。你能展示你的 Makefile(更新问题)吗? -
如果只想获取前两个元素,则根本不需要
awk。你可以使用while read test_name program_name rest; do ...。read命令采用多个变量名,并将每个传入的单词分配给下一个值,最后一个值得到剩下的所有内容。
标签: linux bash shell gnu-make questasim