diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-03-03 13:39:30 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2014-03-03 13:57:08 +0100 |
commit | 497997cc388ce791ca0b4dc55f46ab515e8fb5d9 (patch) | |
tree | 867053bb31858180d2b439d1c63c610c58be54ee /pkgs/build-support | |
parent | ad7c518e45221533e2094acb20fea6ade477da75 (diff) | |
download | nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar.gz nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar.bz2 nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar.lz nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar.xz nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.tar.zst nixpkgs-497997cc388ce791ca0b4dc55f46ab515e8fb5d9.zip |
Move generation of coverage reports from nixos/lib/testing to releaseTools
Also, turn some stdenv adapters into setup hooks.
Diffstat (limited to 'pkgs/build-support')
-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 |
5 files changed, 78 insertions, 2 deletions
diff --git a/pkgs/build-support/release/default.nix b/pkgs/build-support/release/default.nix index acad3487dad..6288935ec2a 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 00000000000..8ce5c0488a7 --- /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 993f12bc300..8ebae24c673 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 08ef490e244..7175b408b02 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 00000000000..754900bfc33 --- /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 +} |