summaryrefslogtreecommitdiffstats
path: root/pkgs/development/compilers/rust/cargo.nix
blob: 3fb4f948a2233d588c1b3d7e2cf7fcc0665fe21e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{
  lib,
  stdenv,
  pkgsHostHost,
  pkgsBuildBuild,
  file,
  curl,
  pkg-config,
  python3,
  openssl,
  cmake,
  zlib,
  installShellFiles,
  makeWrapper,
  rustPlatform,
  rustc,
  auditable ? !cargo-auditable.meta.broken,
  cargo-auditable,
}:

rustPlatform.buildRustPackage.override
  {
    cargo-auditable = cargo-auditable.bootstrap;
  }
  {
    pname = "cargo";
    inherit (rustc.unwrapped) version src;

    # the rust source tarball already has all the dependencies vendored, no need to fetch them again
    cargoVendorDir = "vendor";
    buildAndTestSubdir = "src/tools/cargo";

    inherit auditable;

    passthru = {
      rustc = rustc;
      inherit (rustc.unwrapped) tests;
    };

    # changes hash of vendor directory otherwise
    dontUpdateAutotoolsGnuConfigScripts = true;

    nativeBuildInputs = [
      pkg-config
      cmake
      installShellFiles
      makeWrapper
      (lib.getDev pkgsHostHost.curl)
      zlib
    ];
    buildInputs = [
      file
      curl
      python3
      openssl
      zlib
    ];

    env = {
      # cargo uses git-rs which is made for a version of libgit2 from recent master that
      # is not compatible with the current version in nixpkgs.
      #LIBGIT2_SYS_USE_PKG_CONFIG = 1;

      # fixes: the cargo feature `edition` requires a nightly version of Cargo, but this is the `stable` channel
      RUSTC_BOOTSTRAP = 1;

    }
    // lib.optionalAttrs (stdenv.hostPlatform.rust.rustcTargetSpec == "x86_64-unknown-linux-gnu") {
      # Upstream defaults to lld on x86_64-unknown-linux-gnu, we want to use our linker
      RUSTFLAGS = "-Clinker-features=-lld -Clink-self-contained=-linker";
    };

    postInstall = ''
      wrapProgram "$out/bin/cargo" --suffix PATH : "${rustc}/bin"

      installManPage src/tools/cargo/src/etc/man/*

    ''
    + (
      if stdenv.buildPlatform.canExecute stdenv.hostPlatform then
        ''
          installShellCompletion --cmd cargo \
            --bash <(CARGO_COMPLETE=bash $out/bin/cargo) \
            --fish <(CARGO_COMPLETE=fish $out/bin/cargo) \
            --zsh <(CARGO_COMPLETE=zsh $out/bin/cargo)
        ''
      else
        ''
          installShellCompletion --cmd cargo \
            --bash src/tools/cargo/src/etc/cargo.bashcomp.sh \
            --fish ${pkgsBuildBuild.cargo}/share/fish/vendor_completions.d/*.fish \
            --zsh src/tools/cargo/src/etc/_cargo
        ''
    );

    checkPhase = ''
      # Disable cross compilation tests
      export CFG_DISABLE_CROSS_TESTS=1
      cargo test
    '';

    # Disable check phase as there are failures (4 tests fail)
    doCheck = false;

    doInstallCheck = !stdenv.hostPlatform.isStatic && stdenv.hostPlatform.isElf;
    installCheckPhase = ''
      runHook preInstallCheck
      ${stdenv.cc.targetPrefix}readelf -a $out/bin/.cargo-wrapped | grep -F 'Shared library: [libcurl.so'
      runHook postInstallCheck
    '';

    # Make sure our build rustc/cargo never make it into our runtime closure
    disallowedReferences = [
      rustPlatform.rust.cargo
      rustPlatform.rust.rustc
      rustPlatform.rust.rustc.unwrapped
    ];

    meta = {
      homepage = "https://crates.io";
      description = "Downloads your Rust project's dependencies and builds your project";
      mainProgram = "cargo";
      teams = [ lib.teams.rust ];
      license = [
        lib.licenses.mit
        lib.licenses.asl20
      ];
      platforms = lib.platforms.unix;
      # https://github.com/alexcrichton/nghttp2-rs/issues/2
      broken = stdenv.hostPlatform.isx86 && stdenv.buildPlatform != stdenv.hostPlatform;
    };
  }