Files
where-are-my-friends/nix/coverage-html.nix
T
oysteikt ee2b648c9a
Build and test / build (push) Successful in 56s
Build and test / build-freebsd-cross (push) Successful in 1m2s
Build and test / test (push) Successful in 1m6s
nix/coverage-html: use line coverage for badge number
2026-06-11 18:08:05 +09:00

107 lines
2.2 KiB
Nix

{
lib,
src,
stdenv,
cmocka,
libllvm,
pkg-config,
htmlq,
anybadge,
}:
stdenv.mkDerivation {
pname = "where-are-my-friends-coverage-html";
version = "0.1.0";
inherit src;
makeFlags = [
"prefix=$(out)"
"CC=${stdenv.cc.targetPrefix}cc"
];
hardeningDisable = [ "fortify" ];
env = {
CMOCKA_MESSAGE_OUTPUT = "XML";
LLVM_PROFILE_FILE = "output/prof/wamf-%p-%m.profraw";
};
nativeBuildInputs = [
pkg-config
libllvm
htmlq
anybadge
];
buildInputs = [ cmocka ];
buildPhase = ''
runHook preBuild
mkdir -p "$(dirname "$LLVM_PROFILE_FILE")"
make check
llvm-profdata merge -sparse output/prof/wamf-*.profraw -o wamf.profdata
LLVM_COV_ARGS=(
-format=html
-output-dir=coverage-html
-instr-profile=wamf.profdata
-object=output/test/test
# -show-line-counts-or-regions
# -show-expansions
# -show-instantiations
-use-color
-Xdemangler=c++filt
-ignore-filename-regex='.*(test/).*'
-ignore-filename-regex='.*\.h'
-compilation-dir=.
)
llvm-cov show "''${LLVM_COV_ARGS[@]}"
# Skip "Totals" and "Function Coverage", get "Line Coverage"
TOTAL_COVERAGE="$(
htmlq 'td > pre' <coverage-html/index.html \
| sed -e '0,/^<pre>Totals<\/pre>$/d' \
| sed -n -e '2,1p' \
| sed -e 's/<pre>[[:space:]]*//' \
| sed -e 's/%.*$/%/'
)"
if [[ "$TOTAL_COVERAGE" == *% ]]; then
COVERAGE_VALUE="$(printf "%.0f" "''${TOTAL_COVERAGE%\%}")"
if [[ "$COVERAGE_VALUE" -ge 80 ]]; then
COLOR="green"
elif [[ "$COVERAGE_VALUE" -ge 50 ]]; then
COLOR="yellow"
else
COLOR="red"
fi
else
COLOR="lightgrey"
fi
anybadge --label "coverage" --value "$TOTAL_COVERAGE" --color "$COLOR" > coverage-html/coverage.svg
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p "$(dirname "$out")"
cp -r coverage-html "$out"
runHook postInstall
'';
doCheck = false;
meta = {
description = "RCON -> Bluemap player position API converter";
homepage = "https://git.pvv.ntnu.no/Projects/where-are-my-friends";
platforms = lib.platforms.unix;
mainProgram = "wamf";
};
}