gcov: Enhanced gcov script

1. Add "-s" to specify the path to collect gcno files
2. Add "-a" to specify the path to collect gcda files.
3. Add "-x" for copy-only operation

Signed-off-by: wangmingrong1 <wangmingrong1@xiaomi.com>
This commit is contained in:
wangmingrong1 2024-12-10 16:14:45 +08:00 committed by Xiang Xiao
parent f367ba2842
commit 391aa9b5f3

View file

@ -19,24 +19,57 @@
# limitations under the License.
#
ROOT_DIR=$(cd $(dirname $0)/../../; pwd)
ROOT_DIR=$(pwd)
GCNO_DIR=$ROOT_DIR
GCDA_DIR=$ROOT_DIR
show_help() {
echo "Usage: $0 [-d gcov_dir] [-t gcov_tool]"
echo " -d gcov_dir: directory to store gcov data and report"
echo "Usage: $0 [-t gcov_tool] [-s gcno_dir] [-a gcda_dir] [-x] [gcov_dir]"
echo " -t gcov_tool: path to gcov tool, e.g. ./nuttx/tools/gcov.sh -t arm-none-eabi-gcov"
echo " -s gcno_dir: directory containing gcno files (relative or absolute path allowed)"
echo " -a gcda_dir: directory containing gcda files (relative or absolute path allowed)"
echo " -x: only copy *.gcno and *.gcda files"
echo " gcov_dir: directory to store gcov data and report (optional)"
exit 1
}
while getopts "d:t:h" opt
convert_to_absolute_path() {
local dir_path=$1
if [ -z "$dir_path" ]; then
echo "Error: Directory path is empty."
exit 1
fi
# Convert to absolute path if not already
if [ ! "${dir_path:0:1}" = "/" ]; then
dir_path=$(realpath "$dir_path" 2>/dev/null)
fi
echo "$dir_path"
}
while getopts "a:s:t:xh" opt
do
case $opt in
d)
GCOV_DIR=$OPTARG
a)
GCDA_DIR=$(convert_to_absolute_path "$OPTARG")
if [ ! -d "$GCDA_DIR" ]; then
echo "Error: Invalid gcda directory: $OPTARG"
exit 1
fi
;;
s)
GCNO_DIR=$(convert_to_absolute_path "$OPTARG")
if [ ! -d "$GCNO_DIR" ]; then
echo "Error: Invalid gcno directory: $OPTARG"
exit 1
fi
;;
t)
GCOV_TOOL="--gcov-tool $OPTARG"
;;
x)
ONLY_COPY=1
;;
h)
show_help
;;
@ -44,14 +77,41 @@ do
show_help
;;
esac
done
if [ $# == 1 ]; then
GCOV_DIR=$1
# Handle gcov_dir as the last positional argument
shift $((OPTIND - 1))
if [ $# -gt 1 ]; then
echo "Error: Too many arguments."
show_help
fi
if [ $# -eq 1 ]; then
GCOV_DIR=$(convert_to_absolute_path "$1")
else
GCOV_DIR=${ROOT_DIR}/gcov
fi
mkdir -p ${GCOV_DIR} ${GCOV_DIR}/data
cd ${GCOV_DIR}
# Collect gcno files
find ${GCNO_DIR}/ -name "*.gcno" -exec cp {} ${GCOV_DIR}/data > /dev/null 2>&1 \;
# Collect gcda files
find ${GCDA_DIR}/ -name "*.gcda" -exec cp {} ${GCOV_DIR}/data > /dev/null 2>&1 \;
# Ensure ONLY_COPY is initialized as an integer
ONLY_COPY=${ONLY_COPY:-0}
if [ "$ONLY_COPY" -eq 1 ]; then
exit 0
fi
if [ -z "$GCOV_TOOL" ]; then
echo "Error: -t is a required option."
show_help
@ -64,14 +124,6 @@ if [ $? -ne 0 ]; then
exit 1
fi
mkdir -p ${GCOV_DIR} ${GCOV_DIR}/data
cd ${GCOV_DIR}
# Collect gcda/gcno files
find ${ROOT_DIR}/ -name "*.gcno" -exec cp {} ${GCOV_DIR}/data > /dev/null 2>&1 \;
find ${ROOT_DIR}/ -name "*.gcda" -exec cp {} ${GCOV_DIR}/data > /dev/null 2>&1 \;
files=$(find ${GCOV_DIR}/data -name "*.gcda" 2> /dev/null | wc -l)
if [ "$files" == "0" ] ;then
echo "gcda file not found in directory ${ROOT_DIR}"