Update cargo-vendor usage

This commit is contained in:
Eric Huss 2019-07-09 16:12:41 -07:00
parent 5d8ffb5b8b
commit 06c3256a6b
4 changed files with 72 additions and 96 deletions

View File

@ -179,7 +179,6 @@ Speaking of tests, Rust has a comprehensive test suite. More information about
it can be found [here][rctd]. it can be found [here][rctd].
### External Dependencies ### External Dependencies
[external-dependencies]: #external-dependencies
Currently building Rust will also build the following external projects: Currently building Rust will also build the following external projects:
@ -209,7 +208,6 @@ Breakage is not allowed in the beta and stable channels, and must be addressed
before the PR is merged. before the PR is merged.
#### Breaking Tools Built With The Compiler #### Breaking Tools Built With The Compiler
[breaking-tools-built-with-the-compiler]: #breaking-tools-built-with-the-compiler
Rust's build system builds a number of tools that make use of the Rust's build system builds a number of tools that make use of the
internals of the compiler. This includes internals of the compiler. This includes
@ -242,7 +240,7 @@ Here are those same steps in detail:
`config.toml.example` in the root directory of the Rust repository. `config.toml.example` in the root directory of the Rust repository.
Set `submodules = false` in the `[build]` section. This will prevent `x.py` Set `submodules = false` in the `[build]` section. This will prevent `x.py`
from resetting to the original branch after you make your changes. If you from resetting to the original branch after you make your changes. If you
need to [update any submodules to their latest versions][updating-submodules], need to [update any submodules to their latest versions](#updating-submodules),
see the section of this file about that for more information. see the section of this file about that for more information.
2. (optional) Run `./x.py test src/tools/rustfmt` (substituting the submodule 2. (optional) Run `./x.py test src/tools/rustfmt` (substituting the submodule
that broke for `rustfmt`). Fix any errors in the submodule (and possibly others). that broke for `rustfmt`). Fix any errors in the submodule (and possibly others).
@ -256,7 +254,6 @@ Here are those same steps in detail:
8. (optional) Send a PR to rust-lang/rust updating the submodule. 8. (optional) Send a PR to rust-lang/rust updating the submodule.
#### Updating submodules #### Updating submodules
[updating-submodules]: #updating-submodules
These instructions are specific to updating `rustfmt`, however they may apply These instructions are specific to updating `rustfmt`, however they may apply
to the other submodules as well. Please help by improving these instructions to the other submodules as well. Please help by improving these instructions
@ -310,7 +307,6 @@ This should change the version listed in `Cargo.lock` to the new version you upd
the submodule to. Running `./x.py build` should work now. the submodule to. Running `./x.py build` should work now.
## Writing Documentation ## Writing Documentation
[writing-documentation]: #writing-documentation
Documentation improvements are very welcome. The source of `doc.rust-lang.org` Documentation improvements are very welcome. The source of `doc.rust-lang.org`
is located in `src/doc` in the tree, and standard API documentation is generated is located in `src/doc` in the tree, and standard API documentation is generated
@ -337,7 +333,6 @@ tracker in that repo is also a great way to find things that need doing. There
are issues for beginners and advanced compiler devs alike! are issues for beginners and advanced compiler devs alike!
## Issue Triage ## Issue Triage
[issue-triage]: #issue-triage
Sometimes, an issue will stay open, even though the bug has been fixed. And Sometimes, an issue will stay open, even though the bug has been fixed. And
sometimes, the original bug may go stale because something has changed in the sometimes, the original bug may go stale because something has changed in the
@ -405,7 +400,6 @@ If you're looking for somewhere to start, check out the [E-easy][eeasy] tag.
[rfcbot]: https://github.com/anp/rfcbot-rs/ [rfcbot]: https://github.com/anp/rfcbot-rs/
## Out-of-tree Contributions ## Out-of-tree Contributions
[out-of-tree-contributions]: #out-of-tree-contributions
There are a number of other ways to contribute to Rust that don't deal with There are a number of other ways to contribute to Rust that don't deal with
this repository. this repository.
@ -425,7 +419,6 @@ valuable!
[community-library]: https://github.com/rust-lang/rfcs/labels/A-community-library [community-library]: https://github.com/rust-lang/rfcs/labels/A-community-library
## Helpful Links and Information ## Helpful Links and Information
[helpful-info]: #helpful-info
For people new to Rust, and just starting to contribute, or even for For people new to Rust, and just starting to contribute, or even for
more seasoned developers, some useful places to look for information more seasoned developers, some useful places to look for information

View File

@ -6,7 +6,6 @@ standard library, and documentation.
[Rust]: https://www.rust-lang.org [Rust]: https://www.rust-lang.org
## Quick Start ## Quick Start
[quick-start]: #quick-start
Read ["Installation"] from [The Book]. Read ["Installation"] from [The Book].
@ -14,11 +13,15 @@ Read ["Installation"] from [The Book].
[The Book]: https://doc.rust-lang.org/book/index.html [The Book]: https://doc.rust-lang.org/book/index.html
## Installing from Source ## Installing from Source
[building-from-source]: #building-from-source
_Note: If you wish to contribute to the compiler, you should read _Note: If you wish to contribute to the compiler, you should read [this
[this chapter](https://rust-lang.github.io/rustc-guide/how-to-build-and-run.html) chapter][rustcguidebuild] of the rustc-guide instead of this section._
of the rustc-guide instead of this section._
The Rust build system has a Python script called `x.py` to bootstrap building
the compiler. More information about it may be found by running `./x.py --help`
or reading the [rustc guide][rustcguidebuild].
[rustcguidebuild]: https://rust-lang.github.io/rustc-guide/how-to-build-and-run.html
### Building on *nix ### Building on *nix
1. Make sure you have installed the dependencies: 1. Make sure you have installed the dependencies:
@ -39,43 +42,36 @@ of the rustc-guide instead of this section._
[source]: https://github.com/rust-lang/rust [source]: https://github.com/rust-lang/rust
3. Build and install: 3. Configure the build settings:
The Rust build system uses a file named `config.toml` in the root of the
source tree to determine various configuration settings for the build.
Copy the default `config.toml.example` to `config.toml` to get started.
```sh ```sh
$ ./x.py build && sudo ./x.py install $ cp config.toml.example config.toml
``` ```
If after running `sudo ./x.py install` you see an error message like It is recommended that if you plan to use the Rust build system to create
an installation (using `./x.py install`) that you set the `prefix` value
in the `[install]` section to a directory that you have write permissions.
``` 4. Build and install:
error: failed to load source for a dependency on 'cc'
```sh
$ ./x.py build && ./x.py install
``` ```
then run these two commands and then try `sudo ./x.py install` again: When complete, `./x.py install` will place several programs into
`$PREFIX/bin`: `rustc`, the Rust compiler, and `rustdoc`, the
```
$ cargo install cargo-vendor
```
```
$ cargo vendor
```
> ***Note:*** Install locations can be adjusted by copying the config file
> from `./config.toml.example` to `./config.toml`, and
> adjusting the `prefix` option under `[install]`. Various other options, such
> as enabling debug information, are also supported, and are documented in
> the config file.
When complete, `sudo ./x.py install` will place several programs into
`/usr/local/bin`: `rustc`, the Rust compiler, and `rustdoc`, the
API-documentation tool. This install does not include [Cargo], API-documentation tool. This install does not include [Cargo],
Rust's package manager, which you may also want to build. Rust's package manager. To build and install Cargo, you may
run `./x.py install cargo` or set the `build.extended` key in
`config.toml` to `true` to build and install all tools.
[Cargo]: https://github.com/rust-lang/cargo [Cargo]: https://github.com/rust-lang/cargo
### Building on Windows ### Building on Windows
[building-on-windows]: #building-on-windows
There are two prominent ABIs in use on Windows: the native (MSVC) ABI used by There are two prominent ABIs in use on Windows: the native (MSVC) ABI used by
Visual Studio, and the GNU ABI used by the GCC toolchain. Which version of Rust Visual Studio, and the GNU ABI used by the GCC toolchain. Which version of Rust
@ -85,7 +81,6 @@ for interop with GNU software built using the MinGW/MSYS2 toolchain use the GNU
build. build.
#### MinGW #### MinGW
[windows-mingw]: #windows-mingw
[MSYS2][msys2] can be used to easily build Rust on Windows: [MSYS2][msys2] can be used to easily build Rust on Windows:
@ -126,7 +121,6 @@ build.
``` ```
#### MSVC #### MSVC
[windows-msvc]: #windows-msvc
MSVC builds of Rust additionally require an installation of Visual Studio 2017 MSVC builds of Rust additionally require an installation of Visual Studio 2017
(or later) so `rustc` can use its linker. The simplest way is to get the (or later) so `rustc` can use its linker. The simplest way is to get the
@ -155,7 +149,6 @@ by manually calling the appropriate vcvars file before running the bootstrap.
``` ```
#### Specifying an ABI #### Specifying an ABI
[specifying-an-abi]: #specifying-an-abi
Each specific ABI can also be used from either environment (for example, using Each specific ABI can also be used from either environment (for example, using
the GNU ABI in PowerShell) by using an explicit build triple. The available the GNU ABI in PowerShell) by using an explicit build triple. The available
@ -169,11 +162,10 @@ Windows build triples are:
The build triple can be specified by either specifying `--build=<triple>` when The build triple can be specified by either specifying `--build=<triple>` when
invoking `x.py` commands, or by copying the `config.toml` file (as described invoking `x.py` commands, or by copying the `config.toml` file (as described
in Building From Source), and modifying the `build` option under the `[build]` in [Installing From Source](#installing-from-source)), and modifying the
section. `build` option under the `[build]` section.
### Configure and Make ### Configure and Make
[configure-and-make]: #configure-and-make
While it's not the recommended build system, this project also provides a While it's not the recommended build system, this project also provides a
configure script and makefile (the latter of which just invokes `x.py`). configure script and makefile (the latter of which just invokes `x.py`).
@ -188,7 +180,6 @@ When using the configure script, the generated `config.mk` file may override the
`config.mk` file. `config.mk` file.
## Building Documentation ## Building Documentation
[building-documentation]: #building-documentation
If youd like to build the documentation, its almost the same: If youd like to build the documentation, its almost the same:
@ -201,7 +192,6 @@ the ABI used. I.e., if the ABI was `x86_64-pc-windows-msvc`, the directory will
`build\x86_64-pc-windows-msvc\doc`. `build\x86_64-pc-windows-msvc\doc`.
## Notes ## Notes
[notes]: #notes
Since the Rust compiler is written in Rust, it must be built by a Since the Rust compiler is written in Rust, it must be built by a
precompiled "snapshot" version of itself (made in an earlier stage of precompiled "snapshot" version of itself (made in an earlier stage of
@ -224,7 +214,6 @@ There is more advice about hacking on Rust in [CONTRIBUTING.md].
[CONTRIBUTING.md]: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md [CONTRIBUTING.md]: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md
## Getting Help ## Getting Help
[getting-help]: #getting-help
The Rust community congregates in a few places: The Rust community congregates in a few places:
@ -237,7 +226,6 @@ The Rust community congregates in a few places:
[users.rust-lang.org]: https://users.rust-lang.org/ [users.rust-lang.org]: https://users.rust-lang.org/
## Contributing ## Contributing
[contributing]: #contributing
To contribute to Rust, please see [CONTRIBUTING](CONTRIBUTING.md). To contribute to Rust, please see [CONTRIBUTING](CONTRIBUTING.md).
@ -258,7 +246,6 @@ Also, you may find the [rustdocs for the compiler itself][rustdocs] useful.
[rustdocs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/ [rustdocs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc/
## License ## License
[license]: #license
Rust is primarily distributed under the terms of both the MIT license Rust is primarily distributed under the terms of both the MIT license
and the Apache License (Version 2.0), with portions covered by various and the Apache License (Version 2.0), with portions covered by various
@ -268,7 +255,6 @@ See [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT), and
[COPYRIGHT](COPYRIGHT) for details. [COPYRIGHT](COPYRIGHT) for details.
## Trademark ## Trademark
[trademark]: #trademark
The Rust programming language is an open source, community project governed The Rust programming language is an open source, community project governed
by a core team. It is also sponsored by the Mozilla Foundation (“Mozilla”), by a core team. It is also sponsored by the Mozilla Foundation (“Mozilla”),

View File

@ -735,6 +735,47 @@ class RustBuild(object):
"""Set download URL for development environment""" """Set download URL for development environment"""
self._download_url = 'https://dev-static.rust-lang.org' self._download_url = 'https://dev-static.rust-lang.org'
def check_vendored_status(self):
"""Check that vendoring is configured properly"""
vendor_dir = os.path.join(self.rust_root, 'vendor')
if 'SUDO_USER' in os.environ and not self.use_vendored_sources:
if os.environ.get('USER') != os.environ['SUDO_USER']:
self.use_vendored_sources = True
print('info: looks like you are running this command under `sudo`')
print(' and so in order to preserve your $HOME this will now')
print(' use vendored sources by default.')
if not os.path.exists(vendor_dir):
print('error: vendoring required, but vendor directory does not exist.')
print(' Run `cargo vendor` without sudo to initialize the '
'vendor directory.')
raise Exception("{} not found".format(vendor_dir))
if self.use_vendored_sources:
if not os.path.exists('.cargo'):
os.makedirs('.cargo')
with output('.cargo/config') as cargo_config:
cargo_config.write(
"[source.crates-io]\n"
"replace-with = 'vendored-sources'\n"
"registry = 'https://example.com'\n"
"\n"
"[source.vendored-sources]\n"
"directory = '{}/vendor'\n"
.format(self.rust_root))
else:
if os.path.exists('.cargo'):
shutil.rmtree('.cargo')
def ensure_vendored(self):
"""Ensure that the vendored sources are available if needed"""
vendor_dir = os.path.join(self.rust_root, 'vendor')
# Note that this does not handle updating the vendored dependencies if
# the rust git repository is updated. Normal development usually does
# not use vendoring, so hopefully this isn't too much of a problem.
if self.use_vendored_sources and not os.path.exists(vendor_dir):
run([self.cargo(), "vendor"],
verbose=self.verbose, cwd=self.rust_root)
def bootstrap(help_triggered): def bootstrap(help_triggered):
"""Configure, fetch, build and run the initial bootstrap""" """Configure, fetch, build and run the initial bootstrap"""
@ -776,30 +817,7 @@ def bootstrap(help_triggered):
build.use_locked_deps = '\nlocked-deps = true' in build.config_toml build.use_locked_deps = '\nlocked-deps = true' in build.config_toml
if 'SUDO_USER' in os.environ and not build.use_vendored_sources: build.check_vendored_status()
if os.environ.get('USER') != os.environ['SUDO_USER']:
build.use_vendored_sources = True
print('info: looks like you are running this command under `sudo`')
print(' and so in order to preserve your $HOME this will now')
print(' use vendored sources by default. Note that if this')
print(' does not work you should run a normal build first')
print(' before running a command like `sudo ./x.py install`')
if build.use_vendored_sources:
if not os.path.exists('.cargo'):
os.makedirs('.cargo')
with output('.cargo/config') as cargo_config:
cargo_config.write("""
[source.crates-io]
replace-with = 'vendored-sources'
registry = 'https://example.com'
[source.vendored-sources]
directory = '{}/vendor'
""".format(build.rust_root))
else:
if os.path.exists('.cargo'):
shutil.rmtree('.cargo')
data = stage0_data(build.rust_root) data = stage0_data(build.rust_root)
build.date = data['date'] build.date = data['date']
@ -815,6 +833,7 @@ def bootstrap(help_triggered):
build.build = args.build or build.build_triple() build.build = args.build or build.build_triple()
build.download_stage0() build.download_stage0()
sys.stdout.flush() sys.stdout.flush()
build.ensure_vendored()
build.build_bootstrap() build.build_bootstrap()
sys.stdout.flush() sys.stdout.flush()

View File

@ -935,8 +935,6 @@ impl Step for Src {
} }
} }
const CARGO_VENDOR_VERSION: &str = "0.1.22";
#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)] #[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)]
pub struct PlainSourceTarball; pub struct PlainSourceTarball;
@ -998,26 +996,6 @@ impl Step for PlainSourceTarball {
// If we're building from git sources, we need to vendor a complete distribution. // If we're building from git sources, we need to vendor a complete distribution.
if builder.rust_info.is_git() { if builder.rust_info.is_git() {
// Get cargo-vendor installed, if it isn't already.
let mut has_cargo_vendor = false;
let mut cmd = Command::new(&builder.initial_cargo);
for line in output(cmd.arg("install").arg("--list")).lines() {
has_cargo_vendor |= line.starts_with("cargo-vendor ");
}
if !has_cargo_vendor {
let mut cmd = builder.cargo(
builder.compiler(0, builder.config.build),
Mode::ToolBootstrap,
builder.config.build,
"install"
);
cmd.arg("--force")
.arg("--debug")
.arg("--vers").arg(CARGO_VENDOR_VERSION)
.arg("cargo-vendor");
builder.run(&mut cmd);
}
// Vendor all Cargo dependencies // Vendor all Cargo dependencies
let mut cmd = Command::new(&builder.initial_cargo); let mut cmd = Command::new(&builder.initial_cargo);
cmd.arg("vendor") cmd.arg("vendor")