From b26985ea6c69333fac7ca7b976526dfa8742bd72 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Tue, 10 Oct 2023 14:23:58 -0500 Subject: [PATCH] make debug build of fullstack applications load faster by default --- packages/cli/src/cli/build.rs | 4 ++ packages/cli/src/cli/cfg.rs | 11 +++++ packages/cli/src/server/fullstack/mod.rs | 60 ++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/packages/cli/src/cli/build.rs b/packages/cli/src/cli/build.rs index 09c439ae2..72cdc1bfd 100644 --- a/packages/cli/src/cli/build.rs +++ b/packages/cli/src/cli/build.rs @@ -1,5 +1,7 @@ #[cfg(feature = "plugin")] use crate::plugin::PluginManager; +use crate::server::fullstack::FullstackServerEnvGuard; +use crate::server::fullstack::FullstackWebEnvGuard; use crate::{cfg::Platform, WebAssetConfigDropGuard}; use super::*; @@ -60,6 +62,7 @@ impl Build { } None => web_config.features = Some(vec![web_feature]), }; + let _gaurd = FullstackWebEnvGuard::new(self.build.debug); crate::builder::build(&crate_config, false, self.build.skip_assets)?; } { @@ -72,6 +75,7 @@ impl Build { } None => desktop_config.features = Some(vec![desktop_feature]), }; + let _gaurd = FullstackServerEnvGuard::new(self.build.debug); crate::builder::build_desktop(&desktop_config, false, self.build.skip_assets)?; } } diff --git a/packages/cli/src/cli/cfg.rs b/packages/cli/src/cli/cfg.rs index 3078e864f..b2c2c9c1a 100644 --- a/packages/cli/src/cli/cfg.rs +++ b/packages/cli/src/cli/cfg.rs @@ -15,6 +15,11 @@ pub struct ConfigOptsBuild { #[serde(default)] pub release: bool, + /// Build with all debug info [default: false] + #[clap(long)] + #[serde(default)] + pub debug: bool, + // Use verbose output [default: false] #[clap(long)] #[serde(default)] @@ -63,6 +68,7 @@ impl From for ConfigOptsBuild { client_feature: serve.client_feature, server_feature: serve.server_feature, skip_assets: serve.skip_assets, + debug: serve.debug, } } } @@ -92,6 +98,11 @@ pub struct ConfigOptsServe { #[serde(default)] pub release: bool, + /// Build with all debug info [default: false] + #[clap(long)] + #[serde(default)] + pub debug: bool, + // Use verbose output [default: false] #[clap(long)] #[serde(default)] diff --git a/packages/cli/src/server/fullstack/mod.rs b/packages/cli/src/server/fullstack/mod.rs index ae8d1859a..2ee8f7415 100644 --- a/packages/cli/src/server/fullstack/mod.rs +++ b/packages/cli/src/server/fullstack/mod.rs @@ -55,6 +55,7 @@ impl Platform for FullstackPlatform { } None => desktop_config.features = Some(vec![desktop_feature]), }; + let _gaurd = FullstackServerEnvGuard::new(self.serve.debug); self.desktop.rebuild(&desktop_config) } } @@ -71,5 +72,64 @@ fn build_web(serve: ConfigOptsServe) -> Result<()> { None => web_config.features = Some(vec![web_feature]), }; web_config.platform = Some(crate::cfg::Platform::Web); + + let _gaurd = FullstackWebEnvGuard::new(web_config.debug); crate::cli::build::Build { build: web_config }.build(None) } + +// Debug mode web builds have a very large size by default. If debug mode is not enabled, we strip some of the debug info by default +// This reduces a hello world from ~40MB to ~2MB +pub(crate) struct FullstackWebEnvGuard { + old_rustflags: Option, +} + +impl FullstackWebEnvGuard { + pub fn new(debug_mode: bool) -> Self { + Self { + old_rustflags: (!debug_mode).then(|| { + let old_rustflags = std::env::var("RUSTFLAGS").unwrap_or_default(); + + std::env::set_var( + "RUSTFLAGS", + format!("{old_rustflags} -C debuginfo=none -C strip=debuginfo"), + ); + old_rustflags + }), + } + } +} + +impl Drop for FullstackWebEnvGuard { + fn drop(&mut self) { + if let Some(old_rustflags) = self.old_rustflags.take() { + std::env::set_var("RUSTFLAGS", old_rustflags); + } + } +} + +// Debug mode web builds have a very large size by default. If debug mode is not enabled, we strip some of the debug info by default +// This reduces a hello world from ~40MB to ~2MB +pub(crate) struct FullstackServerEnvGuard { + old_rustflags: Option, +} + +impl FullstackServerEnvGuard { + pub fn new(debug_mode: bool) -> Self { + Self { + old_rustflags: (!debug_mode).then(|| { + let old_rustflags = std::env::var("RUSTFLAGS").unwrap_or_default(); + + std::env::set_var("RUSTFLAGS", format!("{old_rustflags} -C opt-level=2")); + old_rustflags + }), + } + } +} + +impl Drop for FullstackServerEnvGuard { + fn drop(&mut self) { + if let Some(old_rustflags) = self.old_rustflags.take() { + std::env::set_var("RUSTFLAGS", old_rustflags); + } + } +}