configure do check_c_compiler "i686-elf-gcc" check_program "genext2fs" check_program "grub-mkstandalone" check_program "mformat", on_fail: "Install the mtools package" check_program "xorriso" check_cfg package: "freetype2", on_fail: "Install libfreetype-dev", use: "freetype" end build do require "tmpdir" # EFI (w/ GRUB) partition size (MiB) EFI_PART_SIZE = 8 # HOS partition size (MiB) HOS_PART_SIZE = 4 # Kernel default font size KFONT_SIZE = 12 class BiosImage < Builder def run(options) unless @cache.up_to_date?(@target, nil, @sources, @env) print_run_message("Generating BIOS boot image #{@target}", nil) Dir.mktmpdir do |tmpdir| # Create iso directory. FileUtils.mkdir_p("#{tmpdir}/iso/boot/grub") File.open("#{tmpdir}/iso/boot/grub/grub.cfg", "wb") do |fh| fh.write(<#{@target}", command, {}) end end end # FontGen Environment Environment.new(use: "freetype") do |env| env["CC"] = "gcc" env.Program("build/fontgen", glob("fontgen/**/*.c")) end # Kernel Environment Environment.new do |env| env.add_builder(EfiImage) env.add_builder(BiosImage) env.add_builder(FontGen) env["CCFLAGS"] += %w[-ffreestanding -Wall -O2] env["LDFLAGS"] += %w[-ffreestanding -nostdlib -T src/link.ld] env["LIBS"] += %w[gcc] env["OBJDUMP"] = "i686-elf-objdump" env.FontGen("^/kfont/kfont.c", "font/Hack-Regular.ttf") env["CPPPATH"] += ["#{env.build_root}/kfont"] env.Program("^/hos.elf", glob("src/**/*.{S,c}") + ["^/kfont/kfont.c"]) env.depends("#{env.build_root}/hos.elf", "src/link.ld") env.Disassemble("^/hos.elf.txt", "^/hos.elf") env.EfiImage("build/hos-efi.img", %w[^/hos.elf]) env.BiosImage("build/hos.img", %w[^/hos.elf]) end end