* A stdenv adapter to build a package with coverage instrumentation.

svn path=/nixpkgs/trunk/; revision=16890
This commit is contained in:
Eelco Dolstra 2009-08-28 16:45:56 +00:00
parent df5cd8776a
commit 0fd5ed507e
2 changed files with 57 additions and 6 deletions

View file

@ -121,4 +121,54 @@ rec {
{ mkDerivation = args: stdenv.mkDerivation (args // extraAttrs); };
/* Return a modified stdenv that builds packages with GCC's coverage
instrumentation. The coverage note files (*.gcno) are stored in
$out/.coverage, along with the source code of the package, to
enable programs like lcov to produce pretty-printed reports.
*/
addCoverageInstrumentation = stdenv:
addAttrsToDerivation
{ NIX_CFLAGS_COMPILE = "-O0 --coverage";
prePhases = "moveBuildDir";
postPhases = "cleanupBuildDir";
# Object files instrumented with coverage analysis write
# runtime coverage data to <path>/<object>.gcda, where <path>
# is the location where gcc originally created the object
# file. That would be /tmp/nix-build-<something>, which will
# be long gone by the time we run the program. Furthermore,
# the <object>.gcno files created at compile time are also
# written there. And to make nice coverage reports with lcov,
# we need the source code. So we move the whole build tree to
# $out/.coverage.
moveBuildDir =
''
ensureDir $out/.coverage
cd $out/.coverage
'';
# This is an uberhack to prevent libtool from removing gcno
# files. This has been fixed in libtool, but there are
# packages out there with old ltmain.sh scripts.
# See http://www.mail-archive.com/libtool@gnu.org/msg10725.html
postUnpack =
''
for i in $(find -name ltmain.sh); do
substituteInPlace $i --replace '*.$objext)' '*.$objext | *.gcno)'
done
'';
# Get rid of everything that isn't a gcno file or a C source
# file. This also includes the gcda files; we're not
# interested in coverage resulting from the package's own test
# suite.
cleanupBuildDir =
''
find $out/.coverage/ -type f -a ! \
\( -name "*.c" -o -name "*.gcno" -o -name "*.h" \) \
| xargs rm -f --
'';
}
stdenv;
}

View file

@ -226,7 +226,8 @@ let
inherit (import ../stdenv/adapters.nix {inherit (pkgs) dietlibc fetchurl runCommand;})
overrideGCC overrideInStdenv overrideSetup
useDietLibC useKlibc makeStaticBinaries;
useDietLibC useKlibc makeStaticBinaries addAttrsToDerivation
addCoverageInstrumentation;
### BUILD SUPPORT
@ -2771,11 +2772,11 @@ let
inherit (xlibs) libX11;
};
apr = import ../development/libraries/apr {
apr = makeOverridable (import ../development/libraries/apr) {
inherit fetchurl stdenv;
};
aprutil = import ../development/libraries/apr-util {
aprutil = makeOverridable (import ../development/libraries/apr-util) {
inherit fetchurl stdenv apr expat db4;
bdbSupport = true;
};
@ -2802,7 +2803,7 @@ let
inherit fetchurl stdenv;
});
aterm25 = import ../development/libraries/aterm/2.5.nix {
aterm25 = makeOverridable (import ../development/libraries/aterm/2.5.nix) {
inherit fetchurl stdenv;
};
@ -4500,7 +4501,7 @@ let
### SERVERS
apacheHttpd = import ../servers/http/apache-httpd {
apacheHttpd = makeOverridable (import ../servers/http/apache-httpd) {
inherit fetchurl stdenv perl openssl zlib apr aprutil pcre;
sslSupport = true;
};
@ -6613,7 +6614,7 @@ let
inherit fetchurl stdenv Xaw3d ghostscriptX;
};
hello = import ../applications/misc/hello/ex-2 {
hello = makeOverridable (import ../applications/misc/hello/ex-2) {
inherit fetchurl stdenv;
};