use std::{env, process}; mod build; mod clean; mod clone_gcc; mod config; mod fmt; mod info; mod prepare; mod rust_tools; mod rustc_info; mod test; mod utils; const BUILD_DIR: &str = "build"; macro_rules! arg_error { ($($err:tt)*) => {{ eprintln!($($err)*); eprintln!(); usage(); std::process::exit(1); }}; } fn usage() { println!( "\ rustc_codegen_gcc build system Usage: build_system [command] [options] Options: --help : Displays this help message. Commands: cargo : Executes a cargo command. rustc : Compiles the program using the GCC compiler. clean : Cleans the build directory, removing all compiled files and artifacts. prepare : Prepares the environment for building, including fetching dependencies and setting up configurations. build : Compiles the project. test : Runs tests for the project. info : Displays information about the build environment and project configuration. clone-gcc : Clones the GCC compiler from a specified source. fmt : Runs rustfmt" ); } pub enum Command { Cargo, Clean, CloneGcc, Prepare, Build, Rustc, Test, Info, Fmt, } fn main() { if env::var("RUST_BACKTRACE").is_err() { env::set_var("RUST_BACKTRACE", "1"); } let command = match env::args().nth(1).as_deref() { Some("cargo") => Command::Cargo, Some("rustc") => Command::Rustc, Some("clean") => Command::Clean, Some("prepare") => Command::Prepare, Some("build") => Command::Build, Some("test") => Command::Test, Some("info") => Command::Info, Some("clone-gcc") => Command::CloneGcc, Some("fmt") => Command::Fmt, Some("--help") => { usage(); process::exit(0); } Some(flag) if flag.starts_with('-') => arg_error!("Expected command found flag {}", flag), Some(command) => arg_error!("Unknown command {}", command), None => { usage(); process::exit(0); } }; if let Err(e) = match command { Command::Cargo => rust_tools::run_cargo(), Command::Rustc => rust_tools::run_rustc(), Command::Clean => clean::run(), Command::Prepare => prepare::run(), Command::Build => build::run(), Command::Test => test::run(), Command::Info => info::run(), Command::CloneGcc => clone_gcc::run(), Command::Fmt => fmt::run(), } { eprintln!("Command failed to run: {e}"); process::exit(1); } }