diff options
Diffstat (limited to 'pkgs')
-rw-r--r-- | pkgs/build-support/release/default.nix | 6 | ||||
-rw-r--r-- | pkgs/build-support/release/gcov-report.nix | 49 | ||||
-rw-r--r-- | pkgs/build-support/release/nix-build.nix | 2 | ||||
-rw-r--r-- | pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh | 17 | ||||
-rw-r--r-- | pkgs/build-support/setup-hooks/keep-build-tree.sh | 6 | ||||
-rw-r--r-- | pkgs/stdenv/adapters.nix | 40 | ||||
-rw-r--r-- | pkgs/top-level/all-packages.nix | 8 |
7 files changed, 84 insertions, 44 deletions
diff --git a/pkgs/build-support/release/default.nix b/pkgs/build-support/release/default.nix index acad3487dad2..6288935ec2a5 100644 --- a/pkgs/build-support/release/default.nix +++ b/pkgs/build-support/release/default.nix @@ -27,10 +27,14 @@ rec { } // args); coverageAnalysis = args: nixBuild ( - { inherit lcov enableCoverageInstrumentation makeCoverageAnalysisReport; + { inherit lcov enableGCOVInstrumentation makeGCOVReport; doCoverageAnalysis = true; } // args); + gcovReport = args: import ./gcov-report.nix ( + { inherit runCommand lcov rsync; + } // args); + rpmBuild = args: import ./rpm-build.nix ( { inherit vmTools; } // args); diff --git a/pkgs/build-support/release/gcov-report.nix b/pkgs/build-support/release/gcov-report.nix new file mode 100644 index 000000000000..8ce5c0488a7d --- /dev/null +++ b/pkgs/build-support/release/gcov-report.nix @@ -0,0 +1,49 @@ +{ runCommand, lcov, rsync, coverageRuns, lcovFilter ? [ "/nix/store/*" ], baseDirHack ? false }: + +runCommand "coverage" + { buildInputs = [ lcov rsync ]; + inherit lcovFilter baseDirHack; + } + '' + mkdir -p $TMPDIR/gcov $out/nix-support $out/coverage + info=$out/coverage/full.info + + for p in ${toString coverageRuns}; do + if [ -f $p/nix-support/hydra-build-products ]; then + cat $p/nix-support/hydra-build-products >> $out/nix-support/hydra-build-products + fi + + [ ! -e $p/nix-support/failed ] || touch $out/nix-support/failed + + opts= + for d in $p/coverage-data/*; do + for i in $(cd $d/nix/store && ls); do + if ! [ -e /nix/store/$i/.build ]; then continue; fi + if [ -e $TMPDIR/gcov/nix/store/$i ]; then continue; fi + echo "copying $i..." + rsync -a /nix/store/$i/.build/* $TMPDIR/gcov/ + if [ -n "$baseDirHack" ]; then + opts="-b $TMPDIR/gcov/$(cd /nix/store/$i/.build && ls)" + fi + done + + for i in $(cd $d/nix/store && ls); do + rsync -a $d/nix/store/$i/.build/* $TMPDIR/gcov/ --include '*/' --include '*.gcda' --exclude '*' + done + done + + chmod -R u+w $TMPDIR/gcov + + echo "producing info..." + geninfo --ignore-errors source,gcov $TMPDIR/gcov --output-file $TMPDIR/app.info $opts + cat $TMPDIR/app.info >> $info + done + + echo "making report..." + set -o noglob + lcov --remove $info ''$lcovFilter > $info.tmp + set +o noglob + mv $info.tmp $info + genhtml --show-details $info -o $out/coverage + echo "report coverage $out/coverage" >> $out/nix-support/hydra-build-products + '' diff --git a/pkgs/build-support/release/nix-build.nix b/pkgs/build-support/release/nix-build.nix index 993f12bc3002..8ebae24c6733 100644 --- a/pkgs/build-support/release/nix-build.nix +++ b/pkgs/build-support/release/nix-build.nix @@ -79,7 +79,7 @@ stdenv.mkDerivation ( prePhases = ["initPhase"] ++ prePhases; - buildInputs = buildInputs ++ stdenv.lib.optional doCoverageAnalysis args.makeCoverageAnalysisReport; + buildInputs = buildInputs ++ stdenv.lib.optional doCoverageAnalysis args.makeGCOVReport; lcovFilter = ["/nix/store/*"] ++ lcovFilter; diff --git a/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh index 08ef490e2447..7175b408b02f 100644 --- a/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh +++ b/pkgs/build-support/setup-hooks/enable-coverage-instrumentation.sh @@ -1,3 +1,5 @@ +postPhases+=" cleanupBuildDir" + # Force GCC to build with coverage instrumentation. Also disable # optimisation, since it may confuse things. export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -O0 --coverage" @@ -12,3 +14,18 @@ postUnpack() { substituteInPlace $i --replace '*.$objext)' '*.$objext | *.gcno)' done } + +# Get rid of everything that isn't a gcno file or a C source file. +# Also strip the `.tmp_' prefix from gcno files. (The Linux kernel +# creates these.) +cleanupBuildDir() { + if ! [ -e $out/.build ]; then return; fi + + find $out/.build/ -type f -a ! \ + \( -name "*.c" -o -name "*.cc" -o -name "*.cpp" -o -name "*.h" -o -name "*.hh" -o -name "*.y" -o -name "*.l" -o -name "*.gcno" \) \ + | xargs rm -f -- + + for i in $(find $out/.build/ -name ".tmp_*.gcno"); do + mv "$i" "$(echo $i | sed s/.tmp_//)" + done +} diff --git a/pkgs/build-support/setup-hooks/keep-build-tree.sh b/pkgs/build-support/setup-hooks/keep-build-tree.sh new file mode 100644 index 000000000000..754900bfc337 --- /dev/null +++ b/pkgs/build-support/setup-hooks/keep-build-tree.sh @@ -0,0 +1,6 @@ +prePhases+=" moveBuildDir" + +moveBuildDir() { + mkdir -p $out/.build + cd $out/.build +} diff --git a/pkgs/stdenv/adapters.nix b/pkgs/stdenv/adapters.nix index cb7e3ba925f5..0e45ad05531c 100644 --- a/pkgs/stdenv/adapters.nix +++ b/pkgs/stdenv/adapters.nix @@ -187,51 +187,13 @@ rec { { mkDerivation = args: stdenv.mkDerivation (args // extraAttrs); }; - /* Return a modified stdenv that performs the build under $out/.build - instead of in $TMPDIR. Thus, the sources are kept available. - This is useful for things like debugging or generation of - dynamic analysis reports. */ - keepBuildTree = stdenv: - addAttrsToDerivation - { prePhases = "moveBuildDir"; - - moveBuildDir = - '' - mkdir -p $out/.build - cd $out/.build - ''; - } stdenv; - - - cleanupBuildTree = stdenv: - addAttrsToDerivation - { postPhases = "cleanupBuildDir"; - - # 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. Also strip the `.tmp_' prefix from gcno files. (The - # Linux kernel creates these.) - cleanupBuildDir = - '' - find $out/.build/ -type f -a ! \ - \( -name "*.c" -o -name "*.h" -o -name "*.gcno" \) \ - | xargs rm -f -- - - for i in $(find $out/.build/ -name ".tmp_*.gcno"); do - mv "$i" "$(echo $i | sed s/.tmp_//)" - done - ''; - } stdenv; - - /* Return a modified stdenv that builds packages with GCC's coverage instrumentation. The coverage note files (*.gcno) are stored in $out/.build, along with the source code of the package, to enable programs like lcov to produce pretty-printed reports. */ addCoverageInstrumentation = stdenv: - cleanupBuildTree (keepBuildTree (overrideInStdenv stdenv [ pkgs.enableCoverageInstrumentation ])); + overrideInStdenv stdenv [ pkgs.enableGCOVInstrumentation pkgs.keepBuildTree ]; /* Replace the meta.maintainers field of a derivation. This is useful diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 0d22468e5eca..a79317cd6baa 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -396,10 +396,12 @@ let fixDarwinDylibNames = makeSetupHook { } ../build-support/setup-hooks/fix-darwin-dylib-names.sh; - enableCoverageInstrumentation = makeSetupHook { } ../build-support/setup-hooks/enable-coverage-instrumentation.sh; + keepBuildTree = makeSetupHook { } ../build-support/setup-hooks/keep-build-tree.sh; - makeCoverageAnalysisReport = makeSetupHook - { deps = [ pkgs.lcov pkgs.enableCoverageInstrumentation ]; } + enableGCOVInstrumentation = makeSetupHook { } ../build-support/setup-hooks/enable-coverage-instrumentation.sh; + + makeGCOVReport = makeSetupHook + { deps = [ pkgs.lcov pkgs.enableGCOVInstrumentation ]; } ../build-support/setup-hooks/make-coverage-analysis-report.sh; |