diff --git a/src/docbuilder/metadata.rs b/src/docbuilder/metadata.rs index 1b177fba6..60aff1635 100644 --- a/src/docbuilder/metadata.rs +++ b/src/docbuilder/metadata.rs @@ -45,6 +45,14 @@ pub struct Metadata { /// is always built on this target. You can change default target by setting this. pub default_target: Option, + /// Define the Rust version that will be used to build documentation + /// + /// You can either provide a specific nightly (such as `2018-08-18`) or + /// simply `nightly` to always use the current. + /// + /// Note: Depending on latest nightly can easily break your documentation! + pub rustc_version: Option, + /// List of command line arguments for `rustc`. pub rustc_args: Option>, @@ -90,6 +98,7 @@ impl Metadata { fn default() -> Metadata { Metadata { features: None, + rustc_version: None, all_features: false, no_default_features: false, default_target: None, @@ -120,6 +129,10 @@ impl Metadata { .and_then(|v| v.as_bool()).unwrap_or(metadata.all_features); metadata.default_target = table.get("default-target") .and_then(|v| v.as_str()).map(|v| v.to_owned()); + metadata.rustc_version = table.get("rustc-version").and_then(|f| match f { + Value::String(s) => Some(s.clone()), + _ => None, + }); metadata.rustc_args = table.get("rustc-args").and_then(|f| f.as_array()) .and_then(|f| f.iter().map(|v| v.as_str().map(|v| v.to_owned())).collect()); metadata.rustdoc_args = table.get("rustdoc-args").and_then(|f| f.as_array()) diff --git a/src/utils/build_doc.rs b/src/utils/build_doc.rs index 58cd74d76..6f4bcec54 100644 --- a/src/utils/build_doc.rs +++ b/src/utils/build_doc.rs @@ -15,6 +15,8 @@ use cargo::ops::{self, Packages, DefaultExecutor}; use utils::{get_current_versions, parse_rustc_version}; use error::Result; +use super::rustup; + use Metadata; @@ -49,6 +51,11 @@ pub fn build_doc(name: &str, vers: Option<&str>, target: Option<&str>) -> Result let metadata = Metadata::from_package(&pkg).map_err(|e| human(e.description()))?; + // Change rustc version if requested + if metadata.rustc_version.is_some() { + rustup::set_version(metadata.rustc_version.unwrap()); + } + // This is only way to pass rustc_args to cargo. // CompileOptions::target_rustc_args is used only for the current crate, // and since docs.rs never runs rustc on the current crate, we assume rustc_args diff --git a/src/utils/mod.rs b/src/utils/mod.rs index c0db8296c..72119023f 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -17,3 +17,4 @@ mod daemon; mod pubsubhubbub; mod rustc_version; mod html; +mod rustup; diff --git a/src/utils/rustup.rs b/src/utils/rustup.rs new file mode 100644 index 000000000..d4a0bc902 --- /dev/null +++ b/src/utils/rustup.rs @@ -0,0 +1,14 @@ +//! A wrapper around using rustup +//! + +use std::process::Command; + +/// Invoke rustup in a folder to `override set` a rustc version +pub fn set_version(v: String) { + Command::new("rustup") + .arg("override") + .arg("set") + .arg(v) + .output() + .unwrap(); +}