bootstrap

Struct Build

source
pub struct Build {
Show 34 fields pub(crate) config: Config, pub(crate) version: String, pub(crate) src: PathBuf, pub(crate) out: PathBuf, pub(crate) bootstrap_out: PathBuf, pub(crate) cargo_info: GitInfo, pub(crate) rust_analyzer_info: GitInfo, pub(crate) clippy_info: GitInfo, pub(crate) miri_info: GitInfo, pub(crate) rustfmt_info: GitInfo, pub(crate) enzyme_info: GitInfo, pub(crate) in_tree_llvm_info: GitInfo, pub(crate) in_tree_gcc_info: GitInfo, pub(crate) local_rebuild: bool, pub(crate) fail_fast: bool, pub(crate) doc_tests: DocTests, pub(crate) verbosity: usize, pub(crate) build: TargetSelection, pub(crate) hosts: Vec<TargetSelection>, pub(crate) targets: Vec<TargetSelection>, pub(crate) initial_rustc: PathBuf, pub(crate) initial_cargo: PathBuf, pub(crate) initial_lld: PathBuf, pub(crate) initial_libdir: PathBuf, pub(crate) initial_sysroot: PathBuf, pub(crate) cc: RefCell<HashMap<TargetSelection, Tool>>, pub(crate) cxx: RefCell<HashMap<TargetSelection, Tool>>, pub(crate) ar: RefCell<HashMap<TargetSelection, PathBuf>>, pub(crate) ranlib: RefCell<HashMap<TargetSelection, PathBuf>>, pub(crate) crates: HashMap<String, Crate>, pub(crate) crate_paths: HashMap<PathBuf, String>, pub(crate) is_sudo: bool, pub(crate) delayed_failures: RefCell<Vec<String>>, pub(crate) prerelease_version: Cell<Option<u32>>,
}
Expand description

Global configuration for the build system.

This structure transitively contains all configuration for the build system. All filesystem-encoded configuration is in config, all flags are in flags, and then parsed or probed information is listed in the keys below.

This structure is a parameter of almost all methods in the build system, although most functions are implemented as free functions rather than methods specifically on this structure itself (to make it easier to organize).

Fields§

§config: Config

User-specified configuration from config.toml.

§version: String§src: PathBuf§out: PathBuf§bootstrap_out: PathBuf§cargo_info: GitInfo§rust_analyzer_info: GitInfo§clippy_info: GitInfo§miri_info: GitInfo§rustfmt_info: GitInfo§enzyme_info: GitInfo§in_tree_llvm_info: GitInfo§in_tree_gcc_info: GitInfo§local_rebuild: bool§fail_fast: bool§doc_tests: DocTests§verbosity: usize§build: TargetSelection

Build triple for the pre-compiled snapshot compiler.

§hosts: Vec<TargetSelection>

Which triples to produce a compiler toolchain for.

§targets: Vec<TargetSelection>

Which triples to build libraries (core/alloc/std/test/proc_macro) for.

§initial_rustc: PathBuf§initial_cargo: PathBuf§initial_lld: PathBuf§initial_libdir: PathBuf§initial_sysroot: PathBuf§cc: RefCell<HashMap<TargetSelection, Tool>>§cxx: RefCell<HashMap<TargetSelection, Tool>>§ar: RefCell<HashMap<TargetSelection, PathBuf>>§ranlib: RefCell<HashMap<TargetSelection, PathBuf>>§crates: HashMap<String, Crate>§crate_paths: HashMap<PathBuf, String>§is_sudo: bool§delayed_failures: RefCell<Vec<String>>§prerelease_version: Cell<Option<u32>>

Implementations§

source§

impl Build

source

pub(crate) fn verbose(&self, f: impl Fn())

source

pub(crate) fn is_verbose(&self) -> bool

source

pub(crate) fn create(&self, path: &Path, s: &str)

source

pub(crate) fn remove(&self, f: &Path)

source

pub(crate) fn tempdir(&self) -> PathBuf

source

pub(crate) fn download_rustc(&self) -> bool

source

pub(crate) fn initial_rustfmt(&self) -> Option<PathBuf>

source§

impl Build

source

pub fn new(config: Config) -> Build

Creates a new set of build configuration from the flags on the command line and the filesystem config.

By default all build output will be placed in the current directory.

source

pub fn require_submodule(&self, submodule: &str, err_hint: Option<&str>)

Updates a submodule, and exits with a failure if submodule management is disabled and the submodule does not exist.

The given submodule name should be its path relative to the root of the main repository.

The given err_hint will be shown to the user if the submodule is not checked out and submodule management is disabled.

source

pub fn require_and_update_all_submodules(&self)

