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