vcs中,可以使用urg命令生成覆盖率报告,其实urg命令本身是一个sh脚本,本文对该脚本进行分析。
vcs版本:2016.06
###############################################
# env check & setting about VCS_HOME
###############################################
#set mode flag linux -> 32, mode64 -> 64; filter "-mode64"
URG_MODE_FLAG=32
URG_MODE_STR=""
if [ `${ECHO} ${URG_ARGS} | ${EGREP} -c '(^| )\-mode64'` = 1 ]; then
URG_MODE_FLAG=64;
URG_MODE_STR="-mode64"
elif [ `${ECHO} ${URG_ARGS} | ${EGREP} -c '(^| )\-full64'` = 1 ]; then
URG_MODE_FLAG=64;
URG_MODE_STR="-full64"
fi
分析:选择32位还是64位程序运行,默认32位。
# check whether the given vdb directories contain .mode64 file
isAutoAppendFull64=0;
if [ "${URG_MODE_STR}"x = "x" ]; then
isDir=0;
for arg in ${URG_ARGS_ARRAY}; do
if [ `${ECHO} $arg | ${EGREP} -c '^-dir$'` = 1 ]; then
isDir=1;
elif [ `${ECHO} $arg | ${EGREP} -c '^-'` = 1 ]; then
isDir=0;
else
if [ $isDir = 1 ]; then
if [ -f $arg"/.mode64" ]; then
# if any vdb directory contains .mode64 file
if [ `${VCS_HOME}/bin/vcs -location -full64 | ${EGREP} -c '^Error-\[CF_SIM_KRNL64\]'` = 0 ]; then
# if vcs version is 64bit, add -full64 by default
URG_MODE_FLAG=64;
URG_MODE_STR="-full64"
isAutoAppendFull64=1;
if [ ` env | ${EGREP} -c '^VCS_RUNNING_REGRESSION'` = 0 ]; then
${ECHO}
${ECHO} "INFO : The directory '$arg' passed to the URG command line is generated from a 64-bit simulation kernel. Hence, '-full64' is automatically added to the URG command line and URG would generate the reports with Full64 VCS installation."
${ECHO}
fi
else
if [ ` env | ${EGREP} -c '^VCS_RUNNING_REGRESSION'` = 0 ]; then
${ECHO}
${ECHO} "INFO : The directory '$arg' passed to the URG command line is generated from a 64-bit simulation kernel. Hence, it is advised to install Full64 VCS, pass '-full64' to the URG command line and generate the reports. Currently, URG would generate the reports with 32-bit VCS installation."
${ECHO}
fi
fi
break;
fi
fi
fi
done
fi
分析:vcs会读取你的-dir参数,然后判断vdb目录下是否存在.mode64文件。如果存在且你的vcs支持64bit,它会自己给你加上-full64参数,并将标记isAutoAppendFull64置1,如果你的vcs不支持64bit,那么它就会提醒你安装64bit的版本。
# set correct home(BASE_STRING), reuse vcs script, do not re-check in urg script
if [ "X$VCS_HOME" != "X" ]; then
BASE_STRING=`${VCS_HOME}/bin/vcs -location ${URG_MODE_STR}`
elif [ "X$PIONEER_HOME" != "X" ]; then
VCS_HOME=${PIONEER_HOME}
export VCS_HOME
BASE_STRING=`${PIONEER_HOME}/bin/vcs -location ${URG_MODE_STR}`
else
${ECHO} " Please make sure VCS_HOME is set correctly and continue.. ";
exit 1;
fi
if [ `${ECHO} ${BASE_STRING} | ${EGREP} -c '(^| )Error\-'` = 1 ]; then #VCSMSG_EXCLUDE
${ECHO} "$BASE_STRING"
${ECHO} " Please make sure VCS_HOME is set correctly and continue.. ";
exit 1;
fi
分析:没啥好说的,重新设置vcs命令路径(可以将32bit的vcs改成64bit的)。
# use vcs error message report
if [ -f ${BASE_STRING}/bin/vcsMsgReport ]; then #VCSMSG_EXCLUDE
ERR_MSG_REPORT=${BASE_STRING}/bin/vcsMsgReport; #VCSMSG_EXCLUDE
else
${ECHO} " ERROR : Cannot find 'vcsMsgReport' script in $BASE_STRING/bin " ; #VCSMSG_EXCLUDE
${ECHO} " Please make sure VCS_HOME is set correctly and continue.. ";
exit 1;
fi
分析:该脚本会调用vcsMsgReport脚本,所以要确认下vcsMsgReport是否存在。
# no longer support 64_32 mode
if [ "$URG_MODE_FLAG"x = "64_32x" ]; then
$ERR_MSG_REPORT "URG-S-MNS"
exit 1;
fi
分析:不再支持64_32x模式,这TM是个什么模式。
###############################################
# env check & setting about URG
###############################################
# check for bin directory
binpath="${BASE_STRING}/${BIN}";
if [ ! -d ${BASE_STRING}/${BIN} ]; then
$ERR_MSG_REPORT "URG-S-DE" "$binpath"
exit 1
fi
# check for urg1
CMD="${binpath}";
if [ ! -f ${BASE_STRING}/${BIN}/urg1 ]; then
$ERR_MSG_REPORT "URG-NF" "urg1" "VCS installation"
exit 1;
elif [ ! -x ${BASE_STRING}/${BIN}/urg1 ]; then
$ERR_MSG_REPORT "URG-PERM" "urg1" "$CMD"
fi
分析:检查bin目录和urg1(实际使用到的urg)是否存在。
PrintID()
{
m=`uname -n`;
if [ "$URG_ARCH" = "AIX" ]; then
o=`uname -s -v`.$URG_RNAME;
else
o=`uname -s -r`;
fi
echo "machine name = $m "
echo "machine os = $o "
exec ${binpath}/urg1 -ID
exit 0;
}
分析:打印主机的信息。
Run()
{
# if it contains -parallel , swtich to hierarchicalMerge
if [ `${ECHO} ${URG_ARGS} | ${EGREP} -c -i '(^| )\-parallel($| )'` = 1 ]; then
PARALLEL_MODE=1;
else
if [ `${ECHO} ${URG_ARGS} | ${EGREP} -c -i '(^| )\-readucis($| )'` = 1 ]; then
$ERR_MSG_REPORT URG-CVOP -readucis
else
exec $URG_DIAGTOOL $CMD/urg1 $URG_ARGS
fi
fi
}
分析:如果urg参数含有-parallel(并行merge覆盖率)时,将标志PARALLEL_MODE置位。如果出现-readucis参数,报错。猜测这是urg早期的一个参数,现在不再支持。如果不进行并行merge,那么直接调用urg1命令,urg1的参数和urg是一样的,但是urg1不是脚本,而是一个可执行文件。
EXEC()
{
#Invoking actual executable .. with all the options supplied.
#set LD_LIBRARY_PATH
if [ -x ${BASE_STRING}/lib ]; then
# ${ECHO} "$BASE_STRING/lib"
case $URG_ARCH in
HP-UX)
SHLIB_PATH=$BASE_STRING/lib:$SHLIB_PATH
export SHLIB_PATH
;;
AIX)
LIBPATH=$BASE_STRING/lib:$LIBPATH
export LIBPATH
;;
*)
LD_LIBRARY_PATH=$BASE_STRING/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
;;
esac
fi
#Run urg -id, then exit
if [ `${ECHO} ${URG_ARGS} | ${EGREP} -c -i '(^| )\-id'` = 1 ]; then
URG_ARGS=`echo ${URG_ARGS} | sed -e 's/\-[Ii][Dd]//g'`;
PrintID;
exit 1;
fi
#Run normal case
Run
}
分析:设置LD_LIBRARY_PATH。如果命令中含有-id,执行PrintID子程序。
EXEC
分析:主程序
if [ $PARALLEL_MODE = 1 ]; then
#
# Note we get hierarchicalMerge from the same directory as the urg script,
# NOT from the '$CMD' directory
#
hierMergeDir=`dirname ${0}`
hierMergeCMD="$hierMergeDir/hierarchicalMerge"
if [ -x $hierMergeCMD ]; then
perlVersion=`perl -v | sed -n '/[p|P]erl\ 4/'p | wc -l`
if [ $perlVersion = 1 ]; then
$ERR_MSG_REPORT "URG-S-PVE"
exit 1;
else
if [ $isAutoAppendFull64 = 1 ]; then
exec $hierMergeCMD "$@" "-full64"
else
exec $hierMergeCMD "$@"
fi
fi
else
if [ -f $hierMergeCMD ]; then
$ERR_MSG_REPORT "URG-PERM" "hierarchicalMerge" "$hierMergeCMD"
else
$ERR_MSG_REPORT "URG-NF" "hierarchicalMerge" "$hierMergeCMD"
fi
exit 1;
fi
fi
分析:按照这种写法风格,很明显-parallel参数在vcs早期的版本是不支持的,是后来才加上去的。主要还是调用hierarchicalMerge脚本来进行覆盖率并行merge。而且,还要求perl的版本不能是perl 4。并行merge的脚本参数和urg参数是一致的。
# Normal exit
exit 0;
分析:正常退出。