Updates all submodules, and exits with an error if submodule management is disabled and the submodule does not exist.

source

pub(crate) fn update_existing_submodules(&self)

If any submodule has been initialized already, sync it unconditionally. This avoids contributors checking in a submodule change by accident.

source

pub fn update_existing_submodule(&self, submodule: &str)

Updates the given submodule only if it’s initialized already; nothing happens otherwise.

source

pub fn build(&mut self)

Executes the entire build, as configured by the flags and configuration.

source

pub(crate) fn clear_if_dirty(&self, dir: &Path, input: &Path) -> bool

Clear out dir if input is newer.

After this executes, it will also ensure that dir exists.

source

pub(crate) fn rust_info(&self) -> &GitInfo

source

pub(crate) fn std_features(&self, target: TargetSelection) -> String

Gets the space-separated set of activated features for the standard library. This can be configured with the std-features key in config.toml.

source

pub(crate) fn rustc_features( &self, kind: Kind, target: TargetSelection, crates: &[String], ) -> String

Gets the space-separated set of activated features for the compiler.

source

pub(crate) fn cargo_dir(&self) -> &'static str

Component directory that Cargo will produce output into (e.g. release/debug)

source

pub(crate) fn tools_dir(&self, compiler: Compiler) -> PathBuf

source

pub(crate) fn stage_out(&self, compiler: Compiler, mode: Mode) -> PathBuf

Returns the root directory for all output generated in a particular stage when running with a particular host compiler.

The mode indicates what the root directory is for.

source

pub(crate) fn cargo_out( &self, compiler: Compiler, mode: Mode, target: TargetSelection, ) -> PathBuf

Returns the root output directory for all Cargo output in a given stage, running a particular compiler, whether or not we’re building the standard library, and targeting the specified architecture.

source

pub(crate) fn llvm_out(&self, target: TargetSelection) -> PathBuf

Root output directory of LLVM for target

Note that if LLVM is configured externally then the directory returned will likely be empty.

source

pub(crate) fn enzyme_out(&self, target: TargetSelection) -> PathBuf

source

pub(crate) fn gcc_out(&self, target: TargetSelection) -> PathBuf

source

pub(crate) fn lld_out(&self, target: TargetSelection) -> PathBuf

source

pub(crate) fn doc_out(&self, target: TargetSelection) -> PathBuf

Output directory for all documentation for a target

source

pub(crate) fn json_doc_out(&self, target: TargetSelection) -> PathBuf

Output directory for all JSON-formatted documentation for a target

source

pub(crate) fn test_out(&self, target: TargetSelection) -> PathBuf

source

pub(crate) fn compiler_doc_out(&self, target: TargetSelection) -> PathBuf

Output directory for all documentation for a target

source

pub(crate) fn md_doc_out(&self, target: TargetSelection) -> PathBuf

Output directory for some generated md crate documentation for a target (temporary)

source

pub(crate) fn is_system_llvm(&self, target: TargetSelection) -> bool

Returns true if this is an external version of LLVM not managed by bootstrap. In particular, we expect llvm sources to be available when this is false.

NOTE: this is not the same as !is_rust_llvm when llvm_has_patches is set.

source

pub(crate) fn is_rust_llvm(&self, target: TargetSelection) -> bool

Returns true if this is our custom, patched, version of LLVM.

This does not necessarily imply that we’re managing the llvm-project submodule.

source

pub(crate) fn llvm_filecheck(&self, target: TargetSelection) -> PathBuf

Returns the path to FileCheck binary for the specified target

source

pub(crate) fn native_dir(&self, target: TargetSelection) -> PathBuf

Directory for libraries built from C/C++ code and shared between stages.

source

pub(crate) fn test_helpers_out(&self, target: TargetSelection) -> PathBuf

Root output directory for rust_test_helpers library compiled for target

source

pub(crate) fn add_rust_test_threads(&self, cmd: &mut BootstrapCommand)

Adds the RUST_TEST_THREADS env var if necessary

source

pub(crate) fn rustc_snapshot_libdir(&self) -> PathBuf

Returns the libdir of the snapshot compiler.

source

pub(crate) fn rustc_snapshot_sysroot(&self) -> &Path

Returns the sysroot of the snapshot compiler.

source

pub(crate) fn run( &self, command: &mut BootstrapCommand, stdout: OutputMode, stderr: OutputMode, ) -> CommandOutput

Execute a command and return its output. Note: Ideally, you should use one of the BootstrapCommand::run* functions to execute commands. They internally call this method.

source

pub fn is_verbose_than(&self, level: usize) -> bool

Check if verbosity is greater than the level

source

pub(crate) fn verbose_than(&self, level: usize, f: impl Fn())

