| # Writing tools in Bootstrap | |
| There are three types of tools you can write in bootstrap: | |
| - **`Mode::ToolBootstrap`** | |
| Use this for tools that don’t need anything from the in-tree compiler and can run with the stage0 `rustc`. | |
| The output is placed in the "bootstrap-tools" directory. | |
| This mode is for general-purpose tools built entirely with the stage0 compiler, | |
| including target libraries, and it only works for stage 0. | |
| - **`Mode::ToolStd`** | |
| Use this for tools that rely on the locally built std. | |
| The output goes into the "stageN-tools" directory. | |
| This mode is rarely used, mainly for `compiletest` which requires `libtest`. | |
| - **`Mode::ToolRustcPrivate`** | |
| Use this for tools that use the `rustc_private` mechanism, | |
| and thus depend on the locally built `rustc` and its rlib artifacts. | |
| This is more complex than the other modes, | |
| because the tool must be built with the same compiler used for `rustc`, | |
| and placed in the "stageN-tools" directory. | |
| When you choose `Mode::ToolRustcPrivate`, | |
| `ToolBuild` implementation takes care of this automatically. | |
| If you need to use the builder’s compiler for something specific, | |
| you can get it from `ToolBuildResult`, which is returned by the tool's [`Step`]. | |
| Regardless of the tool type, | |
| you must return `ToolBuildResult` from the tool’s [`Step`] implementation, | |
| and use `ToolBuild` inside it. | |
| [`Step`]: https://doc.rust-lang.org/nightly/nightly-rustc/bootstrap/core/builder/trait.Step.html |