{ 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' Totals<\/pre>$/d' \ | sed -n -e '2,1p' \ | sed -e 's/
[[: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";
  };
}