From 34b1eb4741f710b605da51c00da48a2bb5db0d69 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 1 May 2023 13:23:37 +0200 Subject: [PATCH] Create the disk image in a build script --- Cargo.toml | 2 ++ build.rs | 21 +++++++++++++++++++++ src/main.rs | 26 +++++++++----------------- 3 files changed, 32 insertions(+), 17 deletions(-) create mode 100644 build.rs diff --git a/Cargo.toml b/Cargo.toml index d48635a1..a566af24 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,5 +7,7 @@ edition = "2021" members = ["kernel"] [dependencies] + +[build-dependencies] kernel = { path = "kernel", artifact = "bin", target = "x86_64-unknown-none" } bootloader = "0.11.3" diff --git a/build.rs b/build.rs new file mode 100644 index 00000000..17275cef --- /dev/null +++ b/build.rs @@ -0,0 +1,21 @@ +use bootloader::DiskImageBuilder; +use std::{env, path::PathBuf}; + +fn main() { + // set by cargo for the kernel artifact dependency + let kernel_path = env::var("CARGO_BIN_FILE_KERNEL").unwrap(); + let disk_builder = DiskImageBuilder::new(PathBuf::from(kernel_path)); + + // specify output paths + let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); + let uefi_path = out_dir.join("blog_os-uefi.img"); + let bios_path = out_dir.join("blog_os-bios.img"); + + // create the disk images + disk_builder.create_uefi_image(&uefi_path).unwrap(); + disk_builder.create_bios_image(&bios_path).unwrap(); + + // pass the disk image paths via environment variables + println!("cargo:rustc-env=UEFI_IMAGE={}", uefi_path.display()); + println!("cargo:rustc-env=BIOS_IMAGE={}", bios_path.display()); +} diff --git a/src/main.rs b/src/main.rs index 78a8fa2b..693a1771 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,13 @@ -use bootloader::DiskImageBuilder; -use std::{env, error::Error, path::PathBuf}; +use std::{env, fs}; -fn main() -> Result<(), Box> { - // set by cargo for the kernel artifact dependency - let kernel_path = PathBuf::from(env!("CARGO_BIN_FILE_KERNEL")); - let disk_builder = DiskImageBuilder::new(kernel_path); +fn main() { + let current_exe = env::current_exe().unwrap(); + let uefi_target = current_exe.with_file_name("uefi.img"); + let bios_target = current_exe.with_file_name("bios.img"); - // place the disk image files under target/debug or target/release - let target_dir = env::current_exe()?; + fs::copy(env!("UEFI_IMAGE"), &uefi_target).unwrap(); + fs::copy(env!("BIOS_IMAGE"), &bios_target).unwrap(); - let uefi_path = target_dir.with_file_name("blog_os-uefi.img"); - disk_builder.create_uefi_image(&uefi_path)?; - println!("Created UEFI disk image at {}", uefi_path.display()); - - let bios_path = target_dir.with_file_name("blog_os-bios.img"); - disk_builder.create_bios_image(&bios_path)?; - println!("Created BIOS disk image at {}", bios_path.display()); - - Ok(()) + println!("UEFI disk image at {}", uefi_target.display()); + println!("BIOS disk image at {}", bios_target.display()); }