Skip to main content

rustbasic_cli/
builder.rs

1use std::process::Command;
2use std::io::{self, Write};
3use colored::*;
4
5pub fn build_project() {
6    println!("\n{}", "🚀 RustBasic Build Manager".magenta().bold());
7    println!("{}", "--------------------------".magenta());
8    
9    // 1. Pilih Target
10    println!("{}", "--- Pilih Target OS ---".cyan().bold());
11    println!("1) Native (Sesuai OS Anda)");
12    println!("2) Windows (x86_64-pc-windows-msvc)");
13    println!("3) Linux (x86_64-unknown-linux-gnu)");
14    println!("4) macOS ARM (aarch64-apple-darwin)");
15    println!("5) Batal");
16    print!("\n{}", "Masukkan pilihan target (1-5): ".bold());
17    io::stdout().flush().unwrap();
18
19    let mut target_choice = String::new();
20    io::stdin().read_line(&mut target_choice).ok();
21    let target_choice = target_choice.trim();
22
23    if target_choice == "5" {
24        println!("{}", "👋 Build dibatalkan.".yellow());
25        return;
26    }
27
28    let target = match target_choice {
29        "2" => Some("x86_64-pc-windows-msvc"),
30        "3" => Some("x86_64-unknown-linux-gnu"),
31        "4" => Some("aarch64-apple-darwin"),
32        _ => None, // Native
33    };
34
35    // 2. Pilih Mode
36    println!("\n{}", "--- Pilih Mode Build ---".cyan().bold());
37    println!("1) Development");
38    println!("2) Production (Release)");
39    print!("\n{}", "Masukkan pilihan mode (1-2): ".bold());
40    io::stdout().flush().unwrap();
41
42    let mut mode_choice = String::new();
43    io::stdin().read_line(&mut mode_choice).ok();
44    let is_release = mode_choice.trim() == "2";
45
46    // 3. Eksekusi Build
47    println!("\n{}", "🛠️  Menyiapkan build...".blue());
48
49    let has_zigbuild = Command::new("cargo")
50        .arg("zigbuild")
51        .arg("--version")
52        .output()
53        .is_ok();
54
55    let mut cmd = if has_zigbuild && target.is_some() {
56        println!("{}", "✨ Menggunakan cargo-zigbuild untuk kompilasi silang...".green().italic());
57        let mut c = Command::new("cargo");
58        c.arg("zigbuild");
59        c
60    } else {
61        if let Some(t) = target {
62            println!("{} {} {}", "📦 Menambahkan target".blue(), t.yellow(), "via rustup...".blue());
63            Command::new("rustup")
64                .args(["target", "add", t])
65                .status()
66                .ok();
67        }
68        let mut c = Command::new("cargo");
69        c.arg("build");
70        c
71    };
72
73    if is_release {
74        cmd.arg("--release");
75    }
76
77    if let Some(t) = target {
78        cmd.arg("--target").arg(t);
79    }
80
81    println!("{} {:?}", "🚀 Menjalankan:".blue().bold(), cmd);
82    let status = cmd.status().expect("Gagal menjalankan perintah build");
83
84    if status.success() {
85        println!("\n{}", "✅ Build berhasil!".green().bold());
86        if is_release {
87            println!("{}", "📂 Output ada di folder target/release atau target/<target>/release".dimmed());
88        }
89    } else {
90        println!("\n{}", "❌ Build gagal.".red().bold());
91        println!("{}", "💡 Penyebab: Linker untuk target tersebut tidak ditemukan di sistem Anda.".yellow());
92        
93        if target_choice == "2" {
94            println!("\n{}", "🔧 Cara memperbaiki untuk Windows:".cyan());
95            println!("   Jalankan: {}", "brew install mingw-w64".white().on_black());
96        } else if target_choice == "3" {
97            println!("\n{}", "🔧 Cara memperbaiki untuk Linux:".cyan());
98            println!("   Jalankan: {}", "brew install messense/macos-cross-toolchains/x86_64-unknown-linux-gnu".white().on_black());
99        }
100        
101        println!("\n{}", "Atau gunakan 'cargo-zigbuild' untuk kompilasi silang yang lebih mudah:".cyan());
102        println!("1. brew install zig");
103        println!("2. cargo install cargo-zigbuild");
104        println!("3. Gunakan '{}'", "cargo zigbuild --target <target>".white().on_black());
105    }
106}