1{ stdenv, fetchurl, fetchgit, fetchzip, which, file, perl, curl, python27
2, makeWrapper, tzdata, git, valgrind, procps, coreutils
3
4, shortVersion, isRelease
5, srcSha, srcRev ? ""
6, snapshotHashLinux686, snapshotHashLinux64
7, snapshotHashDarwin686, snapshotHashDarwin64
8, snapshotDate, snapshotRev
9, configureFlags ? []
10
11, patches
12}:
13
14assert !stdenv.isFreeBSD;
15
16/* Rust's build process has a few quirks :
17
18- It requires some patched in llvm that haven't landed upstream, so it
19 compiles its own llvm. This might change in the future, so at some
20 point we may be able to switch to nix's llvm.
21
22- The Rust compiler is written is Rust, so it requires a bootstrap
23 compiler, which is downloaded during the build. To make the build
24 pure, we download it ourself before and put it where it is
25 expected. Once the language is stable (1.0) , we might want to
26 switch it to use nix's packaged rust compiler.
27
28NOTE : some derivation depend on rust. When updating this, please make
29sure those derivations still compile. (racer, for example).
30
31*/
32
33assert (if isRelease then srcRev == "" else srcRev != "");
34
35let version = if isRelease then
36 "${shortVersion}"
37 else
38 "${shortVersion}-g${builtins.substring 0 7 srcRev}";
39
40 name = "rustc-${version}";
41
42 platform = if stdenv.system == "i686-linux"
43 then "linux-i386"
44 else if stdenv.system == "x86_64-linux"
45 then "linux-x86_64"
46 else if stdenv.system == "i686-darwin"
47 then "macos-i386"
48 else if stdenv.system == "x86_64-darwin"
49 then "macos-x86_64"
50 else abort "no snapshot to bootstrap for this platform (missing platform url suffix)";
51
52 target = if stdenv.system == "i686-linux"
53 then "i686-unknown-linux-gnu"
54 else if stdenv.system == "x86_64-linux"
55 then "x86_64-unknown-linux-gnu"
56 else if stdenv.system == "i686-darwin"
57 then "i686-apple-darwin"
58 else if stdenv.system == "x86_64-darwin"
59 then "x86_64-apple-darwin"
60 else abort "no snapshot to bootstrap for this platform (missing target triple)";
61
62 meta = with stdenv.lib; {
63 homepage = http://www.rust-lang.org/;
64 description = "A safe, concurrent, practical language";
65 maintainers = with maintainers; [ madjar cstrahan wizeman globin havvy ];
66 license = [ licenses.mit licenses.asl20 ];
67 platforms = platforms.linux;
68 };
69
70 snapshotHash = if stdenv.system == "i686-linux"
71 then snapshotHashLinux686
72 else if stdenv.system == "x86_64-linux"
73 then snapshotHashLinux64
74 else if stdenv.system == "i686-darwin"
75 then snapshotHashDarwin686
76 else if stdenv.system == "x86_64-darwin"
77 then snapshotHashDarwin64
78 else abort "no snapshot for platform ${stdenv.system}";
79 snapshotName = "rust-stage0-${snapshotDate}-${snapshotRev}-${platform}-${snapshotHash}.tar.bz2";
80in
81
82stdenv.mkDerivation {
83 inherit name;
84 inherit version;
85 inherit meta;
86
87 __impureHostDeps = [ "/usr/lib/libedit.3.dylib" ];
88
89 src = if isRelease then
90 fetchzip {
91 url = "http://static.rust-lang.org/dist/rustc-${version}-src.tar.gz";
92 sha256 = srcSha;
93 }
94 else
95 fetchgit {
96 url = https://github.com/rust-lang/rust;
97 rev = srcRev;
98 sha256 = srcSha;
99 };
100
101 # We need rust to build rust. If we don't provide it, configure will try to download it.
102 snapshot = stdenv.mkDerivation {
103 name = "rust-stage0";
104 src = fetchurl {
105 url = "http://static.rust-lang.org/stage0-snapshots/${snapshotName}";
106 sha1 = snapshotHash;
107 };
108 dontStrip = true;
109 installPhase = ''
110 mkdir -p "$out"
111 cp -r bin "$out/bin"
112 '' + stdenv.lib.optionalString stdenv.isLinux ''
113 patchelf --interpreter "${stdenv.glibc}/lib/${stdenv.cc.dynamicLinker}" \
114 --set-rpath "${stdenv.cc.cc}/lib/:${stdenv.cc.cc}/lib64/" \
115 "$out/bin/rustc"
116 '';
117 };
118
119 configureFlags = configureFlags
120 ++ [ "--enable-local-rust" "--local-rust-root=$snapshot" "--enable-rpath" ]
121 ++ stdenv.lib.optional (stdenv.cc.cc ? isClang) "--enable-clang";
122
123 inherit patches;
124
125 postPatch = ''
126 substituteInPlace src/librustc_back/target/mod.rs \
127 --subst-var-by "ccPath" "${stdenv.cc}/bin/cc" \
128 --subst-var-by "arPath" "${stdenv.cc.binutils}/bin/ar"
129
130 substituteInPlace src/rust-installer/gen-install-script.sh \
131 --replace /bin/echo "${coreutils}/bin/echo"
132 substituteInPlace src/rust-installer/gen-installer.sh \
133 --replace /bin/echo "${coreutils}/bin/echo"
134
135 # Workaround for NixOS/nixpkgs#8676
136 substituteInPlace mk/rustllvm.mk \
137 --replace "\$\$(subst /,//," "\$\$(subst /,/,"
138 '';
139
140 buildInputs = [ which file perl curl python27 makeWrapper git ]
141 ++ stdenv.lib.optionals (!stdenv.isDarwin) [ procps valgrind ];
142
143 enableParallelBuilding = true;
144
145 outputs = [ "out" "doc" ];
146
147 preCheck = "export TZDIR=${tzdata}/share/zoneinfo";
148
149 doCheck = true;
150}