1
Fork 0

Auto merge of #38331 - bluss:assume-stage, r=alexcrichton

rustbuild: Add cli option --keep-stage

This option is intended to be used like:

./x.py build --stage 1 --keep-stage 0

Which skips all stage 0 steps, so that stage 1 can be recompiled
directly (even if for example libcore has changes).

This is useful when working on `cfg(not(stage0))` parts of the
libraries or when re-running stage 1 tests in libraries in general.

Fixes #38326
This commit is contained in:
bors 2016-12-15 14:01:55 +00:00
commit f70ad0adfd
3 changed files with 16 additions and 0 deletions

View file

@ -42,6 +42,15 @@ The script accepts commands, flags, and arguments to determine what to do:
./x.py build --stage 0 src/libtest ./x.py build --stage 0 src/libtest
``` ```
If files are dirty that would normally be rebuilt from stage 0, that can be
overidden using `--keep-stage 0`. Using `--keep-stage n` will skip all steps
that belong to stage n or earlier:
```
# keep old build products for stage 0 and build stage 1
./x.py build --keep-stage 0 --stage 1
```
* `test` - a command for executing unit tests. Like the `build` command this * `test` - a command for executing unit tests. Like the `build` command this
will execute the entire test suite by default, and otherwise it can be used to will execute the entire test suite by default, and otherwise it can be used to
select which test suite is run: select which test suite is run:

View file

@ -29,6 +29,7 @@ use step;
pub struct Flags { pub struct Flags {
pub verbose: bool, pub verbose: bool,
pub stage: Option<u32>, pub stage: Option<u32>,
pub keep_stage: Option<u32>,
pub build: String, pub build: String,
pub host: Vec<String>, pub host: Vec<String>,
pub target: Vec<String>, pub target: Vec<String>,
@ -68,6 +69,7 @@ impl Flags {
opts.optmulti("", "host", "host targets to build", "HOST"); opts.optmulti("", "host", "host targets to build", "HOST");
opts.optmulti("", "target", "target targets to build", "TARGET"); opts.optmulti("", "target", "target targets to build", "TARGET");
opts.optopt("", "stage", "stage to build", "N"); opts.optopt("", "stage", "stage to build", "N");
opts.optopt("", "keep-stage", "stage to keep without recompiling", "N");
opts.optopt("", "src", "path to the root of the rust checkout", "DIR"); opts.optopt("", "src", "path to the root of the rust checkout", "DIR");
opts.optopt("j", "jobs", "number of jobs to run in parallel", "JOBS"); opts.optopt("j", "jobs", "number of jobs to run in parallel", "JOBS");
opts.optflag("h", "help", "print this help message"); opts.optflag("h", "help", "print this help message");
@ -257,6 +259,7 @@ To learn more about a subcommand, run `./x.py <command> -h`
Flags { Flags {
verbose: m.opt_present("v"), verbose: m.opt_present("v"),
stage: m.opt_str("stage").map(|j| j.parse().unwrap()), stage: m.opt_str("stage").map(|j| j.parse().unwrap()),
keep_stage: m.opt_str("keep-stage").map(|j| j.parse().unwrap()),
build: m.opt_str("build").unwrap_or_else(|| { build: m.opt_str("build").unwrap_or_else(|| {
env::var("BUILD").unwrap() env::var("BUILD").unwrap()
}), }),

View file

@ -871,6 +871,10 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd?
// And finally, iterate over everything and execute it. // And finally, iterate over everything and execute it.
for step in order.iter() { for step in order.iter() {
if self.build.flags.keep_stage.map_or(false, |s| step.stage <= s) {
self.build.verbose(&format!("keeping step {:?}", step));
continue;
}
self.build.verbose(&format!("executing step {:?}", step)); self.build.verbose(&format!("executing step {:?}", step));
(self.rules[step.name].run)(step); (self.rules[step.name].run)(step);
} }