|
| 1 | +use crate::{GithubError, commands::LegionArguments}; |
| 2 | +use clap::Parser; |
| 3 | +#[cfg(feature = "wasm-opt")] |
| 4 | +use wasm_opt::{OptimizationOptions, OptimizeLevel, ShrinkLevel}; |
| 5 | + |
| 6 | +#[derive(Debug, Parser)] |
| 7 | +pub struct CommandBuild { |
| 8 | + /// Package to build (see `cargo help pkgid`) |
| 9 | + #[arg(short, long, visible_alias = "include", value_name = "packages...")] |
| 10 | + package: Vec<String>, |
| 11 | + /// Exclude packages from the build |
| 12 | + #[arg(long, value_name = "packages...")] |
| 13 | + exclude: Vec<String>, |
| 14 | + /// Build only this package's library |
| 15 | + #[arg(short, long, visible_alias = "lib")] |
| 16 | + library: bool, |
| 17 | + /// Build only the specified binary |
| 18 | + #[arg(short, long, visible_alias = "bin", value_name = "binaries...")] |
| 19 | + binary: Vec<String>, |
| 20 | + #[arg(long = "O0")] |
| 21 | + optimize_0: bool, |
| 22 | + #[arg(long = "O1")] |
| 23 | + optimize_1: bool, |
| 24 | + #[arg(long = "O2")] |
| 25 | + optimize_2: bool, |
| 26 | + #[arg(long = "O3")] |
| 27 | + optimize_3: bool, |
| 28 | + #[arg(long = "O4")] |
| 29 | + optimize_4: bool, |
| 30 | + /// Sent to the O5 Council, optimized by the O5 herself. |
| 31 | + #[arg(long = "O5")] |
| 32 | + optimize_5: bool, |
| 33 | + /// Optimize for size |
| 34 | + #[arg(long = "Os")] |
| 35 | + optimize_s: bool, |
| 36 | + /// Optimize for size in aggressively way |
| 37 | + #[arg(long = "Oz")] |
| 38 | + optimize_z: bool, |
| 39 | +} |
| 40 | + |
| 41 | +impl CommandBuild { |
| 42 | + #[cfg(feature = "wasm-opt")] |
| 43 | + pub async fn run(self, _: &LegionArguments) -> Result<(), GithubError> { |
| 44 | + let mut options = OptimizationOptions { |
| 45 | + reader: Default::default(), |
| 46 | + writer: Default::default(), |
| 47 | + inlining: Default::default(), |
| 48 | + passopts: Default::default(), |
| 49 | + passes: Default::default(), |
| 50 | + features: Default::default(), |
| 51 | + converge: false, |
| 52 | + }; |
| 53 | + self.optimize_level(&mut options)?; |
| 54 | + println!("{:#?}", options); |
| 55 | + Ok(()) |
| 56 | + } |
| 57 | + #[cfg(not(feature = "wasm-opt"))] |
| 58 | + pub async fn run(self, _: &LegionArguments) -> Result<(), GithubError> { |
| 59 | + println!("Unable to build because: https://github.com/dtolnay/cxx/issues/1429"); |
| 60 | + Ok(()) |
| 61 | + } |
| 62 | + #[cfg(feature = "wasm-opt")] |
| 63 | + pub fn optimize_level(&self, options: &mut OptimizationOptions) -> Result<(), GithubError> { |
| 64 | + if self.optimize_5 { |
| 65 | + panic!("The O5 Council does not exist!"); |
| 66 | + } |
| 67 | + else if self.optimize_z { |
| 68 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 69 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 70 | + options.passes.add_default_passes = true; |
| 71 | + } |
| 72 | + else if self.optimize_s { |
| 73 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 74 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 75 | + options.passes.add_default_passes = true; |
| 76 | + } |
| 77 | + else if self.optimize_4 { |
| 78 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 79 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 80 | + options.passes.add_default_passes = true; |
| 81 | + } |
| 82 | + else if self.optimize_3 { |
| 83 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 84 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 85 | + options.passes.add_default_passes = true; |
| 86 | + } |
| 87 | + else if self.optimize_2 { |
| 88 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 89 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 90 | + options.passes.add_default_passes = true; |
| 91 | + } |
| 92 | + else if self.optimize_1 { |
| 93 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 94 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 95 | + options.passes.add_default_passes = true; |
| 96 | + } |
| 97 | + else if self.optimize_0 { |
| 98 | + options.passopts.optimize_level = OptimizeLevel::Level2; |
| 99 | + options.passopts.shrink_level = ShrinkLevel::Level2; |
| 100 | + options.passes.add_default_passes = true; |
| 101 | + } |
| 102 | + Ok(()) |
| 103 | + } |
| 104 | +} |
0 commit comments