use std::{ env, io::{self, Write}, path::PathBuf, process::Command, }; fn build_x86_64() { const DEFAULT_8086_AS: &str = "nasm"; const AP_BOOTSTRAP_S: &str = "src/arch/x86_64/boot/ap_boot.S"; println!("cargo:rerun-if-changed={}", AP_BOOTSTRAP_S); let out_dir = env::var("OUT_DIR").unwrap(); let assembler = env::var("AS8086").unwrap_or(DEFAULT_8086_AS.to_owned()); let ap_bootstrap_out = PathBuf::from(out_dir).join("__x86_64_ap_boot.bin"); // Assemble the code let output = Command::new(assembler.as_str()) .args([ "-fbin", "-o", ap_bootstrap_out.to_str().unwrap(), AP_BOOTSTRAP_S, ]) .output() .unwrap(); if !output.status.success() { io::stderr().write_all(&output.stderr).ok(); panic!("{}: could not assemble {}", assembler, AP_BOOTSTRAP_S); } } fn main() { let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); println!("cargo:rerun-if-changed=build.rs"); match arch.as_str() { "x86_64" => build_x86_64(), "aarch64" => (), _ => panic!("Unknown target arch: {:?}", arch), } }