--- /dev/null
+fstype := ext4
+
+# Partition Table (1M) + Boot Partition Root Partition + Slack Space (1M)
+imagesize ?= 4096
+BOOT_MB := 127
+ROOT_MB := $(shell printf '%i\n' "$$(( ${imagesize} - ${BOOT_MB} - 2 ))")
+
+define PARTLAYOUT :=
+label: gpt
+: start=1MiB, size=${BOOT_MB}MiB, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, attrs="LegacyBIOSBootable"
+: size=${ROOT_MB}MiB, type=0FC63DAF-8483-4772-8E79-3D69D8477DE4
+endef
+
+define FSTAB :=
+LABEL=FSROOT / ${fstype} auto,nofail,rw 0 0
+LABEL=SYSTEM /boot/efi vfat auto,nofail,ro 0 0
+endef
+
+define GRUBCFG :=
+insmod normal
+insmod linux
+insmod all_video
+set timeout=3
+default=${release}
+
+menuentry 'Debian ${release}' --id '${release}' {
+ linux '/vmlinuz' root=LABEL=FSROOT
+ initrd '/initrd.img'
+}
+endef
+
+define GRUBINIT :=
+search --no-floppy --label FSROOT --set root
+set prefix=/boot/grub
+configfile grub.cfg
+endef
+
+VOLUME = ${image}
+PBOOT = part_boot.img.temp
+PROOT = part_root.img.temp
+CFGROOT := img_mount
+
+PACKAGES += grub-efi-amd64 grub-efi-ia32-bin
+
+_sparse: ${PBOOT} ${PROOT}
+_format: _sparse
+_partition_gpt: _sparse
+_partcopy: _format
+_img_mount: _partcopy _partition_gpt
+_copy: _img_mount
+_bootloader_efi: _config
+_umount: _config _bootloader_efi
+_target: _umount
+_clean: _hddimage_clean
+
+export VOLUME PBOOT PROOT PARTLAYOUT GRUBCFG GRUBINIT
+
+img_mount:
+ mkdir -p -m 755 "$@"
+ chmod 755 "$@"
+
+${VOLUME}: .FORCE
+ dd count=0 of="$${VOLUME}" # truncate
+ dd bs=1M count=0 seek=$$((2 + ${BOOT_MB} + ${ROOT_MB})) \
+ of="$${VOLUME}"
+ chmod g+w "$${VOLUME}"
+
+${PBOOT}: .FORCE
+ dd count=0 of="$${PBOOT}" # truncate
+ dd bs=1M count=0 seek=${BOOT_MB} of="$${PBOOT}"
+
+${PROOT}: .FORCE
+ dd count=0 of="$${PROOT}" # truncate
+ dd bs=1M count=0 seek=${ROOT_MB} of="$${PROOT}"
+
+_partition_gpt: ${VOLUME}
+ printf '%s\n' "$${PARTLAYOUT}" | sfdisk "$${VOLUME}"
+
+_format_root: ${PROOT}
+ mkfs.${fstype} -L FSROOT "$${PROOT}"
+
+_format_boot: ${PBOOT}
+ mkfs.fat -F 32 -n SYSTEM "$${PBOOT}"
+
+_format: _format_root _format_boot
+
+_grub_mbr: ${VOLUME}
+ grub-mkimage -p / -O i386-pc ${fstype} \
+ part_gpt normal linux all_video \
+ | dd conv=notrunc of="$${VOLUME}"
+
+${CFGROOT}/boot/efi/EFI/BOOT/BOOTIA32.EFI: _mount_boot
+ mkdir -p "$(@D)"
+ printf '%s\n' "$${GRUBINIT}" >"${@F}.temp"
+ grub-mkimage -p / -O i386-efi -o "$@" \
+ ext2 fat part_gpt configfile search_label search \
+ -c "${@F}.temp"
+ rm -- "${@F}.temp"
+
+${CFGROOT}/boot/efi/EFI/BOOT/BOOTX64.EFI: _mount_boot
+ mkdir -p "$(@D)"
+ printf '%s\n' "$${GRUBINIT}" >"${@F}.temp"
+ grub-mkimage -p / -O x86_64-efi -o "$@" \
+ ext2 fat part_gpt configfile search_label search \
+ -c "${@F}.temp"
+ rm -- "${@F}.temp"
+
+${CFGROOT}/boot/grub/grub.cfg: _copy
+ mkdir -p "$(@D)"
+ cp -a "$${CFGROOT}"/usr/lib/grub/x86_64-efi/. "$(@D)/x86_64-efi"
+ -cp -a "$${CFGROOT}"/usr/lib/grub/i386-efi/. "$(@D)/i386-efi"
+ printf '%s\n' "$${GRUBCFG}" >"$@"
+
+_bootloader_efi: ${CFGROOT}/boot/efi/EFI/BOOT/BOOTIA32.EFI
+_bootloader_efi: ${CFGROOT}/boot/efi/EFI/BOOT/BOOTX64.EFI
+_bootloader_efi: ${CFGROOT}/boot/grub/grub.cfg
+
+_partcopy: ${VOLUME} ${PROOT} ${PBOOT}
+ dd conv=notrunc,sparse bs=1M seek=1 \
+ if="$${PBOOT}" of="$${VOLUME}"
+ dd conv=notrunc,sparse bs=1M seek=$$((1 + ${BOOT_MB})) \
+ if="$${PROOT}" of="$${VOLUME}"
+ rm -- "$${PBOOT}" "$${PROOT}"
+
+_mount_root: ${CFGROOT}
+ mountpoint "$${CFGROOT}" \
+ || mount \
+ -o rw,loop,offset="$$((${BOOT_MB} + 1))"M,sizelimit=${ROOT_MB}M \
+ -t ${fstype} "$${VOLUME}" "$${CFGROOT}"
+ chmod 755 "$${CFGROOT}"
+
+_mount_boot: _mount_root
+ mkdir -p -m 755 "$${CFGROOT}/boot/efi"
+ mountpoint "$${CFGROOT}/boot/efi" \
+ || mount -o loop,offset=1M,sizelimit=${BOOT_MB}M \
+ -t vfat "$${VOLUME}" "$${CFGROOT}/boot/efi"
+
+_img_mount: _mount_boot _mount_root
+
+_umount_boot: _config
+ -umount "$${CFGROOT}/boot/efi"
+
+_umount_root: _umount_boot _config
+ -umount "$${CFGROOT}"
+ rmdir "$${CFGROOT}"
+
+_umount: _umount_boot _umount_root
+
+_hddimage_clean: _umount_boot _umount_root
+ -rm -- "$${PBOOT}"
+ -rm -- "$${PROOT}"
+ -rm -- "$${VOLUME}"