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