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;
};
}
|