From 04345dd42e3ed5c8d2d6024a84cd8f0bd8c96670 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 19 Feb 2018 01:39:27 +0100 Subject: [PATCH] Import a helper script for code coverage It is not fully functional yet though. --- doc/scripts/coverage.sh | 124 +++++++++++++++++++++++++++++++++++++++ doc/scripts/project.conf | 5 +- 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100755 doc/scripts/coverage.sh diff --git a/doc/scripts/coverage.sh b/doc/scripts/coverage.sh new file mode 100755 index 0000000..89c9b47 --- /dev/null +++ b/doc/scripts/coverage.sh @@ -0,0 +1,124 @@ +#!/bin/sh +#$Id$ +#Copyright (c) 2018 Pierre Pronchery +#This file is part of DeforaOS System libSystem +#All rights reserved. +# +#Redistribution and use in source and binary forms, with or without +#modification, are permitted provided that the following conditions are +#met: +# +#1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +#2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +#IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +#TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +#PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +#HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +#SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +#TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +#PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +#LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +#NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +#variables +CFLAGS= +LDFLAGS= +PROGNAME="coverage.sh" +TARGET="tests.log" +#executables +CC="gcc -fprofile-arcs -ftest-coverage" +DATE="date" +FIND="find" +GCOV="gcov" +MAKE="make" +MKDIR="mkdir" +MKTEMP="mktemp" +RM="rm -f" + + +#coverage +_coverage() +{ + #create a temporary directory + tmpdir=$($MKTEMP -d) + if [ $? -ne 0 ]; then + return 2 + fi + #build the project in a separate directory + $MKDIR "$tmpdir/src" "$tmpdir/tests" && + (cd ../src && $MAKE CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" OBJDIR="$tmpdir/src/") && + $MAKE CC="$CC" CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" OBJDIR="$tmpdir/tests/" "$tmpdir/tests/$TARGET" + res=$? + #look for any code executed + $FIND "$tmpdir/tests" -name '*.gcda' | while read filename; do + echo "${filename%.gcda}.c:" + $GCOV -n "${filename%.gcda}.gcno" + #TODO output the GCOV file + done + $RM -r -- "$tmpdir" + return $res +} + + +#date +_date() +{ + if [ -n "$SOURCE_DATE_EPOCH" ]; then + TZ=UTC $DATE -d "@$SOURCE_DATE_EPOCH" '+%a %b %d %T %Z %Y' + else + $DATE + fi +} + + +#usage +_usage() +{ + echo "Usage: $PROGNAME [-c] target..." 1>&2 + return 1 +} + + +#main +clean=0 +while getopts "cP:" name; do + case "$name" in + c) + clean=1 + ;; + P) + #XXX ignored + ;; + ?) + _usage + exit $? + ;; + esac +done +shift $((OPTIND - 1)) +if [ $# -eq 0 ]; then + _usage + exit $? +fi + +while [ $# -ne 0 ]; do + target="$1" + shift + + [ "$clean" -eq 0 ] || break + + (_date; echo) > "$target" + echo "Gathering test coverage:" 1>&2 + _coverage >> "$target" || exit 2 + echo "Gathered test coverage" 1>&2 +done +exit 0 diff --git a/doc/scripts/project.conf b/doc/scripts/project.conf index 9017bf3..327ea8d 100644 --- a/doc/scripts/project.conf +++ b/doc/scripts/project.conf @@ -1,5 +1,5 @@ #$Id$ -dist=Makefile,appbroker.sh,clint.sh,docbook.sh,fixme.sh,gettext.sh,gtkdoc.sh,htmllint.sh,manual.css.xml,phplint.sh,pkgconfig.sh,platform.sh,pylint.sh,shlint.sh,subst.sh,xmllint.sh +dist=Makefile,appbroker.sh,clint.sh,coverage.sh,docbook.sh,fixme.sh,gettext.sh,gtkdoc.sh,htmllint.sh,manual.css.xml,phplint.sh,pkgconfig.sh,platform.sh,pylint.sh,shlint.sh,subst.sh,xmllint.sh [appbroker.sh] install=$(PREFIX)/share/doc/configure/scripts @@ -7,6 +7,9 @@ install=$(PREFIX)/share/doc/configure/scripts [clint.sh] install=$(PREFIX)/share/doc/configure/scripts +[coverage.sh] +install=$(PREFIX)/share/doc/configure/scripts + [docbook.sh] install=$(PREFIX)/share/doc/configure/scripts