#![allow(unused)]
use std::fs;
use std::collections::HashMap;
use ospre::util;
use ospre::compile::compile;
use ospre::makedisk::make;
use ospre::bootloader;
use std::env;
fn main(){
std::panic::set_hook(Box::new(my_panic_hook));
let os_path=util::analyze_kernel_path();
if os_path==""{
panic!("请在命令行传入内核程序路径,例如: kernel=kernel_file_path/kernel.elf")
}
if let Err(e)=create_batch(){
panic!("创建临时文件失败:{:?}",e);
};
compile(os_path.as_str());
make_image(os_path.as_str());
if let Err(e)=fs::remove_dir_all("ospre"){
panic!("删除临时文件失败{}",e);
}
}
fn create_batch()->std::io::Result<()>{
fs::create_dir("ospre")?;
fs::create_dir("ospre/bin")?;
fs::create_dir("ospre/boot")?;
fs::create_dir("ospre/loader")?;
fs::create_dir("ospre/common")?;
let boot_asm="ospre/boot/boot.asm";
let loader_asm="ospre/loader/loader.asm";
let loader2_asm="ospre/loader/loader2.asm";
let boot_loader_equ="ospre/common/boot_loader_equ.asm";
let lba28="ospre/common/LBA28.asm";
util::create_tmp_file(boot_asm,bootloader::boot::boot());
util::create_tmp_file(loader_asm,bootloader::loader::loader());
util::create_tmp_file(loader2_asm,bootloader::loader::loader2());
util::create_tmp_file(boot_loader_equ,bootloader::common::equs());
util::create_tmp_file(lba28,bootloader::common::lba28());
Ok(())
}
fn make_image(os_path:&str)->std::io::Result<()>{
let boot_bin="ospre/bin/boot.bin";
let loader_bin="ospre/bin/loader.bin";
let loader2_bin="ospre/bin/loader2.bin";
let mut file_block:HashMap<&str, u64> = HashMap::new(); file_block.insert(boot_bin,0);
file_block.insert(loader_bin,10);
file_block.insert(loader2_bin,100);
file_block.insert(os_path,200);
make(&file_block)?;
Ok(())
}
fn my_panic_hook(info: &std::panic::PanicInfo<'_>) {
println!("\x1b[31m{}\x1b[0m","发生错误:");
println!("\x1b[31m{}\x1b[0m", info);
fs::remove_dir_all("ospre");
std::process::exit(0);
}