2017-09-06 19:19:45 +08:00
#
# Copyright (C) 2006-2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
i n c l u d e $( TOPDIR ) / r u l e s . m k
i n c l u d e $( INCLUDE_DIR ) / i m a g e . m k
export PATH = $( TARGET_PATH) :/sbin
GRUB2_MODULES = biosdisk boot chain configfile ext2 linux ls part_msdos reboot serial vga
2017-10-20 13:23:12 +08:00
GRUB2_MODULES_LEGACY = $( GRUB2_MODULES)
GRUB2_MODULES_LEGACY += part_gpt search fat exfat
GRUB2_MODULES_EFI = boot chain configfile ext2 linux ls part_msdos reboot serial part_gpt part_msdos search fat exfat ext2 efi_gop efi_uga gfxterm
2017-09-06 19:19:45 +08:00
GRUB2_MODULES_ISO = biosdisk boot chain configfile iso9660 linux ls part_msdos reboot serial vga
GRUB_TERMINALS =
GRUB_SERIAL_CONFIG =
GRUB_TERMINAL_CONFIG =
GRUB_CONSOLE_CMDLINE =
GRUB_ROOT = hd0,msdos1
USE_ATKBD = generic 64
i f n e q ( $( strip $ ( foreach subtarget ,$ ( USE_ATKBD ) ,$ ( CONFIG_TARGET_x 86_ $ ( subtarget ) ) ) ) , )
GRUB2_MODULES += at_keyboard
GRUB2_MODULES_ISO += at_keyboard
e n d i f
i f n e q ( $( CONFIG_GRUB_CONSOLE ) , )
GRUB_CONSOLE_CMDLINE += console = tty0
GRUB_TERMINALS += console
e n d i f
GRUB_SERIAL := $( call qstrip,$( CONFIG_GRUB_SERIAL) )
i f n e q ( $( GRUB_SERIAL ) , )
GRUB_CONSOLE_CMDLINE += console = $( GRUB_SERIAL) ,$( CONFIG_GRUB_BAUDRATE) n8$( if $( CONFIG_GRUB_FLOWCONTROL) ,r,)
GRUB_SERIAL_CONFIG := serial --unit= 0 --speed= $( CONFIG_GRUB_BAUDRATE) --word= 8 --parity= no --stop= 1 --rtscts= $( if $( CONFIG_GRUB_FLOWCONTROL) ,on,off)
GRUB_TERMINALS += serial
e n d i f
i f n e q ( $( GRUB_TERMINALS ) , )
GRUB_TERMINAL_CONFIG := terminal_input $( GRUB_TERMINALS) ; terminal_output $( GRUB_TERMINALS)
e n d i f
SIGNATURE := $( shell perl -e 'printf("%08x", rand(0xFFFFFFFF))' )
2017-10-20 13:23:12 +08:00
EFI_SIGNATURE := $( shell perl -e 'printf("%08x-%04x-%04x-%04x-%06x%06x", rand(0xFFFFFFFF), rand(0xFFFF), rand(0xFFFF), rand(0xFFFF), rand(0xFFFFFF), rand(0xFFFFFF))' )
2017-09-06 19:19:45 +08:00
ROOTPART := $( call qstrip,$( CONFIG_TARGET_ROOTFS_PARTNAME) )
ROOTPART := $( if $( ROOTPART) ,$( ROOTPART) ,PARTUUID= $( SIGNATURE) -02)
GRUB_TIMEOUT := $( call qstrip,$( CONFIG_GRUB_TIMEOUT) )
i f n e q ( $( CONFIG_TARGET_x 86_xen_domu ) , )
GRUB_ROOT = xen/xvda,msdos1
e n d i f
2017-10-20 13:23:12 +08:00
i f n e q ( $( CONFIG_GRUB_IMAGES ) $( CONFIG_EFI_IMAGES ) , )
2017-09-06 19:19:45 +08:00
BOOTOPTS:= $( call qstrip,$( CONFIG_GRUB_BOOTOPTS) )
define Image/cmdline/ext4
root = $( ROOTPART) rootfstype = ext4 rootwait
endef
define Image/cmdline/squashfs
root = $( ROOTPART) rootfstype = squashfs rootwait
endef
2017-10-20 13:23:12 +08:00
ifneq ( $( CONFIG_EFI_IMAGES) ,)
define Image/cmdline/efi
$( subst $( SIGNATURE) -02,$2 ,$( call Image/cmdline/$( 1) ) )
endef
define Image/Build/efi
# left here because the image builder doesnt need these
rm -rf $( KDIR) /root.grub/ || true
$( INSTALL_DIR) $( KDIR) /root.grub/boot/grub $( KDIR) /grub2
$( CP) $( KDIR) /bzImage $( KDIR) /root.grub/boot/vmlinuz
echo '(hd0) $(BIN_DIR)/$(IMG_PREFIX)-uefi-gpt-$(1).img' > $( KDIR) /grub2/device.map
sed \
-e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
-e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
-e 's#@CMDLINE@#$(strip $(call Image/cmdline/efi,$(1),$(EFI_SIGNATURE)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
-e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
-e 's#set root.*#search --file /boot/grub/$(SIGNATURE).cfg --set=root#g' \
./grub.cfg > $( KDIR) /root.grub/boot/grub/grub.cfg
$( CP) $( KDIR) /root.grub/boot/grub/grub.cfg $( KDIR) /root.grub/boot/grub/$( SIGNATURE) .cfg
grub-mkimage \
-d $( STAGING_DIR_HOST) /lib/grub/i386-pc \
-o $( KDIR) /grub2/core.img \
-O i386-pc \
-p '(hd0,gpt1)/boot/grub' \
-c $( KDIR) /root.grub/boot/grub/grub.cfg \
$( GRUB2_MODULES_LEGACY)
$( CP) $( STAGING_DIR_HOST) /lib/grub/i386-pc/*.img $( KDIR) /grub2/
# Build the efi grub version
rm -rf $( KDIR) /grub2.efi/ || true
$( INSTALL_DIR) $( KDIR) /grub2.efi/efi/boot/
# Generate the grub search root config (grub will search for the $(SIGNATURE).cfg file placed on the boot partition as grub does not support search of GPT UUID yet)
echo " search --file /boot/grub/ $( SIGNATURE) .cfg --set=root " > $( KDIR) /grub2.efi/efi/boot/grub.cfg
echo "configfile /boot/grub/grub.cfg" >> $( KDIR) /grub2.efi/efi/boot/grub.cfg
# Create the EFI grub binary
grub-mkimage-efi \
-d $( STAGING_DIR_HOST) /lib/grub/x86_64-efi \
-o $( KDIR) /grub2.efi/efi/boot/bootx64.efi \
-O x86_64-efi \
-p /efi/boot \
-c $( KDIR) /grub2.efi/efi/boot/grub.cfg \
$( GRUB2_MODULES_EFI)
# Generate the EFI VFAT bootfs
rm $( KDIR) /kernel.efi || true
mkfs.fat -C $( KDIR) /kernel.efi -S 512 1024
mcopy -s -i " $( KDIR) /kernel.efi " $( KDIR) /grub2.efi/* ::/
SIGNATURE = " $( SIGNATURE) " PATH = " $( TARGET_PATH) " ./gen_image_efi.sh \
$( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .img \
$( CONFIG_TARGET_KERNEL_PARTSIZE) $( KDIR) /root.grub \
1 $( KDIR) /kernel.efi \
1 \
$( CONFIG_TARGET_ROOTFS_PARTSIZE) $( KDIR) /root.$( 1) \
256
# Setup legacy bios for hybrid MBR (optional)
grub-bios-setup \
--device-map= " $( KDIR) /grub2/device.map " \
-d " $( KDIR) /grub2 " \
-r "hd0,msdos1" \
" $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
# Convert the MBR partition to GPT and set EFI ROOTFS signature
dd if = /dev/zero of = " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img " bs = 512 count = 33 conv = notrunc oflag = append
sgdisk -g " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
sgdisk -t 2:EF00 " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
sgdisk -t 3:EF02 " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
sgdisk -u 4:$( EFI_SIGNATURE) " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
sgdisk -h " $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
# Setup EFI grub
grub-bios-setup-efi \
--device-map= " $( KDIR) /grub2/device.map " \
-d " $( KDIR) /grub2 " \
-r "hd0,gpt1" \
" $( BIN_DIR) / $( IMG_PREFIX) -uefi-gpt- $( 1) .img "
endef
endif
ifneq ( $( CONFIG_GRUB_IMAGES) ,)
2017-09-06 19:19:45 +08:00
define Image/Build/grub2
# left here because the image builder doesnt need these
$( INSTALL_DIR) $( KDIR) /root.grub/boot/grub $( KDIR) /grub2
$( CP) $( KDIR) /bzImage $( KDIR) /root.grub/boot/vmlinuz
grub-mkimage \
-p /boot/grub \
-d $( STAGING_DIR_HOST) /lib/grub/i386-pc \
-o $( KDIR) /grub2/core.img \
-O i386-pc \
-c ./grub-early.cfg \
$( GRUB2_MODULES)
$( CP) $( STAGING_DIR_HOST) /lib/grub/i386-pc/*.img $( KDIR) /grub2/
echo '(hd0) $(BIN_DIR)/$(IMG_PREFIX)-combined-$(1).img' > $( KDIR) /grub2/device.map
sed \
-e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
-e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
-e 's#@CMDLINE@#$(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
-e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
-e 's#@ROOT@#$(GRUB_ROOT)#g' \
./grub.cfg > $( KDIR) /root.grub/boot/grub/grub.cfg
PADDING = " $( CONFIG_TARGET_IMAGES_PAD) " SIGNATURE = " $( SIGNATURE) " PATH = " $( TARGET_PATH) " $( SCRIPT_DIR) /gen_image_generic.sh \
$( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .img \
$( CONFIG_TARGET_KERNEL_PARTSIZE) $( KDIR) /root.grub \
$( CONFIG_TARGET_ROOTFS_PARTSIZE) $( KDIR) /root.$( 1) \
256
grub-bios-setup \
--device-map= " $( KDIR) /grub2/device.map " \
-d " $( KDIR) /grub2 " \
-r "hd0,msdos1" \
" $( BIN_DIR) / $( IMG_PREFIX) -combined- $( 1) .img "
endef
2017-10-20 13:23:12 +08:00
endif
2017-09-06 19:19:45 +08:00
e n d i f
d e f i n e I m a g e / B u i l d / s q u a s h f s
dd if = /dev/zero bs = 128k count = 1 >> $( KDIR) /root.squashfs
e n d e f
d e f i n e I m a g e / B u i l d / i s o
$( INSTALL_DIR) $( KDIR) /root.grub/boot/grub $( KDIR) /grub2
$( CP) $( KDIR) /bzImage $( KDIR) /root.grub/boot/vmlinuz
grub-mkimage \
-p /boot/grub \
-d $( STAGING_DIR_HOST) /lib/grub/i386-pc \
-o $( KDIR) /grub2/eltorito.img \
-O i386-pc \
-c ./grub-early.cfg \
$( GRUB2_MODULES_ISO)
cat \
$( STAGING_DIR_HOST) /lib/grub/i386-pc/cdboot.img \
$( KDIR) /grub2/eltorito.img \
> $( KDIR) /root.grub/boot/grub/eltorito.img
sed \
-e 's#@SERIAL_CONFIG@#$(strip $(GRUB_SERIAL_CONFIG))#g' \
-e 's#@TERMINAL_CONFIG@#$(strip $(GRUB_TERMINAL_CONFIG))#g' \
-e 's#@CMDLINE@#root=/dev/sr0 rootfstype=iso9660 rootwait $(strip $(call Image/cmdline/$(1)) $(BOOTOPTS) $(GRUB_CONSOLE_CMDLINE))#g' \
-e 's#@TIMEOUT@#$(GRUB_TIMEOUT)#g' \
./grub-iso.cfg > $( KDIR) /root.grub/boot/grub/grub.cfg
mkisofs -R -b boot/grub/eltorito.img -no-emul-boot -boot-info-table \
-o $( KDIR) /root.iso $( KDIR) /root.grub $( TARGET_DIR)
e n d e f
i f n e q ( $( CONFIG_VDI_IMAGES ) , )
define Image/Build/vdi
rm $( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .vdi || true
qemu-img convert -f raw -O vdi \
$( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .img \
$( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .vdi
# XXX: VBoxManage insists on setting perms to 0600
chmod 0644 $( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .vdi
endef
2017-10-20 13:23:12 +08:00
define Image/Build/vdi_efi
rm $( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .vdi || true
qemu-img convert -f raw -O vdi \
$( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .img \
$( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .vdi
# XXX: VBoxManage insists on setting perms to 0600
chmod 0644 $( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .vdi
endef
2017-09-06 19:19:45 +08:00
e n d i f
i f n e q ( $( CONFIG_VMDK_IMAGES ) , )
define Image/Build/vmdk
rm $( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .vmdk || true
qemu-img convert -f raw -O vmdk \
$( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .img \
$( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .vmdk
endef
2017-10-20 13:23:12 +08:00
define Image/Build/vmdk_efi
rm $( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .vmdk || true
qemu-img convert -f raw -O vmdk \
$( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .img \
$( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .vmdk
endef
2017-09-06 19:19:45 +08:00
e n d i f
d e f i n e I m a g e / B u i l d / g z i p
gzip -f9n $( BIN_DIR) /$( IMG_PREFIX) -rootfs-$( 1) .img
2017-10-20 13:23:12 +08:00
i f n e q ( $( CONFIG_GRUB_IMAGES ) , )
gzip -f9n $( BIN_DIR) /$( IMG_PREFIX) -combined-$( 1) .img
e n d i f
i f n e q ( $( CONFIG_EFI_IMAGES ) , )
gzip -f9n $( BIN_DIR) /$( IMG_PREFIX) -uefi-gpt-$( 1) .img
e n d i f
2017-09-06 19:19:45 +08:00
e n d e f
i f n e q ( $( CONFIG_TARGET_IMAGES_GZIP ) , )
define Image/Build/gzip/ext4
$( call Image/Build/gzip,ext4)
endef
define Image/Build/gzip/squashfs
$( call Image/Build/gzip,squashfs)
endef
e n d i f
d e f i n e I m a g e / B u i l d K e r n e l
$( CP) $( KDIR) /bzImage $( BIN_DIR) /$( IMG_PREFIX) -vmlinuz
e n d e f
d e f i n e I m a g e / P r e p a r e
$( call Image/Prepare/grub2)
e n d e f
d e f i n e I m a g e / B u i l d / I n i t r a m f s
$( CP) $( KDIR) /bzImage-initramfs $( BIN_DIR) /$( IMG_PREFIX) -ramfs.bzImage
e n d e f
d e f i n e I m a g e / B u i l d
$( call Image/Build/$( 1) )
ifneq ( $( 1) ,iso)
$( call Image/Build/grub2,$( 1) )
2017-10-20 13:23:12 +08:00
$( call Image/Build/efi,$( 1) )
i f n e q ( $( CONFIG_GRUB_IMAGES ) , )
2017-09-06 19:19:45 +08:00
$( call Image/Build/vdi,$( 1) )
$( call Image/Build/vmdk,$( 1) )
2017-10-20 13:23:12 +08:00
e n d i f
i f n e q ( $( CONFIG_EFI_IMAGES ) , )
$( call Image/Build/vdi_efi,$( 1) )
$( call Image/Build/vmdk_efi,$( 1) )
e n d i f
2017-09-06 19:19:45 +08:00
$( CP) $( KDIR) /root.$( 1) $( BIN_DIR) /$( IMG_PREFIX) -rootfs-$( 1) .img
else
$( CP) $( KDIR) /root.iso $( BIN_DIR) /$( IMG_PREFIX) .iso
endif
$( CP) $( KDIR) /bzImage $( BIN_DIR) /$( IMG_PREFIX) -vmlinuz
$( call Image/Build/gzip/$( 1) )
i f e q ( $( CONFIG_TARGET_ROOTFS_INITRAMFS ) , y )
$( call Image/Build/Initramfs)
e n d i f
e n d e f
$( eval $ ( call BuildImage ) )