From faaf7e14b10d8e312b8c945a3e33fd28148f7893 Mon Sep 17 00:00:00 2001 From: csmoe <35686186+csmoe@users.noreply.github.com> Date: Thu, 2 Aug 2018 16:40:11 +0800 Subject: [PATCH] build(opt): introduce wasm-opt --- src/command/build.rs | 15 +++++++++++ src/opt.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 src/opt.rs diff --git a/src/command/build.rs b/src/command/build.rs index 0d649e80..c5c02d5e 100644 --- a/src/command/build.rs +++ b/src/command/build.rs @@ -1,4 +1,5 @@ use bindgen; +use opt; use build; use command::utils::{create_pkg_dir, set_crate_path}; use emoji; @@ -245,4 +246,18 @@ impl Build { ); Ok(()) } + + fn step_run_wasm_opt(&mut self, step: &Step, log: &Logger) -> Result<(), Error> { + info!(&log, "Optimizing the wasm bindings..."); + opt::run_wasm_opt( + &self.crate_path, + &self.crate_name, + &self.build_config.opt_passes(), + )?; + info!( + &log, + "wasm bindings were optimized at {:#?}.", + &self.crate_path.join("pkg") + ); + } } diff --git a/src/opt.rs b/src/opt.rs new file mode 100644 index 00000000..7104dd5c --- /dev/null +++ b/src/opt.rs @@ -0,0 +1,64 @@ +//! Functionality related to checking and running `wasm-opt`. + +use emoji; +use error::Error; +use progressbar::Step; +use std::path::Path; +use std::process::Command; +use PBAR; +use manifest::BuildConfig; + +/// Check the `wasm-opt` CLI. +fn check_install_wasm_opt(step: &Step) -> Result<(), Error> { + let msg = format!("{}Checking WASM-opt...", emoji::DOWN_ARROW); + PBAR.step(step, &msg); + // check whether `wasm-opt` is installed. + let output = Command::new("command") + .args(&["-v", "wasm-opt"]) + .output()?; + if !output.status.success() { + let s = String::from_utf8_lossy(&output.stderr); + if s.contains("No such file") { + Error::cli( + "wasm-opt isn't installed. \ + please follow the build instruction in \ + https://github.com/WebAssembly/binaryen#binaryen", + s + ) + } + } else { + Ok(()) + } +} + +/// Run the `wasm-bindgen` CLI to optimize the current crate's `.wasm`. +pub fn run_wasm_opt( + path: &Path, + name: &str, + build_config: &BuildConfig, + step: &Step, +) -> Result<(), Error> { + check_install_wasm_opt(step)?; + + let msg = format!("{}Running WASM-opt...", emoji::RUNNER); + PBAR.step(step, &msg); + let binary_name = name.replace("-", "_"); + let release_or_debug = if debug { "debug" } else { "release" }; + let wasm_path = format!( + "target/wasm32-unknown-unknown/{}/{}.wasm", + release_or_debug, binary_name + ); + + let output = Command::new("wasm-opt") + .current_dir(path) + .arg(&wasm_path) + // FIXME(csmoe): opt_passes() needs to be supported at upper buildconfig. + .args(build_config.opt_passes()) + .output()?; + if !output.status.success() { + let s = String::from_utf8_lossy(&output.stderr); + Error::cli("wasm-opt failed to execute properly", s) + } else { + Ok(()) + } +}