feat(build): add rustc check

master
Ashley Williams 7 years ago
parent 69982de8cc
commit b28d2850a7
  1. 47
      src/build.rs
  2. 10
      src/command/build.rs
  3. 31
      src/error.rs

@ -3,10 +3,57 @@
use emoji;
use error::Error;
use progressbar::Step;
use std::env;
use std::path::Path;
use std::process::Command;
use std::str;
use PBAR;
/// Ensure that `rustc` is present and that it is >= 1.30.0
pub fn check_rustc_version(step: &Step) -> Result<String, Error> {
let msg = format!("{}Checking `rustc` version...", emoji::TARGET);
PBAR.step(step, &msg);
let local_minor_version = rustc_minor_version();
match local_minor_version {
Some(mv) => {
if mv < 30 {
return Err(Error::RustcVersion {
message: format!(
"Your version of Rust, '{}', is not supported.",
mv.to_string()
),
local_minor_version: mv.to_string(),
})
} else {
Ok(mv.to_string())
}
},
None => Err(Error::RustcMissing {
message: "We can't figure out what your Rust version is- which means you might not have Rust ins talled. Please install Rust version 1.30.0 or higher.".to_string(),
}),
}
}
// from https://github.com/alexcrichton/proc-macro2/blob/79e40a113b51836f33214c6d00228934b41bd4ad/build.rs#L44-L61
fn rustc_minor_version() -> Option<u32> {
macro_rules! otry {
($e:expr) => {
match $e {
Some(e) => e,
None => return None,
}
};
}
let rustc = otry!(env::var_os("RUSTC"));
let output = otry!(Command::new(rustc).arg("--version").output().ok());
let version = otry!(str::from_utf8(&output.stdout).ok());
let mut pieces = version.split('.');
if pieces.next() != Some("rustc 1") {
return None;
}
otry!(pieces.next()).parse().ok()
}
/// Ensure that `rustup` has the `wasm32-unknown-unknown` target installed for
/// the `nightly` toolchain.
pub fn rustup_add_wasm_target(step: &Step) -> Result<(), Error> {

@ -156,6 +156,7 @@ impl Build {
}
match &mode {
BuildMode::Normal => steps![
step_check_rustc_version,
step_check_crate_config,
step_add_wasm_target,
step_build_wasm,
@ -166,6 +167,7 @@ impl Build {
step_run_wasm_bindgen,
],
BuildMode::Noinstall => steps![
step_check_rustc_version,
step_check_crate_config,
step_build_wasm,
step_create_dir,
@ -176,6 +178,14 @@ impl Build {
}
}
fn step_check_rustc_version(&mut self, step: &Step, log: &Logger) -> Result<(), Error> {
info!(&log, "Checking rustc version...");
let version = build::check_rustc_version(step)?;
let msg = format!("rustc version is {}.", version);
info!(&log, "{}", &msg);
Ok(())
}
fn step_check_crate_config(&mut self, step: &Step, log: &Logger) -> Result<(), Error> {
info!(&log, "Checking crate configuration...");
manifest::check_crate_config(&self.crate_path, step)?;

@ -29,6 +29,22 @@ pub enum Error {
/// An error handling zip archives.
Zip(#[cause] zip::result::ZipError),
#[fail(display = "{}", _0)]
/// An error in parsing your rustc version.
RustcMissing {
/// Error message
message: String,
},
#[fail(display = "{}", _0)]
/// An error from having an unsupported rustc version.
RustcVersion {
/// Error message
message: String,
/// The minor version of the local rust
local_minor_version: String,
},
/// An error invoking another CLI tool.
#[fail(display = "{}. stderr:\n\n{}", message, stderr)]
Cli {
@ -112,6 +128,14 @@ impl Error {
}
}
/// Construct a rustc version error.
pub fn rustc_version_error(message: &str, local_version: &str) -> Self {
Error::RustcVersion {
message: message.to_string(),
local_minor_version: local_version.to_string(),
}
}
/// Get a string description of this error's type.
pub fn error_type(&self) -> String {
match self {
@ -119,6 +143,13 @@ impl Error {
Error::SerdeJson(_) => "There was an JSON error. Details:\n\n",
Error::SerdeToml(_) => "There was an TOML error. Details:\n\n",
Error::Zip(_) => "There was an error handling zip files. Details:\n\n",
Error::RustcMissing {
message: _,
} => "We can't figure out what your Rust version is- which means you might not have Rust installed. Please install Rust version 1.30.0 or higher.",
Error::RustcVersion {
message: _,
local_minor_version: _,
} => "Your rustc version is not supported. Please install version 1.30.0 or higher.",
Error::Cli {
message: _,
stderr: _,

Loading…
Cancel
Save