Runs a function if verbosity is greater than level.

source

pub(crate) fn info(&self, msg: &str)

source

pub(crate) fn msg_clippy( &self, what: impl Display, target: impl Into<Option<TargetSelection>>, ) -> Option<Group>

source

pub(crate) fn msg_check( &self, what: impl Display, target: impl Into<Option<TargetSelection>>, ) -> Option<Group>

source

pub(crate) fn msg_doc( &self, compiler: Compiler, what: impl Display, target: impl Into<Option<TargetSelection>> + Copy, ) -> Option<Group>

source

pub(crate) fn msg_build( &self, compiler: Compiler, what: impl Display, target: impl Into<Option<TargetSelection>>, ) -> Option<Group>

source

pub(crate) fn msg( &self, action: impl Into<Kind>, stage: u32, what: impl Display, host: impl Into<Option<TargetSelection>>, target: impl Into<Option<TargetSelection>>, ) -> Option<Group>

Return a Group guard for a Step that is built for each --stage.

source

pub(crate) fn msg_unstaged( &self, action: impl Into<Kind>, what: impl Display, target: TargetSelection, ) -> Option<Group>

Return a Group guard for a Step that is only built once and isn’t affected by --stage.

source

pub(crate) fn msg_sysroot_tool( &self, action: impl Into<Kind>, stage: u32, what: impl Display, host: TargetSelection, target: TargetSelection, ) -> Option<Group>

source

pub(crate) fn group(&self, msg: &str) -> Option<Group>

source

pub(crate) fn jobs(&self) -> u32

Returns the number of parallel jobs that have been configured for this build.

source

pub(crate) fn debuginfo_map_to(&self, which: GitRepo) -> Option<String>

source

pub(crate) fn cc(&self, target: TargetSelection) -> PathBuf

Returns the path to the C compiler for the target specified.

source

pub(crate) fn cflags( &self, target: TargetSelection, which: GitRepo, c: CLang, ) -> Vec<String>

Returns a list of flags to pass to the C compiler for the target specified.

source

pub(crate) fn ar(&self, target: TargetSelection) -> Option<PathBuf>

Returns the path to the ar archive utility for the target specified.

source

pub(crate) fn ranlib(&self, target: TargetSelection) -> Option<PathBuf>

Returns the path to the ranlib utility for the target specified.

source

pub(crate) fn cxx(&self, target: TargetSelection) -> Result<PathBuf, String>

Returns the path to the C++ compiler for the target specified.

source

pub(crate) fn linker(&self, target: TargetSelection) -> Option<PathBuf>

Returns the path to the linker for the given target if it needs to be overridden.

source

pub(crate) fn is_lld_direct_linker(&self, target: TargetSelection) -> bool

source

pub(crate) fn crt_static(&self, target: TargetSelection) -> Option<bool>

Returns if this target should statically link the C runtime, if specified

source

pub(crate) fn musl_root(&self, target: TargetSelection) -> Option<&Path>

Returns the “musl root” for this target, if defined

source

pub(crate) fn musl_libdir(&self, target: TargetSelection) -> Option<PathBuf>

Returns the “musl libdir” for this target.

source

pub(crate) fn wasi_libdir(&self, target: TargetSelection) -> Option<PathBuf>

Returns the lib directory for the WASI target specified, if configured.

This first consults wasi-root as configured in per-target configuration, and failing that it assumes that $WASI_SDK_PATH is set in the environment, and failing that None is returned.

source

pub(crate) fn no_std(&self, target: TargetSelection) -> Option<bool>

Returns true if this is a no-std target, if defined

source

pub(crate) fn remote_tested(&self, target: TargetSelection) -> bool

Returns true if the target will be tested using the remote-test-client and remote-test-server binaries.

source

pub(crate) fn runner(&self, target: TargetSelection) -> Option<String>

Returns an optional “runner” to pass to compiletest when executing test binaries.

An example of this would be a WebAssembly runtime when testing the wasm targets.

source

pub(crate) fn default_wasi_runner( &self, target: TargetSelection, ) -> Option<String>

When a runner configuration is not provided and a WASI-looking target is being tested this is consulted to prove the environment to see if there’s a runtime already lying around that seems reasonable to use.

source

pub(crate) fn tool_enabled(&self, tool: &str) -> bool

Returns whether the specified tool is configured as part of this build.

This requires that both the extended key is set and the tools key is either unset or specifically contains the specified tool.

source

pub(crate) fn qemu_rootfs(&self, target: TargetSelection) -> Option<&Path>

Returns the root of the “rootfs” image that this target will be using, if one was configured.

If Some is returned then that means that tests for this target are emulated with QEMU and binaries will need to be shipped to the emulator.

