diff --git a/Rsconscript b/Rsconscript index d7f8655..c0afa23 100644 --- a/Rsconscript +++ b/Rsconscript @@ -10,6 +10,7 @@ configure do check_c_compiler "x86_64-elf-gcc", use: "x86_64-elf-gcc" check_c_compiler check_program "mformat", on_fail: "Install the mtools package" + check_program "parted" check_cfg package: "freetype2", on_fail: "Install libfreetype-dev", use: "freetype" sh %w[git submodule update --init] end @@ -17,6 +18,12 @@ end # Kernel default font size. KFONT_SIZE = 18 +# One kilobyte. +KB = 1024 + +# One megabyte. +MB = 1024 * 1024 + class HulkBinObj < Builder def run(options) FileUtils.mkdir_p(File.dirname(@target)) @@ -38,15 +45,24 @@ EOF end end +# Create a GPT disk image with an EFI partition containing the EFI image. class Image < Builder def run(options) unless @cache.up_to_date?(@target, nil, @sources, @env) print_run_message("Creating disk image #{@target}", nil) - File.binwrite(@target, "\0" * (1440 * 1024)) - system(*%W[mformat -i #{@target} -f 1440 ::]) + efi_image_size = File.stat(@sources.first).size + efi_image_size_mb = (efi_image_size + MB - 1) / MB + partition_size_mb = efi_image_size_mb + 1 + empty_mb = "\0".b * MB + File.binwrite(@target, empty_mb * partition_size_mb) + system(*%W[mformat -i #{@target} ::]) system(*%W[mmd -i #{@target} ::/EFI]) system(*%W[mmd -i #{@target} ::/EFI/BOOT]) system(*%W[mcopy -i #{@target} #{@sources.first} ::/EFI/BOOT]) + partition_contents = File.binread(@target) + disk_image = empty_mb + partition_contents + empty_mb + File.binwrite(@target, disk_image) + system(*%W[parted --script #{@target} mklabel gpt mkpart HOS fat32 1MiB #{partition_size_mb + 1}MiB]) @cache.register_build(@target, nil, @sources, @env) end true