blob: 1db891c78f62a931708b1df240479874b9ef1656 [file] [log] [blame] [view]
# The Rust Language Reference
This document is the primary reference for the Rust programming language.
## Contributor docs
There are several pages for those working on the reference:
* [Authoring guide](https://github.com/rust-lang/reference/blob/master/docs/authoring.md): Guidelines for writing content.
* [Review policy](https://github.com/rust-lang/reference/blob/master/docs/review-policy.md): Guidelines for reviewers.
* [Grammar](https://github.com/rust-lang/reference/blob/master/docs/grammar.md): How the grammar syntax works.
* [Attribute template](https://github.com/rust-lang/reference/blob/master/docs/attribute-template.md): The standard template for documenting an attribute.
## Building
To build the Reference, first clone the project:
```sh
git clone https://github.com/rust-lang/reference.git
cd reference
```
(Alternatively, if you don't want to use `git`, [download][] a ZIP file
of the project, extract it using your preferred tool, and rename the
top-level directory to `reference`.)
[download]: https://github.com/rust-lang/reference/archive/refs/heads/master.zip
### Installing mdbook
The Reference is built using [mdbook].
First, ensure that you have a recent copy of the nightly Rust compiler installed, as this is needed in order to run the tests:
```sh
rustup toolchain install nightly
rustup override set nightly
```
Now, ensure you have `mdbook` installed, as this is needed in order to build the Reference:
```sh
cargo install --locked mdbook
```
[mdbook]: https://rust-lang.github.io/mdBook/
### Running mdbook
`mdbook` provides a variety of different commands and options to help you work on the book:
* `mdbook build --open`: Build the book and open it in a web browser.
* `mdbook serve --open`: Launches a web server on localhost. It also automatically rebuilds the book whenever any file changes and automatically reloads your web browser.
The book contents are driven by a `SUMMARY.md` file, and every file must be linked there. See <https://rust-lang.github.io/mdBook/> for its usage.
### `SPEC_RELATIVE`
The `SPEC_RELATIVE=0` environment variable makes links to the standard library go to <https://doc.rust-lang.org/> instead of being relative, which is useful when viewing locally since you normally don't have a copy of the standard library.
```sh
SPEC_RELATIVE=0 mdbook serve --open
```
The published site at <https://doc.rust-lang.org/reference/> (or local docs using `rustup doc`) does not set this, which means it will use relative links which supports offline viewing and links to the correct version (for example, links in <https://doc.rust-lang.org/1.81.0/reference/> will stay within the 1.81.0 directory).
### `SPEC_DENY_WARNINGS`
The `SPEC_DENY_WARNINGS=1` environment variable will turn all warnings generated by `mdbook-spec` to errors. This is used in CI to ensure that there aren't any problems with the book content.
### `SPEC_RUST_ROOT`
The `SPEC_RUST_ROOT` can be used to point to the directory of a checkout of <https://github.com/rust-lang/rust>. This is used by the test-linking feature so that it can find tests linked to reference rules. If this is not set, then the tests won't be linked.
## Running tests
There are several different kinds of tests you can run (these are enforced on CI):
* `mdbook test`: This will run the inline Rust codeblocks (internally it uses `rustdoc` to do this).
* `cargo xtask style-check`: This will validate some style checks (see [authoring guide](docs/authoring.md)).
* `cargo xtask linkcheck`: This will validate that markdown links aren't broken.
* `cargo xtask test-all`: Runs all tests.
## How is this published?
The process for getting the reference content into a [Rust release](https://doc.rust-lang.org/reference/#rust-releases) and on the website is:
1. Changes are merged to this repository.
2. [Triagebot](https://forge.rust-lang.org/triagebot/doc-updates.html) will automatically synchronize this repository to [rust-lang/rust]. This happens every other week. The reference is tracked in [rust-lang/rust] as a [submodule](https://github.com/rust-lang/rust/tree/master/src/doc).
- This will open a PR on [rust-lang/rust] which needs to be merged, and that can take up to several days.
3. At midnight UTC, whatever is on the default branch of [rust-lang/rust] will be a part of that nightly release, and will be published after a few hours to <https://doc.rust-lang.org/nightly/reference/>.
4. Following Rust's [release process](https://doc.rust-lang.org/book/appendix-07-nightly-rust.html), every 6 weeks, nightly will be promoted to beta (<https://doc.rust-lang.org/beta/reference/>), and then 6 weeks after that it will be promoted to stable (<https://doc.rust-lang.org/stable/reference/>).
[rust-lang/rust]: https://github.com/rust-lang/rust/