source

pub(crate) fn python(&self) -> &Path

Path to the python interpreter to use

source

pub(crate) fn extended_error_dir(&self) -> PathBuf

Temporary directory that extended error information is emitted to.

source

pub(crate) fn force_use_stage1( &self, stage: u32, target: TargetSelection, ) -> bool

Tests whether the compiler compiling for target should be forced to use a stage1 compiler instead.

Currently, by default, the build system does not perform a “full bootstrap” by default where we compile the compiler three times. Instead, we compile the compiler two times. The final stage (stage2) just copies the libraries from the previous stage, which is what this method detects.

Here we return true if:

  • The build isn’t performing a full bootstrap
  • The compiler is in the final stage, 2
  • We’re not cross-compiling, so the artifacts are already available in stage1

When all of these conditions are met the build will lift artifacts from the previous stage forward.

source

pub(crate) fn force_use_stage2(&self, stage: u32) -> bool

Checks whether the compiler compiling for target should be forced to use a stage2 compiler instead.

When we download the pre-compiled version of rustc and compiler stage is >= 2, it should be forced to use a stage2 compiler.

source

pub(crate) fn release(&self, num: &str) -> String

Given num in the form “a.b.c” return a “release string” which describes the release version number.

For example on nightly this returns “a.b.c-nightly”, on beta it returns “a.b.c-beta.1” and on stable it just returns “a.b.c”.

source

pub(crate) fn beta_prerelease_version(&self) -> u32

source

pub(crate) fn rust_release(&self) -> String

Returns the value of release above for Rust itself.

source

pub(crate) fn package_vers(&self, num: &str) -> String

Returns the “package version” for a component given the num release number.

The package version is typically what shows up in the names of tarballs. For channels like beta/nightly it’s just the channel name, otherwise it’s the num provided.

source

pub(crate) fn rust_package_vers(&self) -> String

Returns the value of package_vers above for Rust itself.

source

pub(crate) fn rust_version(&self) -> String

Returns the version string associated with this compiler for Rust itself.

Note that this is a descriptive string which includes the commit date, sha, version, etc.

source

pub(crate) fn rust_sha(&self) -> Option<&str>

Returns the full commit hash.

source

pub(crate) fn release_num(&self, package: &str) -> String

Returns the a.b.c version that the given package is at.

source

pub(crate) fn unstable_features(&self) -> bool

Returns true if unstable features should be enabled for the compiler we’re building.

source

pub(crate) fn in_tree_crates( &self, root: &str, target: Option<TargetSelection>, ) -> Vec<&Crate>

Returns a Vec of all the dependencies of the given root crate, including transitive dependencies and the root itself. Only includes “local” crates (those in the local source tree, not from a registry).

source

pub(crate) fn read_stamp_file( &self, stamp: &Path, ) -> Vec<(PathBuf, DependencyType)>

Links a file from src to dst. Attempts to use hard links if possible, falling back to copying. You can neither rely on this being a copy nor it being a link, so do not write to dst.

Links the src directory recursively to dst. Both are assumed to exist when this function is called. Will attempt to use hard links if possible and fall back to copying.

Copies the src directory recursively to dst. Both are assumed to exist when this function is called. Will attempt to use hard links if possible and fall back to copying. Unwanted files or directories can be skipped by returning false from the filter function.

source

pub(crate) fn install(&self, src: &Path, dstdir: &Path, perms: u32)

source

pub(crate) fn read(&self, path: &Path) -> String

source

pub(crate) fn create_dir(&self, dir: &Path)

source

pub(crate) fn remove_dir(&self, dir: &Path)

source

pub(crate) fn read_dir(&self, dir: &Path) -> impl Iterator<Item = DirEntry>

source

pub(crate) fn ninja(&self) -> bool

Returns if config.ninja is enabled, and checks for ninja existence, exiting with a nicer error message if not.

source

pub fn colored_stdout<R, F: FnOnce(&mut dyn WriteColor) -> R>(&self, f: F) -> R

source

pub fn colored_stderr<R, F: FnOnce(&mut dyn WriteColor) -> R>(&self, f: F) -> R

source

pub(crate) fn colored_stream_inner<R, F, C>( &self, constructor: C, is_tty: bool, f: F, ) -> R
where C: Fn(ColorChoice) -> StandardStream, F: FnOnce(&mut dyn WriteColor) -> R,

Trait Implementations§

source§

impl Clone for Build

source§

fn clone(&self) -> Build

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl !Freeze for Build

§

impl !RefUnwindSafe for Build

§

impl Send for Build

§

impl !Sync for Build

§

impl Unpin for Build

§

impl UnwindSafe for Build

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 4216 bytes