[rust-dev] how is Rust bootstrapped?
Huon Wilson
dbau.pp at gmail.com
Mon Jun 9 03:36:16 PDT 2014
On 09/06/14 20:12, Zoltán Tóth wrote:
> My question is rather theoretical, from the
> libre-and-open-source-software point of view.
>
> Bootstrapping needs an already existing language to compile the first
> executable version of Rust.
>
> I read that this was OCaml at some time. I do not have OCaml on my
> machine, but still managed to build from a cloned Rust repo. The
> documentation says that building requires a C++ compiler. These
> suggest that the project moved from OCaml to C++.
>
> But there are also some texts on the web and in the source that
> suggests that stage0 is actually not compiled from the source
> repository, but is downloaded as a binary snapshot. If this latter is
> the case, then can someone compile a suitable stage0 from [C++|OCaml]
> source himself?
>
>
> _______________________________________________
> Rust-dev mailing list
> Rust-dev at mozilla.org
> https://mail.mozilla.org/listinfo/rust-dev
Yes, those texts are correct, one downloads a stage0 compiler as a
binary snapshot to compile Rust from source. The stage0 compiler is just
stored binaries compiled from some commit in the past. Every so often
someone makes a new stage0 by making the buildbots build a snapshot of a
more recent commit, allowing the libraries to be completely written in a
newer iteration of Rust (they no longer have to be able to be compiled
by the old snapshot).
There's a wiki page about this snapshot process:
https://github.com/mozilla/rust/wiki/Note-compiler-snapshots
If one was really interested, one could theoretically backtrace through
history, all the way back to the last version[1] of rustboot (the OCaml
compiler), and use this to do a "full bootstrap". That is, use the
rustboot compiler to build the first written-in-Rust compiler as a
snapshot, and then use this snapshot to build the next one, following
the chain of snapshotted commits[2] through to eventually get to modern
Rust.
As others have said, the C++ dependency is just for building LLVM, which
is linked into rustc as a library, it's not used by the snapshot (that
is, LLVM is a dependency required when building librustc to get a rustc
compiler for the next stage; one can use the snapshot to compile
libraries like libstd etc. without needing LLVM).
Huon
[1]:
https://github.com/mozilla/rust/tree/ef75860a0a72f79f97216f8aaa5b388d98da6480/src/boot
[2]: https://github.com/mozilla/rust/blob/master/src/snapshots.txt
More information about the Rust-dev
mailing list