1{ stdenv, fetchurl, makeWrapper, bash, cacert, zlib, buildRustPackage, curl, darwin
2, version
3, src
4, platform
5, versionType
6}:
7
8let
9 inherit (stdenv.lib) getLib optionalString;
10 inherit (darwin) libiconv;
11 inherit (darwin.apple_sdk.frameworks) Security;
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 buildInputs = [ bash ] ++ stdenv.lib.optional stdenv.isDarwin Security;
38
39 postPatch = ''
40 patchShebangs .
41 '';
42
43 installPhase = ''
44 ./install.sh --prefix=$out \
45 --components=${installComponents}
46
47 ${optionalString (stdenv.isLinux && bootstrapping) ''
48 patchelf \
49 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
50 "$out/bin/rustc"
51 patchelf \
52 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
53 "$out/bin/rustdoc"
54 patchelf \
55 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
56 "$out/bin/cargo"
57 ''}
58
59 ${optionalString (stdenv.isDarwin && bootstrapping) ''
60 install_name_tool -change /usr/lib/libresolv.9.dylib '${darwin.libresolv}/lib/libresolv.9.dylib' "$out/bin/rustc"
61 install_name_tool -change /usr/lib/libresolv.9.dylib '${darwin.libresolv}/lib/libresolv.9.dylib' "$out/bin/rustdoc"
62 install_name_tool -change /usr/lib/libiconv.2.dylib '${darwin.libiconv}/lib/libiconv.2.dylib' "$out/bin/cargo"
63 install_name_tool -change /usr/lib/libresolv.9.dylib '${darwin.libresolv}/lib/libresolv.9.dylib' "$out/bin/cargo"
64 install_name_tool -change /usr/lib/libcurl.4.dylib '${stdenv.lib.getLib curl}/lib/libcurl.4.dylib' "$out/bin/cargo"
65 for f in $out/lib/lib*.dylib; do
66 install_name_tool -change /usr/lib/libresolv.9.dylib '${darwin.libresolv}/lib/libresolv.9.dylib' "$f"
67 done
68 ''}
69
70 # Do NOT, I repeat, DO NOT use `wrapProgram` on $out/bin/rustc
71 # (or similar) here. It causes strange effects where rustc loads
72 # the wrong libraries in a bootstrap-build causing failures that
73 # are very hard to track dow. For details, see
74 # https://github.com/rust-lang/rust/issues/34722#issuecomment-232164943
75 '';
76 };
77
78 cargo = stdenv.mkDerivation rec {
79 name = "cargo-${versionType}-${version}";
80
81 inherit version;
82 inherit src;
83
84 meta = with stdenv.lib; {
85 homepage = http://www.rust-lang.org/;
86 description = "A safe, concurrent, practical language";
87 maintainers = with maintainers; [ qknight ];
88 license = [ licenses.mit licenses.asl20 ];
89 };
90
91 buildInputs = [ makeWrapper bash ] ++ stdenv.lib.optional stdenv.isDarwin Security;
92
93 postPatch = ''
94 patchShebangs .
95 '';
96
97 installPhase = ''
98 patchShebangs ./install.sh
99 ./install.sh --prefix=$out \
100 --components=cargo
101
102 ${optionalString (stdenv.isLinux && bootstrapping) ''
103 patchelf \
104 --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
105 "$out/bin/cargo"
106 ''}
107
108 ${optionalString (stdenv.isDarwin && bootstrapping) ''
109 install_name_tool -change /usr/lib/libiconv.2.dylib '${darwin.libiconv}/lib/libiconv.2.dylib' "$out/bin/cargo"
110 install_name_tool -change /usr/lib/libresolv.9.dylib '${darwin.libresolv}/lib/libresolv.9.dylib' "$out/bin/cargo"
111 install_name_tool -change /usr/lib/libcurl.4.dylib '${stdenv.lib.getLib curl}/lib/libcurl.4.dylib' "$out/bin/cargo"
112 ''}
113
114 wrapProgram "$out/bin/cargo" \
115 --suffix PATH : "${rustc}/bin"
116 '';
117 };
118}