Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,43 @@ We encourage new contributors to join our communication channels and introduce t

## Understanding Core Concepts



### Sysroot & compilation flags

#### What *is* the sysroot?
The **sysroot** is the directory that stores the compiled standard
library (`core`, `alloc`, `std`, `test`, …) and compiler built-ins.
Rustup ships these libraries **pre-compiled with LLVM**.

**rustc_codegen_gcc** replaces LLVM with the GCC backend.

The freshly compiled sysroot ends up in
`build/build_sysroot/...`.

A rebuild of sysroot is needed when

* the backend changes in a way that affects code generation, or
* the user switches toolchains / updates submodules.

Both backend and sysroot can be built using different [profiles](https://doc.rust-lang.org/cargo/reference/profiles.html#default-profiles).
That is exactly what the `--sysroot`, `--release-sysroot` and `--release` flag supported by the build system script `y.sh` take care of.


#### Typical flag combinations

| Command | Backend Profile | Sysroot Profile | Usage Scenario |
|--------------------------------------------|-------------------------------|----------------------------------|------------------------------------------------------------|
| `./y.sh build` |  dev (optimized + debuginfo) |  X |  Build backend in dev. mode with optimized dependencies without rebuilding sysroot |
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you please remove the . (dot) at the end of dev. here and in other places? I find it a bit confusing.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you write "dev (optimized + debuginfo)" because this is what cargo shows and does it show it because the dependencies are compiled in release mode?
I wonder if this will cause confusion to people: what do you think?
Perhaps we should only write "dev"?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another idea could be to specify in a footnote that only the dependencies are compiled with optimizations.

| `./y.sh build --release` |  release (optimized) |  X |  Build backend in release mode with optimized dependencies without rebuilding sysroot |
| `./y.sh build --release --sysroot` |  release (optimized) |  dev (unoptimized + debuginfo) |  Build backend in release mode with optimized dependencies and sysroot in dev. mode (unoptimized) |
| `./y.sh build --sysroot` |  dev (optimized + debuginfo) |  dev (unoptimized + debuginfo) |  Build backend in dev. mode with optimized dependencies and sysroot in dev. mode (unoptimized) |
| `./y.sh build --release-sysroot --sysroot`|  dev (optimized + debuginfo) |  release (optimized) |  Build backend in dev. mode and sysroot in release mode, both with optimized dependencies |


Note: `--release-sysroot` should not be used without `--sysroot`.


### Common Development Tasks

#### Running Specific Tests
Expand Down
12 changes: 10 additions & 2 deletions build_system/src/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,16 @@ impl BuildArg {
println!(
r#"
`build` command help:

--sysroot : Build with sysroot"#
--release : Build backend in release mode with optimized dependencies without rebuilding sysroot
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This flag can also be used for ./y.sh test, so please move it back to config.rs.

--sysroot : When used on its own, build backend in dev. mode with optimized dependencies
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The flag --sysroot-panic-abort should also be documented here instead of in config.rs.

and sysroot in dev. mode (unoptimized)
When used together with --release, build backend in release mode with optimized dependencies
When used together with --release-sysroot,
build the sysroot in release mode with optimized dependencies instead of in dev. mode
--release-sysroot : When combined with --sysroot, additionally
build the sysroot in release mode with optimized dependencies.
When combined with --release, it has no effect.
It should not be used on its own."#
);
ConfigInfo::show_usage();
println!(" --help : Show this help");
Expand Down
5 changes: 1 addition & 4 deletions build_system/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -472,13 +472,10 @@ impl ConfigInfo {

pub fn show_usage() {
println!(
"\
--features [arg] : Add a new feature [arg]
" --features [arg] : Add a new feature [arg]
--target-triple [arg] : Set the target triple to [arg]
--target [arg] : Set the target to [arg]
--out-dir : Location where the files will be generated
--release : Build in release mode
--release-sysroot : Build sysroot in release mode
--sysroot-panic-abort : Build the sysroot without unwinding support
--config-file : Location of the config file to be used
--gcc-path : Location of the GCC root folder
Expand Down