configure do check_d_compiler "ldc2" check_c_compiler "x86_64-w64-mingw32-gcc" check_program "mformat" end class Image < Builder def run(options) unless @cache.up_to_date?(@target, nil, @sources, @env) print_run_message("Image #{@target}", nil) File.binwrite(@target, "\0" * (1440 * 1024)) system(*%W[mformat -i #{@target} -f 1440 ::]) system(*%W[mmd -i #{@target} ::/EFI]) system(*%W[mmd -i #{@target} ::/EFI/BOOT]) system(*%W[mcopy -i #{@target} #{@sources.first} ::/EFI/BOOT]) @cache.register_build(@target, nil, @sources, @env) end true end end uefi_env = env "uefi" do |env| env.add_builder(Image) env["sources"] = glob("src/**/*.d") env["sources"] += glob("uefi-d/source/**/*.d") env["DFLAGS"] += %w[-mtriple=x86_64-unknown-windows-coff --betterC -release -O2] env["D_IMPORT_PATH"] += %w[uefi-d/source] env["LD"] = "x86_64-w64-mingw32-gcc" env["LDFLAGS"] += %w[-nostdlib -Wl,-dll -shared -Wl,--subsystem,10 -e efi_main] env["LDCMD"] = %w[${LD} -o ${_TARGET} ${LDFLAGS} ${_SOURCES} ${LIBDIRPREFIX}${LIBPATH} ${LIBLINKPREFIX}${LIBS}] env.Program("^/BOOTX64.EFI", "${sources}") env.Disassemble("^/BOOTX64.txt", "^/BOOTX64.EFI") env.Image("^/efi-loader.img", "^/BOOTX64.EFI") end task "run" do sh %W[qemu-system-x86_64 -bios OVMF.fd -hda #{uefi_env.expand("^/efi-loader.img")}] end