2016-05-03 00:16:15 +02:00
|
|
|
# Sample TOML configuration file for building Rust.
|
|
|
|
#
|
2016-09-03 08:02:03 +02:00
|
|
|
# To configure rustbuild, copy this file to the directory from which you will be
|
|
|
|
# running the build, and name it config.toml.
|
2016-09-03 01:54:02 +02:00
|
|
|
#
|
2016-05-03 00:16:15 +02:00
|
|
|
# All options are commented out by default in this file, and they're commented
|
|
|
|
# out with their default values. The build system by default looks for
|
|
|
|
# `config.toml` in the current directory of a build for build configuration, but
|
|
|
|
# a custom configuration file can also be specified with `--config` to the build
|
|
|
|
# system.
|
|
|
|
|
|
|
|
# =============================================================================
|
|
|
|
# Tweaking how LLVM is compiled
|
|
|
|
# =============================================================================
|
|
|
|
[llvm]
|
|
|
|
|
2017-06-18 16:00:10 +02:00
|
|
|
# Indicates whether rustc will support compilation with LLVM
|
|
|
|
# note: rustc does not compile without LLVM at the moment
|
|
|
|
#enabled = true
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Indicates whether the LLVM build is a Release or Debug build
|
|
|
|
#optimize = true
|
|
|
|
|
2016-11-10 17:30:06 +01:00
|
|
|
# Indicates whether an LLVM Release build should include debug info
|
|
|
|
#release-debuginfo = false
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Indicates whether the LLVM assertions are enabled or not
|
|
|
|
#assertions = false
|
|
|
|
|
|
|
|
# Indicates whether ccache is used when building LLVM
|
|
|
|
#ccache = false
|
2016-12-12 20:36:52 +01:00
|
|
|
# or alternatively ...
|
|
|
|
#ccache = "/path/to/ccache"
|
2016-05-03 00:16:15 +02:00
|
|
|
|
|
|
|
# If an external LLVM root is specified, we automatically check the version by
|
|
|
|
# default to make sure it's within the range that we're expecting, but setting
|
|
|
|
# this flag will indicate that this version check should not be done.
|
2017-10-16 21:57:37 +02:00
|
|
|
#version-check = true
|
2016-05-03 00:16:15 +02:00
|
|
|
|
|
|
|
# Link libstdc++ statically into the librustc_llvm instead of relying on a
|
|
|
|
# dynamic version to be available.
|
|
|
|
#static-libstdcpp = false
|
|
|
|
|
|
|
|
# Tell the LLVM build system to use Ninja instead of the platform default for
|
|
|
|
# the generated build system. This can sometimes be faster than make, for
|
|
|
|
# example.
|
|
|
|
#ninja = false
|
|
|
|
|
2016-12-28 19:23:38 +01:00
|
|
|
# LLVM targets to build support for.
|
|
|
|
# Note: this is NOT related to Rust compilation targets. However, as Rust is
|
|
|
|
# dependent on LLVM for code generation, turning targets off here WILL lead to
|
|
|
|
# the resulting rustc being unable to compile for the disabled architectures.
|
|
|
|
# Also worth pointing out is that, in case support for new targets are added to
|
|
|
|
# LLVM, enabling them here doesn't mean Rust is automatically gaining said
|
|
|
|
# support. You'll need to write a target specification at least, and most
|
|
|
|
# likely, teach rustc about the C ABI of the target. Get in touch with the
|
|
|
|
# Rust team and file an issue if you need assistance in porting!
|
2017-04-18 22:23:47 +02:00
|
|
|
#targets = "X86;ARM;AArch64;Mips;PowerPC;SystemZ;JSBackend;MSP430;Sparc;NVPTX;Hexagon"
|
2016-12-28 19:23:38 +01:00
|
|
|
|
2017-06-17 00:43:43 +02:00
|
|
|
# LLVM experimental targets to build support for. These targets are specified in
|
|
|
|
# the same format as above, but since these targets are experimental, they are
|
|
|
|
# not built by default and the experimental Rust compilation targets that depend
|
2017-11-20 15:22:17 +01:00
|
|
|
# on them will not work unless the user opts in to building them. By default the
|
|
|
|
# `WebAssembly` target is enabled when compiling LLVM from scratch.
|
|
|
|
#experimental-targets = "WebAssembly"
|
2017-06-17 00:43:43 +02:00
|
|
|
|
2017-03-05 16:11:11 +01:00
|
|
|
# Cap the number of parallel linker invocations when compiling LLVM.
|
|
|
|
# This can be useful when building LLVM with debug info, which significantly
|
|
|
|
# increases the size of binaries and consequently the memory required by
|
|
|
|
# each linker process.
|
|
|
|
# If absent or 0, linker invocations are treated like any other job and
|
|
|
|
# controlled by rustbuild's -j parameter.
|
|
|
|
#link-jobs = 0
|
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# When invoking `llvm-config` this configures whether the `--shared` argument is
|
|
|
|
# passed to prefer linking to shared libraries.
|
|
|
|
#link-shared = false
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# =============================================================================
|
|
|
|
# General build configuration options
|
|
|
|
# =============================================================================
|
|
|
|
[build]
|
|
|
|
|
|
|
|
# Build triple for the original snapshot compiler. This must be a compiler that
|
|
|
|
# nightlies are already produced for. The current platform must be able to run
|
|
|
|
# binaries of this build triple and the nightly will be used to bootstrap the
|
|
|
|
# first compiler.
|
|
|
|
#build = "x86_64-unknown-linux-gnu" # defaults to your host platform
|
|
|
|
|
|
|
|
# In addition to the build triple, other triples to produce full compiler
|
|
|
|
# toolchains for. Each of these triples will be bootstrapped from the build
|
|
|
|
# triple and then will continue to bootstrap themselves. This platform must
|
|
|
|
# currently be able to run all of the triples provided here.
|
|
|
|
#host = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple
|
|
|
|
|
|
|
|
# In addition to all host triples, other triples to produce the standard library
|
|
|
|
# for. Each host triple will be used to produce a copy of the standard library
|
|
|
|
# for each target triple.
|
|
|
|
#target = ["x86_64-unknown-linux-gnu"] # defaults to just the build triple
|
|
|
|
|
2017-03-20 19:28:04 +01:00
|
|
|
# Instead of downloading the src/stage0.txt version of Cargo specified, use
|
2016-05-03 00:16:15 +02:00
|
|
|
# this Cargo binary instead to build all Rust code
|
|
|
|
#cargo = "/path/to/bin/cargo"
|
|
|
|
|
2017-03-20 19:28:04 +01:00
|
|
|
# Instead of downloading the src/stage0.txt version of the compiler
|
2016-05-03 00:16:15 +02:00
|
|
|
# specified, use this rustc binary instead as the stage0 snapshot compiler.
|
|
|
|
#rustc = "/path/to/bin/rustc"
|
|
|
|
|
|
|
|
# Flag to specify whether any documentation is built. If false, rustdoc and
|
|
|
|
# friends will still be compiled but they will not be used to generate any
|
|
|
|
# documentation.
|
|
|
|
#docs = true
|
|
|
|
|
|
|
|
# Indicate whether the compiler should be documented in addition to the standard
|
|
|
|
# library and facade crates.
|
|
|
|
#compiler-docs = false
|
|
|
|
|
2016-10-07 18:43:26 +02:00
|
|
|
# Indicate whether submodules are managed and updated automatically.
|
|
|
|
#submodules = true
|
|
|
|
|
2018-03-15 20:13:33 +01:00
|
|
|
# Update submodules only when the checked out commit in the submodules differs
|
|
|
|
# from what is committed in the main rustc repo.
|
|
|
|
#fast-submodules = true
|
|
|
|
|
2016-11-14 17:04:39 +01:00
|
|
|
# The path to (or name of) the GDB executable to use. This is only used for
|
|
|
|
# executing the debuginfo test suite.
|
2016-10-29 20:11:53 +02:00
|
|
|
#gdb = "gdb"
|
|
|
|
|
2016-11-14 17:04:39 +01:00
|
|
|
# The node.js executable to use. Note that this is only used for the emscripten
|
|
|
|
# target when running tests, otherwise this can be omitted.
|
|
|
|
#nodejs = "node"
|
|
|
|
|
|
|
|
# Python interpreter to use for various tasks throughout the build, notably
|
|
|
|
# rustdoc tests, the lldb python interpreter, and some dist bits and pieces.
|
|
|
|
# Note that Python 2 is currently required.
|
|
|
|
#python = "python2.7"
|
|
|
|
|
2017-02-10 21:59:40 +01:00
|
|
|
# Force Cargo to check that Cargo.lock describes the precise dependency
|
|
|
|
# set that all the Cargo.toml files create, instead of updating it.
|
|
|
|
#locked-deps = false
|
|
|
|
|
2016-11-01 21:46:38 +01:00
|
|
|
# Indicate whether the vendored sources are used for Rust dependencies or not
|
|
|
|
#vendor = false
|
|
|
|
|
rustbuild: Compile rustc twice, not thrice
This commit switches the rustbuild build system to compiling the
compiler twice for a normal bootstrap rather than the historical three
times.
Rust is a bootstrapped language which means that a previous version of
the compiler is used to build the next version of the compiler. Over
time, however, we change many parts of compiler artifacts such as the
metadata format, symbol names, etc. These changes make artifacts from
one compiler incompatible from another compiler. Consequently if a
compiler wants to be able to use some artifacts then it itself must have
compiled the artifacts.
Historically the rustc build system has achieved this by compiling the
compiler three times:
* An older compiler (stage0) is downloaded to kick off the chain.
* This compiler now compiles a new compiler (stage1)
* The stage1 compiler then compiles another compiler (stage2)
* Finally, the stage2 compiler needs libraries to link against, so it
compiles all the libraries again.
This entire process amounts in compiling the compiler three times.
Additionally, this process always guarantees that the Rust source tree
can compile itself because the stage2 compiler (created by a freshly
created compiler) would successfully compile itself again. This
property, ensuring Rust can compile itself, is quite important!
In general, though, this third compilation is not required for general
purpose development on the compiler. The third compiler (stage2) can
reuse the libraries that were created during the second compile. In
other words, the second compilation can produce both a compiler and the
libraries that compiler will use. These artifacts *must* be compatible
due to the way plugins work today anyway, and they were created by the
same source code so they *should* be compatible as well.
So given all that, this commit switches the default build process to
only compile the compiler three times, avoiding this third compilation
by copying artifacts from the previous one. Along the way a new entry in
the Travis matrix was also added to ensure that our full bootstrap can
succeed. This entry does not run tests, though, as it should not be
necessary.
To restore the old behavior of a full bootstrap (three compiles) you can
either pass:
./configure --enable-full-bootstrap
or if you're using config.toml:
[build]
full-bootstrap = true
Overall this will hopefully be an easy 33% win in build times of the
compiler. If we do 33% less work we should be 33% faster! This in turn
should affect cycle times and such on Travis and AppVeyor positively as
well as making it easier to work on the compiler itself.
2016-12-26 00:20:33 +01:00
|
|
|
# Typically the build system will build the rust compiler twice. The second
|
|
|
|
# compiler, however, will simply use its own libraries to link against. If you
|
|
|
|
# would rather to perform a full bootstrap, compiling the compiler three times,
|
|
|
|
# then you can set this option to true. You shouldn't ever need to set this
|
|
|
|
# option to true.
|
|
|
|
#full-bootstrap = false
|
|
|
|
|
2017-09-07 00:22:32 +02:00
|
|
|
# Enable a build of the extended rust tool set which is not only the compiler
|
|
|
|
# but also tools such as Cargo. This will also produce "combined installers"
|
|
|
|
# which are used to install Rust and Cargo together. This is disabled by
|
|
|
|
# default.
|
2017-01-21 02:03:06 +01:00
|
|
|
#extended = false
|
|
|
|
|
2018-02-16 15:56:50 +01:00
|
|
|
# Installs chosen set of extended tools if enables. By default builds all.
|
|
|
|
# If chosen tool failed to build the installation fails.
|
2018-02-05 18:10:05 +01:00
|
|
|
#tools = ["cargo", "rls", "rustfmt", "analysis", "src"]
|
|
|
|
|
2017-02-06 20:47:04 +01:00
|
|
|
# Verbosity level: 0 == not verbose, 1 == verbose, 2 == very verbose
|
|
|
|
#verbose = 0
|
|
|
|
|
2017-02-04 00:58:47 +01:00
|
|
|
# Build the sanitizer runtimes
|
|
|
|
#sanitizers = false
|
|
|
|
|
2017-02-13 10:57:50 +01:00
|
|
|
# Build the profiler runtime
|
|
|
|
#profiler = false
|
|
|
|
|
2017-02-16 00:57:06 +01:00
|
|
|
# Indicates whether the OpenSSL linked into Cargo will be statically linked or
|
|
|
|
# not. If static linkage is specified then the build system will download a
|
|
|
|
# known-good version of OpenSSL, compile it, and link it to Cargo.
|
|
|
|
#openssl-static = false
|
|
|
|
|
2017-05-18 18:00:31 +02:00
|
|
|
# Run the build with low priority, by setting the process group's "nice" value
|
|
|
|
# to +10 on Unix platforms, and by using a "low priority" job object on Windows.
|
|
|
|
#low-priority = false
|
2017-03-23 22:57:29 +01:00
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# Arguments passed to the `./configure` script, used during distcheck. You
|
|
|
|
# probably won't fill this in but rather it's filled in by the `./configure`
|
|
|
|
# script.
|
|
|
|
#configure-args = []
|
|
|
|
|
2017-09-07 00:22:32 +02:00
|
|
|
# Indicates that a local rebuild is occurring instead of a full bootstrap,
|
2017-08-27 00:01:48 +02:00
|
|
|
# essentially skipping stage0 as the local compiler is recompiling itself again.
|
|
|
|
#local-rebuild = false
|
|
|
|
|
2016-12-19 23:49:57 +01:00
|
|
|
# =============================================================================
|
|
|
|
# General install configuration options
|
|
|
|
# =============================================================================
|
|
|
|
[install]
|
|
|
|
|
|
|
|
# Instead of installing to /usr/local, install to this path instead.
|
2016-12-28 18:18:54 +01:00
|
|
|
#prefix = "/usr/local"
|
|
|
|
|
2017-04-28 11:03:58 +02:00
|
|
|
# Where to install system configuration files
|
|
|
|
# If this is a relative path, it will get installed in `prefix` above
|
|
|
|
#sysconfdir = "/etc"
|
|
|
|
|
2017-04-28 11:01:15 +02:00
|
|
|
# Where to install documentation in `prefix` above
|
|
|
|
#docdir = "share/doc/rust"
|
|
|
|
|
|
|
|
# Where to install binaries in `prefix` above
|
|
|
|
#bindir = "bin"
|
|
|
|
|
2016-12-28 18:18:54 +01:00
|
|
|
# Where to install libraries in `prefix` above
|
|
|
|
#libdir = "lib"
|
|
|
|
|
|
|
|
# Where to install man pages in `prefix` above
|
|
|
|
#mandir = "share/man"
|
|
|
|
|
2017-10-27 01:30:17 +02:00
|
|
|
# Where to install data in `prefix` above (currently unused)
|
|
|
|
#datadir = "share"
|
|
|
|
|
|
|
|
# Where to install additional info in `prefix` above (currently unused)
|
|
|
|
#infodir = "share/info"
|
|
|
|
|
|
|
|
# Where to install local state (currently unused)
|
|
|
|
# If this is a relative path, it will get installed in `prefix` above
|
|
|
|
#localstatedir = "/var/lib"
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# =============================================================================
|
|
|
|
# Options for compiling Rust code itself
|
|
|
|
# =============================================================================
|
|
|
|
[rust]
|
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# Indicates that the build should be optimized for debugging Rust. Note that
|
|
|
|
# this is typically not what you want as it takes an incredibly large amount of
|
|
|
|
# time to have a debug-mode rustc compile any code (notably libstd). If this
|
|
|
|
# value is set to `true` it will affect a number of configuration options below
|
|
|
|
# as well, if unconfigured.
|
|
|
|
#debug = false
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Whether or not to optimize the compiler and standard library
|
2017-05-12 13:29:08 +02:00
|
|
|
# Note: the slowness of the non optimized compiler compiling itself usually
|
|
|
|
# outweighs the time gains in not doing optimizations, therefore a
|
|
|
|
# full bootstrap takes much more time with optimize set to false.
|
2016-05-03 00:16:15 +02:00
|
|
|
#optimize = true
|
|
|
|
|
|
|
|
# Number of codegen units to use for each compiler invocation. A value of 0
|
|
|
|
# means "the number of cores on this machine", and 1+ is passed through to the
|
|
|
|
# compiler.
|
|
|
|
#codegen-units = 1
|
|
|
|
|
2018-01-28 23:50:03 +01:00
|
|
|
# Whether to enable ThinLTO (and increase the codegen units to either a default
|
|
|
|
# or the configured value). On by default. If we want the fastest possible
|
|
|
|
# compiler, we should disable this.
|
|
|
|
#thinlto = true
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Whether or not debug assertions are enabled for the compiler and standard
|
2017-08-03 06:12:36 +02:00
|
|
|
# library. Also enables compilation of debug! and trace! logging macros.
|
2016-05-03 00:16:15 +02:00
|
|
|
#debug-assertions = false
|
|
|
|
|
|
|
|
# Whether or not debuginfo is emitted
|
|
|
|
#debuginfo = false
|
|
|
|
|
2016-10-19 18:48:46 +02:00
|
|
|
# Whether or not line number debug information is emitted
|
|
|
|
#debuginfo-lines = false
|
|
|
|
|
2017-01-11 05:01:54 +01:00
|
|
|
# Whether or not to only build debuginfo for the standard library if enabled.
|
|
|
|
# If enabled, this will not compile the compiler with debuginfo, just the
|
|
|
|
# standard library.
|
|
|
|
#debuginfo-only-std = false
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Whether or not jemalloc is built and enabled
|
|
|
|
#use-jemalloc = true
|
|
|
|
|
|
|
|
# Whether or not jemalloc is built with its debug option set
|
|
|
|
#debug-jemalloc = false
|
|
|
|
|
2016-07-26 22:21:25 +02:00
|
|
|
# Whether or not `panic!`s generate backtraces (RUST_BACKTRACE)
|
|
|
|
#backtrace = true
|
|
|
|
|
2017-10-08 10:41:12 +02:00
|
|
|
# The default linker that will be hard-coded into the generated compiler for
|
|
|
|
# targets that don't specify linker explicitly in their target specifications.
|
|
|
|
# Note that this is not the linker used to link said compiler.
|
2016-05-03 00:16:15 +02:00
|
|
|
#default-linker = "cc"
|
|
|
|
|
|
|
|
# The "channel" for the Rust build to produce. The stable/beta channels only
|
|
|
|
# allow using stable features, whereas the nightly and dev channels allow using
|
|
|
|
# nightly features
|
|
|
|
#channel = "dev"
|
|
|
|
|
|
|
|
# By default the `rustc` executable is built with `-Wl,-rpath` flags on Unix
|
|
|
|
# platforms to ensure that the compiler is usable by default from the build
|
|
|
|
# directory (as it links to a number of dynamic libraries). This may not be
|
|
|
|
# desired in distributions, for example.
|
|
|
|
#rpath = true
|
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# Suppresses extraneous output from tests to ensure the output of the test
|
|
|
|
# harness is relatively clean.
|
|
|
|
#quiet-tests = false
|
|
|
|
|
2016-05-14 00:26:41 +02:00
|
|
|
# Flag indicating whether tests are compiled with optimizations (the -O flag) or
|
|
|
|
# with debuginfo (the -g flag)
|
|
|
|
#optimize-tests = true
|
|
|
|
#debuginfo-tests = true
|
|
|
|
|
2016-09-03 03:29:12 +02:00
|
|
|
# Flag indicating whether codegen tests will be run or not. If you get an error
|
|
|
|
# saying that the FileCheck executable is missing, you may want to disable this.
|
|
|
|
#codegen-tests = true
|
|
|
|
|
2017-08-03 18:53:56 +02:00
|
|
|
# Flag indicating whether git info will be retrieved from .git automatically.
|
2017-08-16 03:26:29 +02:00
|
|
|
# Having the git information can cause a lot of rebuilds during development.
|
2018-02-06 12:59:06 +01:00
|
|
|
# Note: If this attribute is not explicitly set (e.g. if left commented out) it
|
2017-08-16 03:26:29 +02:00
|
|
|
# will default to true if channel = "dev", but will default to false otherwise.
|
|
|
|
#ignore-git = true
|
2017-08-03 18:53:56 +02:00
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# When creating source tarballs whether or not to create a source tarball.
|
|
|
|
#dist-src = false
|
|
|
|
|
2017-08-28 16:54:50 +02:00
|
|
|
# Whether to also run the Miri tests suite when running tests.
|
|
|
|
# As a side-effect also generates MIR for all libraries.
|
|
|
|
#test-miri = false
|
|
|
|
|
2017-11-30 11:18:47 +01:00
|
|
|
# After building or testing extended tools (e.g. clippy and rustfmt), append the
|
|
|
|
# result (broken, compiling, testing) into this JSON file.
|
|
|
|
#save-toolstates = "/path/to/toolstates.json"
|
|
|
|
|
rustc: Split Emscripten to a separate codegen backend
This commit introduces a separately compiled backend for Emscripten, avoiding
compiling the `JSBackend` target in the main LLVM codegen backend. This builds
on the foundation provided by #47671 to create a new codegen backend dedicated
solely to Emscripten, removing the `JSBackend` of the main codegen backend in
the process.
A new field was added to each target for this commit which specifies the backend
to use for translation, the default being `llvm` which is the main backend that
we use. The Emscripten targets specify an `emscripten` backend instead of the
main `llvm` one.
There's a whole bunch of consequences of this change, but I'll try to enumerate
them here:
* A *second* LLVM submodule was added in this commit. The main LLVM submodule
will soon start to drift from the Emscripten submodule, but currently they're
both at the same revision.
* Logic was added to rustbuild to *not* build the Emscripten backend by default.
This is gated behind a `--enable-emscripten` flag to the configure script. By
default users should neither check out the emscripten submodule nor compile
it.
* The `init_repo.sh` script was updated to fetch the Emscripten submodule from
GitHub the same way we do the main LLVM submodule (a tarball fetch).
* The Emscripten backend, turned off by default, is still turned on for a number
of targets on CI. We'll only be shipping an Emscripten backend with Tier 1
platforms, though. All cross-compiled platforms will not be receiving an
Emscripten backend yet.
This commit means that when you download the `rustc` package in Rustup for Tier
1 platforms you'll be receiving two trans backends, one for Emscripten and one
that's the general LLVM backend. If you never compile for Emscripten you'll
never use the Emscripten backend, so we may update this one day to only download
the Emscripten backend when you add the Emscripten target. For now though it's
just an extra 10MB gzip'd.
Closes #46819
2018-01-24 17:22:34 +01:00
|
|
|
# This is an array of the codegen backends that will be compiled for the rustc
|
|
|
|
# that's being compiled. The default is to only build the LLVM codegen backend,
|
|
|
|
# but you can also optionally enable the "emscripten" backend for asm.js or
|
|
|
|
# make this an empty array (but that probably won't get too far in the
|
|
|
|
# bootstrap)
|
|
|
|
#codegen-backends = ["llvm"]
|
|
|
|
|
2018-03-02 09:19:50 +01:00
|
|
|
# This is the name of the directory in which codegen backends will get installed
|
|
|
|
#codegen-backends-dir = "codegen-backends"
|
|
|
|
|
2018-02-06 12:59:06 +01:00
|
|
|
# Flag indicating whether `libstd` calls an imported function to handle basic IO
|
|
|
|
# when targeting WebAssembly. Enable this to debug tests for the `wasm32-unknown-unknown`
|
2018-01-11 18:51:49 +01:00
|
|
|
# target, as without this option the test output will not be captured.
|
|
|
|
#wasm-syscall = false
|
|
|
|
|
rust: Import LLD for linking wasm objects
This commit imports the LLD project from LLVM to serve as the default linker for
the `wasm32-unknown-unknown` target. The `binaryen` submoule is consequently
removed along with "binaryen linker" support in rustc.
Moving to LLD brings with it a number of benefits for wasm code:
* LLD is itself an actual linker, so there's no need to compile all wasm code
with LTO any more. As a result builds should be *much* speedier as LTO is no
longer forcibly enabled for all builds of the wasm target.
* LLD is quickly becoming an "official solution" for linking wasm code together.
This, I believe at least, is intended to be the main supported linker for
native code and wasm moving forward. Picking up support early on should help
ensure that we can help LLD identify bugs and otherwise prove that it works
great for all our use cases!
* Improvements to the wasm toolchain are currently primarily focused around LLVM
and LLD (from what I can tell at least), so it's in general much better to be
on this bandwagon for bugfixes and new features.
* Historical "hacks" like `wasm-gc` will soon no longer be necessary, LLD
will [natively implement][gc] `--gc-sections` (better than `wasm-gc`!) which
means a postprocessor is no longer needed to show off Rust's "small wasm
binary size".
LLD is added in a pretty standard way to rustc right now. A new rustbuild target
was defined for building LLD, and this is executed when a compiler's sysroot is
being assembled. LLD is compiled against the LLVM that we've got in tree, which
means we're currently on the `release_60` branch, but this may get upgraded in
the near future!
LLD is placed into rustc's sysroot in a `bin` directory. This is similar to
where `gcc.exe` can be found on Windows. This directory is automatically added
to `PATH` whenever rustc executes the linker, allowing us to define a `WasmLd`
linker which implements the interface that `wasm-ld`, LLD's frontend, expects.
Like Emscripten the LLD target is currently only enabled for Tier 1 platforms,
notably OSX/Windows/Linux, and will need to be installed manually for compiling
to wasm on other platforms. LLD is by default turned off in rustbuild, and
requires a `config.toml` option to be enabled to turn it on.
Finally the unstable `#![wasm_import_memory]` attribute was also removed as LLD
has a native option for controlling this.
[gc]: https://reviews.llvm.org/D42511
2017-08-27 03:30:12 +02:00
|
|
|
# Indicates whether LLD will be compiled and made available in the sysroot for
|
|
|
|
# rustc to execute.
|
|
|
|
#lld = false
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# =============================================================================
|
|
|
|
# Options for specific targets
|
|
|
|
#
|
|
|
|
# Each of the following options is scoped to the specific target triple in
|
|
|
|
# question and is used for determining how to compile each target.
|
|
|
|
# =============================================================================
|
|
|
|
[target.x86_64-unknown-linux-gnu]
|
|
|
|
|
2017-10-10 22:06:22 +02:00
|
|
|
# C compiler to be used to compiler C code. Note that the
|
2016-05-03 00:16:15 +02:00
|
|
|
# default value is platform specific, and if not specified it may also depend on
|
|
|
|
# what platform is crossing to what platform.
|
|
|
|
#cc = "cc"
|
|
|
|
|
|
|
|
# C++ compiler to be used to compiler C++ code (e.g. LLVM and our LLVM shims).
|
|
|
|
# This is only used for host targets.
|
|
|
|
#cxx = "c++"
|
|
|
|
|
2017-10-10 22:06:22 +02:00
|
|
|
# Archiver to be used to assemble static libraries compiled from C/C++ code.
|
|
|
|
# Note: an absolute path should be used, otherwise LLVM build will break.
|
|
|
|
#ar = "ar"
|
|
|
|
|
|
|
|
# Linker to be used to link Rust code. Note that the
|
|
|
|
# default value is platform specific, and if not specified it may also depend on
|
|
|
|
# what platform is crossing to what platform.
|
|
|
|
#linker = "cc"
|
|
|
|
|
2016-05-03 00:16:15 +02:00
|
|
|
# Path to the `llvm-config` binary of the installation of a custom LLVM to link
|
2018-02-06 12:59:06 +01:00
|
|
|
# against. Note that if this is specified we don't compile LLVM at all for this
|
2016-05-03 00:16:15 +02:00
|
|
|
# target.
|
|
|
|
#llvm-config = "../path/to/llvm/root/bin/llvm-config"
|
|
|
|
|
|
|
|
# Path to the custom jemalloc static library to link into the standard library
|
|
|
|
# by default. This is only used if jemalloc is still enabled above
|
|
|
|
#jemalloc = "/path/to/jemalloc/libjemalloc_pic.a"
|
|
|
|
|
|
|
|
# If this target is for Android, this option will be required to specify where
|
|
|
|
# the NDK for the target lives. This is used to find the C compiler to link and
|
|
|
|
# build native code.
|
|
|
|
#android-ndk = "/path/to/ndk"
|
2016-09-07 04:49:02 +02:00
|
|
|
|
2017-08-22 23:24:29 +02:00
|
|
|
# Force static or dynamic linkage of the standard library for this target. If
|
|
|
|
# this target is a host for rustc, this will also affect the linkage of the
|
|
|
|
# compiler itself. This is useful for building rustc on targets that normally
|
|
|
|
# only use static libraries. If unset, the target's default linkage is used.
|
|
|
|
#crt-static = false
|
|
|
|
|
2016-09-07 04:49:02 +02:00
|
|
|
# The root location of the MUSL installation directory. The library directory
|
|
|
|
# will also need to contain libunwind.a for an unwinding implementation. Note
|
|
|
|
# that this option only makes sense for MUSL targets that produce statically
|
|
|
|
# linked binaries
|
|
|
|
#musl-root = "..."
|
2017-01-24 23:37:04 +01:00
|
|
|
|
2017-08-27 00:01:48 +02:00
|
|
|
# Used in testing for configuring where the QEMU images are located, you
|
|
|
|
# probably don't want to use this.
|
|
|
|
#qemu-rootfs = "..."
|
|
|
|
|
2017-01-24 23:37:04 +01:00
|
|
|
# =============================================================================
|
|
|
|
# Distribution options
|
|
|
|
#
|
|
|
|
# These options are related to distribution, mostly for the Rust project itself.
|
|
|
|
# You probably won't need to concern yourself with any of these options
|
|
|
|
# =============================================================================
|
|
|
|
[dist]
|
|
|
|
|
|
|
|
# This is the folder of artifacts that the build system will sign. All files in
|
|
|
|
# this directory will be signed with the default gpg key using the system `gpg`
|
|
|
|
# binary. The `asc` and `sha256` files will all be output into the standard dist
|
|
|
|
# output folder (currently `build/dist`)
|
|
|
|
#
|
|
|
|
# This folder should be populated ahead of time before the build system is
|
|
|
|
# invoked.
|
|
|
|
#sign-folder = "path/to/folder/to/sign"
|
|
|
|
|
|
|
|
# This is a file which contains the password of the default gpg key. This will
|
|
|
|
# be passed to `gpg` down the road when signing all files in `sign-folder`
|
|
|
|
# above. This should be stored in plaintext.
|
|
|
|
#gpg-password-file = "path/to/gpg/password"
|
|
|
|
|
|
|
|
# The remote address that all artifacts will eventually be uploaded to. The
|
|
|
|
# build system generates manifests which will point to these urls, and for the
|
|
|
|
# manifests to be correct they'll have to have the right URLs encoded.
|
|
|
|
#
|
|
|
|
# Note that this address should not contain a trailing slash as file names will
|
|
|
|
# be appended to it.
|
|
|
|
#upload-addr = "https://example.com/folder"
|
2017-05-18 22:48:14 +02:00
|
|
|
|
|
|
|
# Whether to build a plain source tarball to upload
|
|
|
|
# We disable that on Windows not to override the one already uploaded on S3
|
|
|
|
# as the one built on Windows will contain backslashes in paths causing problems
|
|
|
|
# on linux
|
|
|
|
#src-tarball = true
|