From 73b45b0f8ca2946bcca0fbbfb856ebbb475c17d5 Mon Sep 17 00:00:00 2001
From: Pavel Kopyl
Date: Wed, 28 Mar 2018 22:59:15 +0300
Subject: [PATCH] [gcov] Add gcov-force-options package.
Change-Id: I48c2d7afdb7e234a77c6e6606139757dc316bb2b
---
packaging/extract-gcov-info | 55 +++++++++++++++++++++++++++++++++++++++++
packaging/gcc-contrib.spec | 60 +++++++++++++++++++++++++++++++++++++++++++++
packaging/macros.gcov | 39 +++++++++++++++++++++++++++++
3 files changed, 154 insertions(+)
create mode 100644 packaging/extract-gcov-info
create mode 100644 packaging/macros.gcov
diff --git a/packaging/extract-gcov-info b/packaging/extract-gcov-info
new file mode 100644
index 0000000..58146c2
--- /dev/null
+++ b/packaging/extract-gcov-info
@@ -0,0 +1,55 @@
+#!/bin/bash
+
+set -xe
+
+#extract-gcov-info - automagically generate collects gcov info(*.gcno files) and file list
+#for inclusion in an rpm spec file.
+#
+# Usage: extract-gcov-info [-o gcnofiles.list] [builddir]
+#
+# If using normal root, avoid changing anything.
+if [ -z "$RPM_BUILD_ROOT" -o "$RPM_BUILD_ROOT" = "/" ]; then
+ exit 0
+fi
+
+BUILDDIR=.
+while [ $# -gt 0 ]; do
+ case "$1" in
+ -o)
+ out=$2
+ shift
+ ;;
+ *)
+ BUILDDIR=$1
+ shift
+ break
+ ;;
+ esac
+ shift
+done
+
+BUILDDIR=${BUILDDIR%/}
+PREFIX=gcnofiles
+
+mkdir -p "${RPM_BUILD_ROOT}/${PREFIX}"
+
+get_gcovfn()
+{
+ dn=$(dirname "${1#$BUILDDIR}")
+ bn=$(basename "$1")
+ gcovdn="${RPM_BUILD_ROOT}/${PREFIX}/${dn}"
+ gcovfn="${gcovdn}/${bn}"
+}
+
+set -o pipefail
+
+find $BUILDDIR -name "*.gcno" | sort |
+while read f; do
+ get_gcovfn $f
+ mkdir -p $gcovdn
+ cp $f $gcovfn
+done
+
+if ! find "${RPM_BUILD_ROOT}/${PREFIX}" -mindepth 1 -print -quit | grep -q .; then
+ touch "${RPM_BUILD_ROOT}/${PREFIX}/fake.gcno"
+fi
diff --git a/packaging/gcc-contrib.spec b/packaging/gcc-contrib.spec
index bebd73d..e425802 100644
--- a/packaging/gcc-contrib.spec
+++ b/packaging/gcc-contrib.spec
@@ -48,6 +48,7 @@
%define ubsan_force_options -fsanitize=undefined,bounds-strict,float-divide-by-zero,float-cast-overflow
%define isan_force_options -fsanitize=unsigned-integer-overflow
%define tsan_force_options -fsanitize=thread -fno-omit-frame-pointer -Wp,-U_FORTIFY_SOURCE -Wl,--as-needed -ldl -lpthread
+%define gcov_force_options -fprofile-arcs -ftest-coverage
%define asan_runtime_options halt_on_error=false:start_deactivated=true:print_cmdline=true:quarantine_size_mb=1:detect_leaks=0:full_address_space=true:handle_segv=0:log_path=/tmp/asan.log:log_exe_name=1:fast_unwind_on_fatal=1:allocator_may_return_null=1
%define esan_force_options -fsanitize=efficiency-working-set -fno-omit-frame-pointer -Wp,-U_FORTIFY_SOURCE -Wl,--as-needed -ldl -lpthread
%define esan_cache_force_options -fsanitize=efficiency-cache-frag -fno-omit-frame-pointer -Wp,-U_FORTIFY_SOURCE -Wl,--as-needed -ldl -lpthread
@@ -75,6 +76,8 @@ Source22: macros.asan
Source23: cc1
Source24: macros.gcc_warning
Source25: extract-gcc-warning-logs
+Source26: macros.gcov
+Source27: extract-gcov-info
Group: Development/Building
Summary: GCC related scripts
License: MIT
@@ -244,6 +247,51 @@ chmod a-w %{libsubdir}
/usr/bin/gcc-unforce-options
[ -d /emul/ ] && chmod a-w /emul/usr/bin/
+
+%package -n gcov-force-options
+Summary: Scripts to enable automatic package coverage instrumentation
+Group: System Environment
+Requires: gcc
+
+%description -n gcov-force-options
+Scripts for gcov instrumentation
+
+%post -n gcov-force-options
+# Change mode to allow all users to run gcc-force/unforce-options
+chmod a+w /usr/bin
+chmod a+w %{libsubdir}
+[ -d /emul/ ] && chmod a+w /emul/usr/bin/ && chmod a+w /emul/home/abuild/rpmbuild/BUILD/gcc-*/obj/gcc/ \
+ && find -L /emul/usr/*/gcc -name 'collect2' | xargs dirname | xargs chmod a+w
+/usr/bin/gcc-force-options %gcov_force_options
+# Add gcov-related macros
+cat >> /usr/lib/rpm/tizen_macros << EOF
+
+%%gcov_force_options %{gcov_force_options}
+%%gcc_unforce_options /usr/bin/gcc-unforce-options
+%%gcc_force_options /usr/bin/gcc-force-options
+%%gcc_force_default_options %%gcc_force_options %%gcov_force_options
+EOF
+
+%preun -n gcov-force-options
+# Restore read-only mode
+chmod a-w /usr/bin
+chmod a-w %{libsubdir}
+[ -d /emul/ ] && chmod a-w /emul/usr/bin/ && chmod a-w /emul/home/abuild/rpmbuild/BUILD/gcc-*/obj/gcc/ \
+ && find -L /emul/usr/*/gcc -name 'collect2' | xargs dirname | xargs chmod a-w
+/usr/bin/gcc-unforce-options
+
+%package -n gcov-build-env
+Summary: Gcov build environment
+Group: System Environment
+Requires: gcc
+Requires: rpm
+
+%description -n gcov-build-env
+Gcov build environment support files and scripts
+
+%post -n gcov-build-env
+cat %{_rpmconfigdir}/macros.gcov >> %{_rpmconfigdir}/tizen_macros
+
%package -n tsan-force-options
Summary: Scripts to enable automatic package sanitization
Group: System Environment
@@ -578,6 +626,8 @@ mkdir -p %{buildroot}/usr/lib/gcc-log-wrapper
install -m 0755 %{SOURCE23} %{buildroot}/usr/lib/gcc-log-wrapper/
install -m 0644 %{SOURCE24} %{buildroot}/%{_rpmconfigdir}/
install -m 0755 %{SOURCE25} %{buildroot}/%{_rpmconfigdir}/tizen/
+install -m 0644 %{SOURCE26} %{buildroot}/%{_rpmconfigdir}/
+install -m 0755 %{SOURCE27} %{buildroot}/%{_rpmconfigdir}/tizen/
%files
#%manifest gcc-contrib.manifest
@@ -598,6 +648,11 @@ install -m 0755 %{SOURCE25} %{buildroot}/%{_rpmconfigdir}/tizen/
%{_prefix}/bin/gcc-force-options
%{_prefix}/bin/gcc-unforce-options
+%files -n gcov-force-options
+%defattr(-,root,root,-)
+%{_prefix}/bin/gcc-force-options
+%{_prefix}/bin/gcc-unforce-options
+
%ifarch %lsan_arch
%files -n lsan-force-options
#%manifest gcc-contrib.manifest
@@ -653,6 +708,11 @@ install -m 0755 %{SOURCE25} %{buildroot}/%{_rpmconfigdir}/tizen/
/TSAN_OPTIONS
%endif
+%files -n gcov-build-env
+%defattr(-,root,root,-)
+%{_rpmconfigdir}/macros.gcov
+%{_rpmconfigdir}/tizen/extract-gcov-info
+
%ifarch %ubsan_arch
%files -n ubsan-build-env
%defattr(-,root,root,-)
diff --git a/packaging/macros.gcov b/packaging/macros.gcov
new file mode 100644
index 0000000..d1ab2ed
--- /dev/null
+++ b/packaging/macros.gcov
@@ -0,0 +1,39 @@
+# /etc/rpm/macros.gcov
+
+%_enable_gcov_packages 1
+
+%__gcov_install_post %{_rpmconfigdir}/tizen/extract-gcov-info
+
+# See original macro (before expansion) and correct lines after the first one.
+# Mine is from Fedora RPM macros, YMMV.
+%__spec_install_post\
+ %{?__gcov_package:%{__gcov_install_post}}\
+ %{?__debug_package:%{__debug_install_post}}\
+ %{__arch_install_post}\
+ %{__os_install_post}\
+%{nil}
+
+# Same goes here, see your original macro.
+%install %{?_enable_gcov_packages:%{gcov_package}}\
+%{?_enable_debug_packages:%{debug_package}}\
+%%install\
+LANG=C\
+export LANG\
+unset DISPLAY\
+rm -rf %{?buildroot:%{buildroot}} \
+mkdir -p %{?buildroot:%{buildroot}} \
+%{nil}
+
+# Template for gcov profile data sub-package.
+%gcov_package \
+%global __gcov_package 1\
+%package gcovinfo\
+Summary: Gcov files (*.gcno) for package %{name}\
+Group: Development/Gcov\
+AutoReqProv: 0\
+%description gcovinfo\
+This package provides gcov files for package %{name}.\
+%files gcovinfo\
+%defattr(-,root,root)\
+/gcno*\
+%{nil}
--
2.7.4