diff --git a/tools/gcov.sh b/tools/gcov.sh index 20d1a6a671..f6c64cd431 100755 --- a/tools/gcov.sh +++ b/tools/gcov.sh @@ -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}"