about summary refs log tree commit diff
path: root/pkgs/development/tools/rust/cargo-llvm-cov/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/tools/rust/cargo-llvm-cov/default.nix')
-rw-r--r--pkgs/development/tools/rust/cargo-llvm-cov/default.nix93
1 files changed, 68 insertions, 25 deletions
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
+    '';
+  };
+in
+
+rustPlatform.buildRustPackage {
+  inherit pname version;
+
+  # 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=";
   };
-  cargoSha256 = "sha256-p6zpRRNX4g+jESNSwouWMjZlFhTBFJhe7LirYtFrZ1g=";
-
-  # 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"
-  ];
-
-  meta = rec {
-    homepage = "https://github.com/taiki-e/${pname}";
+
+  # 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);
   };
 }