%general-entities; ]> $LastChangedBy$ $Date$ Rustc-&rust-version; Rust Introduction to Rust The Rust programming language is designed to be a safe, concurrent, practical language. This package is updated on a six-weekly release cycle. Because it is such a large and slow package to build, and is at the moment only required by five packages in this book, the BLFS editors take the view that it should only be updated when that is necessary (either to fix problems, or to allow a new version of firefox to build). As with many other programming languages, rustc (the rust compiler) needs a binary from which to bootstrap. It will download a stage0 binary and many cargo crates (these are actually .tar.gz source archives) at the start of the build, so you cannot compile it without an internet connection. These crates will then remain in various forms (cache, directories of extracted source), in ~/.cargo for ever more. It is common for large rust packages to use multiple versions of some crates. If you purge the files before updating this package, very few crates will need to be updated by the packages in this book which use it (and they will be downloaded as required). But if you retain an older version as a fallback option and then use it (that would require not building in /usr), it is likely that it will then have to re download some crates. For a full download (i.e. starting with an empty or missing ~/.cargo) downloading the external cargo files for this version only takes a minute or so on a fast network. When you upgrade to a newer version, the new libraries will have various hashes in their names and therefore there will be a mix of versions but only one of each will be usable. A binary distribution would use its package manager to delete all the old rust installation before updating. You may wish to do the same to save space. The current rustbuild build-system will use all available processors, although it does not scale well and often falls back to just using one core while waiting for a library to compile. At the moment Rust does not provide any guarantees of a stable ABI. Rustc defaults to building for ALL supported architectures, using a shipped copy of LLVM. In BLFS the build is only for the X86 architecture. If you intend to develop rust crates, this build may not be good enough for your purposes. Unlike with previous versions, the build times of this version when repeated on the same machine seem reasonably consistent. Unusually, a DESTDIR-style method is being used to install this package. This is because running the install as root not only downloads all of the cargo files again (to /root/.cargo), it then spends a very long time recompiling. Using this method saves a lot of time, at the cost of extra disk space. &lfs83_checked; Package Information Download (HTTP): Download (FTP): Download MD5 sum: &rust-md5sum; Download size: &rust-size; Estimated disk space required: &rust-buildsize; Estimated build time: &rust-time; Rust Dependencies Required , , , and Optional (used by the testsuite if it is present) User Notes: Installation of Rust First create a suitable config.toml file which will configure the build. Unlike with previous releases, where even quite old system versions of LLVMworked well, this version ships with a development version and using the current release is known to result in breakage in some circumstances. cat << EOF > config.toml # see config.toml.example for more possible options [llvm] # use ninja ninja = true targets = "X86" # When compiling LLVM, the experimental targets (WebAssembly # and RISCV) are built by default - omit them experimental-targets = "" [build] # omiti HTML docs to save time and space (comment this to build them) docs = false # install cargo as well as rust extended = true [install] prefix = "/usr" # docdir is used even if the full awesome docs are not installed docdir = "share/doc/rustc-&rust-version;" [rust] channel = "stable" rpath = false # BLFS does not install the FileCheck executable from llvm, # so disable codegen tests codegen-tests = false # get a trace if there is an Internal Compiler Exception backtrace-on-ice = true EOF Now install Rust by running the following commands: export RUSTFLAGS="$RUSTFLAGS -C link-args=-lffi" && ./x.py build --exclude src/tools/miri The testsuite will generate some messages in the system log systemd journal for traps on invalid opcodes, and for segmentation faults. In themselves these are nothing to worry about, just a way for the test to be terminated. But if the output from the testsuite reports tests which FAIL with segmentation faults (signal 11) then there may be a problem. To run the tests issue ./x.py test --verbose --no-fail-fast | tee rustc-testlog: as with the build, that will use all available CPUs. The instructions above do not build ARM compilers, so the testsuite will fail and the tests will be reported to end in error, with a backtrace of the last failing test. On a good run, 3 tests which need Thumb (ARM) compilers will fail, all in ui/issues for issues 37131, 49851 and 50993. Occasionally a fourth test, in run-make, 'sysroot-crates-are-unstable', has been known to fail. That is probably harmless. As with all large testsuites, other tests might fail on some machines - if the number of failures is in the single digits, check the log for 'FAILED' and review lines above that. Any mention of SIGSEGV or signal 11 in a failing test is a cause for concern. Therefore, you should determine the number of tests, failures, etc. The total number of tests which were considered is found by running: grep 'running .* tests' rustc-testlog | awk '{ sum += $2 } END { print sum }' That should report 15795 tests. Similarly, the total tests which failed can be found by running: grep '^test result:' rustc-testlog | awk '{ sum += $6 } END { print sum }' And similarly for the tests which passed use $4, for those which were ignored (i.e. skipped) use $8 (and $10 for 'measured', $12 for 'filtered out' but both are probably zero). The breakdown does not quite match the overall total. Still as your normal user, do a DESTDIR install: export LIBSSH2_SYS_USE_PKG_CONFIG=1 && DESTDIR=${PWD}/install ./x.py install && unset LIBSSH2_SYS_USE_PKG_CONFIG Now, as the root user install the files from the DESTDIR: chown -R root:root install && cp -a install/* / Command Explanations targets = "X86": this avoids building all the available linux cross-compilers (Aarch64, MIPS, PowerPC, SystemZ, etc). Unfortunately, rust insists on installing source files for these below /usr/lib/rustlib/src. extended = true: this installs Cargo alongside Rust. channel = "stable": this ensures only stable features can be used, the default in config.toml is to use development features, which is not appropriate for a released version. rpath = false: by default, rust can be run from where it was built, without being installed. That adds DT_RPATH entries to all of the ELF files, which produces very messy output from ldd, showing the libraries in the place they were built, even if they have been deleted from there after the install. export RUSTFLAGS="$RUSTFLAGS -C link-args=-lffi": This adds a link to libffi to any RUSTFLAGS you may already be passing to the build. On some systems, linking fails to include libffi unless this is used. The reason why this is needed is not clear. --exclude src/tools/miri: For a long time, the miri crate (an interpreter for the Midlevel Intermediate Representation) has failed to build on releases. It is optional, but the failure messages can persuade people that the whole build failed. --verbose: this switch can sometimes provide more information about a test which fails. --no-fail-fast: this switch ensures that the testsuite will not stop at the first error. export LIBSSH2_SYS_USE_PKG_CONFIG=1: On some systems, cairo fails to link during the install because it cannot find libssh2. This seems to fix it, but again the reason why the problem occurs is not understood. DESTDIR=${PWD}/install ./x.py install: This effects a DESTDIR-style install in the source tree,creating an install directory. Note that DESTDIR installs need an absolute path, passing 'install' will not work. chown -R root:root install: the DESTDIR install was run by a regular user, who owns the files. For security, change their owner before doing a simple copy to install them. Contents Installed Programs Installed Libraries Installed Directories cargo-clippy, cargo-fmt, cargo, clippy-driver, rls, rust-gdb, rust-lldb, rustc, rustdoc, rustfmt. Many lib*<16-byte-hash>.so libraries. ~/.cargo, /usr/lib/rustlib, /usr/share/doc/rustc-&rust-version;, and /usr/share/zsh/site-functions/ Short Descriptions cargo-clippy provides lint checks for a cargo package. cargo-clippy cargo-fmt formats all bin and lib files of the current crate using rustfmt. cargo-fmt cargo is the Package Manager for Rust. cargo clippy-driver provides lint checks for Rust. clippy-driver rls is the Rust Language Server. This can run in the background to provide IDEs, editors, and other tools with information about Rust programs. rls rust-gdb is a wrapper script for gdb, pulling in Python pretty-printing modules installed in /usr/lib/rustlib/etc. rust-gdb rust-lldb is a wrapper script for LLDB (the LLVM debugger) pulling in the Python pretty-printing modules. rust=lldb rustc is the rust compiler. rustc rustdoc generates documentation from rust source code. rustdoc rustfmt formats rust code. rustfmt libstd-<16-byte-hash>.so is the Rust Standard Library, the foundation of portable Rust software. libstd-<16-byte-hash>.so