diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 009fb61984638..a1cf38ae336d2 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1013,6 +1013,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options, "set the threshold for inlining a function (default: 225)"), panic: Option = (None, parse_panic_strategy, [TRACKED], "panic strategy to compile crate with"), + incremental: Option = (None, parse_opt_string, [UNTRACKED], + "enable incremental compilation"), } options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, @@ -1663,7 +1665,24 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches) early_error(error_format, "Value for codegen units must be a positive nonzero integer"); } - if cg.lto && debugging_opts.incremental.is_some() { + let incremental = match (&debugging_opts.incremental, &cg.incremental) { + (&Some(ref path1), &Some(ref path2)) => { + if path1 != path2 { + early_error(error_format, + &format!("conflicting paths for `-Z incremental` and \ + `-C incremental` specified: {} versus {}", + path1, + path2)); + } else { + Some(path1) + } + } + (&Some(ref path), &None) => Some(path), + (&None, &Some(ref path)) => Some(path), + (&None, &None) => None, + }.map(|m| PathBuf::from(m)); + + if cg.lto && incremental.is_some() { early_error(error_format, "can't perform LTO when compiling incrementally"); } @@ -1837,8 +1856,6 @@ pub fn build_session_options_and_crate_config(matches: &getopts::Matches) let crate_name = matches.opt_str("crate-name"); - let incremental = debugging_opts.incremental.as_ref().map(|m| PathBuf::from(m)); - (Options { crate_types, optimize: opt_level, @@ -2581,6 +2598,9 @@ mod tests { opts.cg.save_temps = true; assert_eq!(reference.dep_tracking_hash(), opts.dep_tracking_hash()); + opts.cg.incremental = Some(String::from("abc")); + assert_eq!(reference.dep_tracking_hash(), opts.dep_tracking_hash()); + // Make sure changing a [TRACKED] option changes the hash opts = reference.clone(); diff --git a/src/librustc_trans/base.rs b/src/librustc_trans/base.rs index bfc72ff06aa70..1314c98c8a30d 100644 --- a/src/librustc_trans/base.rs +++ b/src/librustc_trans/base.rs @@ -1025,7 +1025,7 @@ fn collect_and_partition_translation_items<'a, 'tcx>( assert_symbols_are_distinct(tcx, items.iter()); - let strategy = if tcx.sess.opts.debugging_opts.incremental.is_some() { + let strategy = if tcx.sess.opts.incremental.is_some() { PartitioningStrategy::PerModule } else { PartitioningStrategy::FixedUnitCount(tcx.sess.codegen_units()) diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 06e798554167b..3aee88136a1ff 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -1506,7 +1506,7 @@ impl<'test> TestCx<'test> { if let Some(ref incremental_dir) = self.props.incremental_dir { rustc.args(&[ - "-Z", + "-C", &format!("incremental={}", incremental_dir.display()), ]); rustc.args(&["-Z", "incremental-verify-ich"]);