1{ stdenv, fetchurl, makeWrapper, cacert, zlib, buildRustPackage, curl
2, version
3, src
4, platform
5, versionType
6}:
7
8let
9 inherit (stdenv.lib) optionalString;
10
11 needsPatchelf = stdenv.isLinux;
12
13 bootstrapping = versionType == "bootstrap";
14
15 installComponents
16 = "rustc,rust-std-${platform}"
17 + (optionalString bootstrapping ",rust-docs,cargo")
18 ;
19in
20
21rec {
22 inherit buildRustPackage;
23
24 rustc = stdenv.mkDerivation rec {
25 name = "rustc-${versionType}-${version}";
26
27 inherit version;
28 inherit src;
29
30 meta = with stdenv.lib; {
31 homepage = http://www.rust-lang.org/;
32 description = "A safe, concurrent, practical language";
33 maintainers = with maintainers; [ qknight ];
34 license = [ licenses.mit licenses.asl20 ];
35 };
36
37 phases = ["unpackPhase" "installPhase"];
38
39 installPhase = ''
40 ./install.sh --prefix=$out \
41 --components=${installComponents}
42
43 ${optionalString (needsPatchelf && bootstrapping) ''
44 patchelf \
45 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
46 "$out/bin/rustdoc"
47 patchelf \
48 --set-rpath "${stdenv.lib.makeLibraryPath [ curl zlib ]}" \
49 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
50 "$out/bin/cargo"
51 ''}
52
53 ${optionalString needsPatchelf ''
54 patchelf \
55 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
56 "$out/bin/rustc"
57
58 # Do NOT, I repeat, DO NOT use `wrapProgram` on $out/bin/rustc
59 # (or similar) here. It causes strange effects where rustc loads
60 # the wrong libraries in a bootstrap-build causing failures that
61 # are very hard to track dow. For details, see
62 # https://github.com/rust-lang/rust/issues/34722#issuecomment-232164943
63 ''}
64 '';
65
66 };
67
68 cargo = stdenv.mkDerivation rec {
69 name = "cargo-${versionType}-${version}";
70
71 inherit version;
72 inherit src;
73
74 meta = with stdenv.lib; {
75 homepage = http://www.rust-lang.org/;
76 description = "A safe, concurrent, practical language";
77 maintainers = with maintainers; [ qknight ];
78 license = [ licenses.mit licenses.asl20 ];
79 };
80
81 buildInputs = [ makeWrapper ];
82 phases = ["unpackPhase" "installPhase"];
83
84 installPhase = ''
85 ./install.sh --prefix=$out \
86 --components=cargo
87
88 ${optionalString needsPatchelf ''
89 patchelf \
90 --set-rpath "${stdenv.lib.makeLibraryPath [ curl zlib ]}" \
91 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
92 "$out/bin/cargo"
93 ''}
94
95 wrapProgram "$out/bin/cargo" \
96 --suffix PATH : "${rustc}/bin"
97 '';
98 };
99}