about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorUlrik Sverdrup <bluss@users.noreply.github.com>2016-12-12 23:21:42 +0100
committerUlrik Sverdrup <bluss@users.noreply.github.com>2016-12-13 00:05:12 +0100
commit4e696edc71fe72724f706af2cf827825d3a90c56 (patch)
tree630a8b8573e5aa5a1e3db8b0181c65ac06c4683f /src
parentfd5dc057936f5d84ccd8c1d5965f60e669b589d8 (diff)
downloadrust-4e696edc71fe72724f706af2cf827825d3a90c56.tar.gz
rust-4e696edc71fe72724f706af2cf827825d3a90c56.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/flags.rs3
-rw-r--r--src/bootstrap/step.rs4
2 files changed, 7 insertions, 0 deletions
diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs
index 7a2d56fc5d3..e57ff304833 100644
--- a/src/bootstrap/flags.rs
+++ b/src/bootstrap/flags.rs
@@ -29,6 +29,7 @@ use step;
 pub struct Flags {
     pub verbose: bool,
     pub stage: Option<u32>,
+    pub keep_stage: Option<u32>,
     pub build: String,
     pub host: Vec<String>,
     pub target: Vec<String>,
@@ -68,6 +69,7 @@ impl Flags {
         opts.optmulti("", "host", "host targets to build", "HOST");
         opts.optmulti("", "target", "target targets to build", "TARGET");
         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("j", "jobs", "number of jobs to run in parallel", "JOBS");
         opts.optflag("h", "help", "print this help message");
@@ -258,6 +260,7 @@ To learn more about a subcommand, run `./x.py <command> -h`
         Flags {
             verbose: m.opt_present("v"),
             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(|| {
                 env::var("BUILD").unwrap()
             }),
diff --git a/src/bootstrap/step.rs b/src/bootstrap/step.rs
index 884cc7da8ea..d001b95cd6a 100644
--- a/src/bootstrap/step.rs
+++ b/src/bootstrap/step.rs
@@ -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.
         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.rules[step.name].run)(step);
         }