diff --git a/pkgs/development/tools/rust/cargo-llvm-cov/default.nix b/pkgs/development/tools/rust/cargo-llvm-cov/default.nix index 88b2f2e24406..24e8f458b60b 100644 --- a/pkgs/development/tools/rust/cargo-llvm-cov/default.nix +++ b/pkgs/development/tools/rust/cargo-llvm-cov/default.nix @@ -1,36 +1,76 @@ +# If the tests are broken, it's probably for one of two reasons: +# +# 1. The version of llvm used doesn't match the expectations of rustc and/or +# cargo-llvm-cov. This is relatively unlikely because we pull llvm out of +# rustc's attrset, so it *should* be the right version as long as this is the +# case. +# 2. Nixpkgs has changed its rust infrastructure in a way that causes +# cargo-llvm-cov to misbehave under test. It's likely that even though the +# tests are failing, cargo-llvm-cov will still function properly in actual +# use. This has happened before, and is described [here][0] (along with a +# feature request that would fix this instance of the problem). +# +# For previous test-troubleshooting discussion, see [here][1]. +# +# [0]: https://github.com/taiki-e/cargo-llvm-cov/issues/242 +# [1]: https://github.com/NixOS/nixpkgs/pull/197478 + { stdenv , lib -, fetchCrate +, fetchurl +, fetchFromGitHub , rustPlatform +, rustc }: -rustPlatform.buildRustPackage rec { +let pname = "cargo-llvm-cov"; version = "0.5.31"; - src = fetchCrate { - inherit pname version; - sha256 = "sha256-HjnP9H1t660PJ5eXzgAhrdDEgqdzzb+9Dbk5RGUPjaQ="; + owner = "taiki-e"; + homepage = "https://github.com/${owner}/${pname}"; + + llvm = rustc.llvmPackages.llvm; + + # Download `Cargo.lock` from crates.io so we don't clutter up Nixpkgs + cargoLock = fetchurl { + name = "Cargo.lock"; + url = "https://crates.io/api/v1/crates/${pname}/${version}/download"; + sha256 = "sha256-BbrdyJgZSIz6GaTdQv1GiFHufRBSbcoHcqqEmr/HvAM="; + downloadToTemp = true; + postFetch = '' + tar xzf $downloadedFile ${pname}-${version}/Cargo.lock + mv ${pname}-${version}/Cargo.lock $out + ''; }; - cargoSha256 = "sha256-p6zpRRNX4g+jESNSwouWMjZlFhTBFJhe7LirYtFrZ1g="; +in - # skip tests which require llvm-tools-preview - checkFlags = [ - "--skip bin_crate" - "--skip cargo_config" - "--skip clean_ws" - "--skip instantiations" - "--skip merge" - "--skip merge_failure_mode_all" - "--skip no_test" - "--skip open_report" - "--skip real1" - "--skip show_env" - "--skip virtual1" - ]; +rustPlatform.buildRustPackage { + inherit pname version; - meta = rec { - homepage = "https://github.com/taiki-e/${pname}"; + # Use `fetchFromGitHub` instead of `fetchCrate` because the latter does not + # pull in fixtures needed for the test suite + src = fetchFromGitHub { + inherit owner; + repo = pname; + rev = "v${version}"; + sha256 = "sha256-wRo94JVn4InkhrMHFSsEvm2FFIxUsltA57sMMOcL8b0="; + }; + + # Upstream doesn't include the lockfile so we need to add it back + postUnpack = '' + cp ${cargoLock} source/Cargo.lock + ''; + + cargoSha256 = "sha256-XcsognndhHenYnlJCNMbrNh+S8FX7qxXUjuV1j2qsmY="; + + # `cargo-llvm-cov` reads these environment variables to find these binaries, + # which are needed to run the tests + LLVM_COV = "${llvm}/bin/llvm-cov"; + LLVM_PROFDATA = "${llvm}/bin/llvm-profdata"; + + meta = { + inherit homepage; changelog = homepage + "/blob/v${version}/CHANGELOG.md"; description = "Cargo subcommand to easily use LLVM source-based code coverage"; longDescription = '' @@ -39,6 +79,9 @@ rustPlatform.buildRustPackage rec { library (e.g. fenix or rust-overlay) ''; license = with lib.licenses; [ asl20 /* or */ mit ]; - maintainers = with lib.maintainers; [ wucke13 matthiasbeyer ]; + maintainers = with lib.maintainers; [ wucke13 matthiasbeyer CobaltCause ]; + + # The profiler runtime is (currently) disabled on non-Linux platforms + broken = !(stdenv.isLinux && !stdenv.targetPlatform.isRedox); }; }