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 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, };
34
35 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 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}