5916cc5011
Add support for building an hybrid ISO9660 image compatible with legacy and UEFI BIOS. Note that this is not about an (iso)hybrid image, which can boot from both a CDROM or a USB stick, but really about an image being bootable from the legay BIOS or EFI; the two are orthognal. The option -eltorito-alt-boot need to be used in the xorriso command to generate the hybrid image. That option is a separator, meaning the previous boot entry is done, and the following boot options define a new boot entry. The -no-emul-boot defines the type of the current boot image; that's why it has to now be repeated in each of the BIOS and EFI options. Finally, for symetry and consistency between the BIOS and EFI options, we move the BIOS image option first. Note: the BIOS boot image options have to be provided before the EFI ones, or the system won't boot; the underlying reason is not known... Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> [yann.morin.1998@free.fr: - note about hybrid vs. (iso)hybrid - explain -eltorito-alt-boot - explain duplication of -no-emul-boot - rename the variables - note about the BIOS-EFI ordering ] Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
198 lines
6.8 KiB
Makefile
198 lines
6.8 KiB
Makefile
################################################################################
|
|
#
|
|
# Build the iso96600 root filesystem image
|
|
#
|
|
################################################################################
|
|
|
|
#
|
|
# We need to handle three cases:
|
|
#
|
|
# 1. The ISO9660 filesystem will really be the real root filesystem
|
|
# itself. This is when BR2_TARGET_ROOTFS_ISO9660_INITRD is
|
|
# disabled.
|
|
#
|
|
# 2. The ISO9660 filesystem will be a filesystem with just a kernel
|
|
# image, initrd and grub. This is when
|
|
# BR2_TARGET_ROOTFS_ISO9660_INITRD is enabled, but
|
|
# BR2_TARGET_ROOTFS_INITRAMFS is disabled.
|
|
#
|
|
# 3. The ISO9660 filesystem will be a filesystem with just a kernel
|
|
# image and grub. This is like (2), except that the initrd is
|
|
# built into the kernel image. This is when
|
|
# BR2_TARGET_ROOTFS_INITRAMFS is enabled (regardless of the value
|
|
# of BR2_TARGET_ROOTFS_ISO9660_INITRD).
|
|
|
|
ROOTFS_ISO9660_BOOT_MENU = $(call qstrip,$(BR2_TARGET_ROOTFS_ISO9660_BOOT_MENU))
|
|
|
|
ROOTFS_ISO9660_DEPENDENCIES = host-xorriso linux
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y)
|
|
ROOTFS_ISO9660_USE_INITRD = YES
|
|
endif
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_INITRD),y)
|
|
ROOTFS_ISO9660_USE_INITRD = YES
|
|
endif
|
|
|
|
ifeq ($(ROOTFS_ISO9660_USE_INITRD),YES)
|
|
ROOTFS_ISO9660_TMP_TARGET_DIR = $(FS_DIR)/rootfs.iso9660.tmp
|
|
define ROOTFS_ISO9660_CREATE_TEMPDIR
|
|
$(RM) -rf $(ROOTFS_ISO9660_TMP_TARGET_DIR)
|
|
mkdir -p $(ROOTFS_ISO9660_TMP_TARGET_DIR)
|
|
endef
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_CREATE_TEMPDIR
|
|
else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION),y)
|
|
ROOTFS_ISO9660_DEPENDENCIES += host-zisofs-tools
|
|
ROOTFS_ISO9660_TMP_TARGET_DIR = $(FS_DIR)/rootfs.iso9660.tmp
|
|
# This must be early, before we copy the bootloader files.
|
|
define ROOTFS_ISO9660_MKZFTREE
|
|
$(RM) -rf $(ROOTFS_ISO9660_TMP_TARGET_DIR)
|
|
$(HOST_DIR)/bin/mkzftree -X -z 9 -p $(PARALLEL_JOBS) \
|
|
$(TARGET_DIR) \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)
|
|
endef
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_MKZFTREE
|
|
ROOTFS_ISO9660_OPTS += -z
|
|
else
|
|
ROOTFS_ISO9660_TMP_TARGET_DIR = $(TARGET_DIR)
|
|
endif
|
|
|
|
ifeq ($(BR2_REPRODUCIBLE),y)
|
|
ROOTFS_ISO9660_VFAT_OPTS = --invariant
|
|
ROOTFS_ISO9660_FIX_TIME = touch -d @$(SOURCE_DATE_EPOCH)
|
|
else
|
|
ROOTFS_ISO9660_FIX_TIME = :
|
|
endif
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_GRUB2)$(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),yy)
|
|
ROOTFS_ISO9660_DEPENDENCIES += grub2
|
|
ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg
|
|
ROOTFS_ISO9660_BOOT_IMAGE = boot/grub/grub-eltorito.img
|
|
define ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS
|
|
$(INSTALL) -D -m 0644 $(BINARIES_DIR)/grub-eltorito.img \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub-eltorito.img
|
|
endef
|
|
endif
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_GRUB2)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy)
|
|
ROOTFS_ISO9660_DEPENDENCIES += grub2 host-dosfstools host-mtools
|
|
ROOTFS_ISO9660_EFI_PARTITION = boot/fat.efi
|
|
ROOTFS_ISO9660_EFI_PARTITION_PATH = $(ROOTFS_ISO9660_TMP_TARGET_DIR)/$(ROOTFS_ISO9660_EFI_PARTITION)
|
|
ROOTFS_ISO9660_EFI_PARTITION_CONTENT = $(BINARIES_DIR)/efi-part
|
|
ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/grub/grub.cfg
|
|
define ROOTFS_ISO9660_INSTALL_BOOTLOADER_EFI
|
|
rm -rf $(ROOTFS_ISO9660_EFI_PARTITION_PATH)
|
|
mkdir -p $(dir $(ROOTFS_ISO9660_EFI_PARTITION_PATH))
|
|
dd if=/dev/zero of=$(ROOTFS_ISO9660_EFI_PARTITION_PATH) bs=1M count=1
|
|
$(HOST_DIR)/sbin/mkfs.vfat $(ROOTFS_ISO9660_VFAT_OPTS) $(ROOTFS_ISO9660_EFI_PARTITION_PATH)
|
|
$(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/*
|
|
$(HOST_DIR)/bin/mcopy -p -m -i $(ROOTFS_ISO9660_EFI_PARTITION_PATH) -s \
|
|
$(ROOTFS_ISO9660_EFI_PARTITION_CONTENT)/* ::/
|
|
$(ROOTFS_ISO9660_FIX_TIME) $(ROOTFS_ISO9660_EFI_PARTITION_PATH)
|
|
endef
|
|
endif
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_ISOLINUX),y)
|
|
ROOTFS_ISO9660_DEPENDENCIES += syslinux
|
|
ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH = \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/isolinux.cfg
|
|
ROOTFS_ISO9660_BOOT_IMAGE = isolinux/isolinux.bin
|
|
define ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS
|
|
$(INSTALL) -D -m 0644 $(BINARIES_DIR)/syslinux/* \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/
|
|
$(INSTALL) -D -m 0644 $(HOST_DIR)/share/syslinux/ldlinux.c32 \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/isolinux/ldlinux.c32
|
|
endef
|
|
endif
|
|
|
|
define ROOTFS_ISO9660_PREPARATION
|
|
$(INSTALL) -D -m 0644 $(ROOTFS_ISO9660_BOOT_MENU) \
|
|
$(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH)
|
|
$(SED) "s%__KERNEL_PATH__%/boot/$(LINUX_IMAGE_NAME)%" \
|
|
$(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH)
|
|
$(ROOTFS_ISO9660_INSTALL_BOOTLOADER_BIOS)
|
|
$(ROOTFS_ISO9660_INSTALL_BOOTLOADER_EFI)
|
|
endef
|
|
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_PREPARATION
|
|
|
|
define ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD
|
|
$(SED) '/__INITRD_PATH__/d' $(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH)
|
|
endef
|
|
|
|
# Copy the kernel to temporary filesystem
|
|
define ROOTFS_ISO9660_COPY_KERNEL
|
|
$(INSTALL) -D -m 0644 $(LINUX_IMAGE_PATH) \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/$(LINUX_IMAGE_NAME)
|
|
endef
|
|
|
|
ifeq ($(ROOTFS_ISO9660_USE_INITRD),YES)
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_KERNEL
|
|
|
|
# If initramfs is used, disable loading the initrd as the rootfs is
|
|
# already inside the kernel image. Otherwise, make sure a cpio is
|
|
# generated and use it as the initrd.
|
|
ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y)
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD
|
|
else
|
|
ROOTFS_ISO9660_DEPENDENCIES += rootfs-cpio
|
|
define ROOTFS_ISO9660_COPY_INITRD
|
|
$(INSTALL) -D -m 0644 $(BINARIES_DIR)/rootfs.cpio$(ROOTFS_CPIO_COMPRESS_EXT) \
|
|
$(ROOTFS_ISO9660_TMP_TARGET_DIR)/boot/initrd
|
|
$(SED) "s%__INITRD_PATH__%/boot/initrd%" \
|
|
$(ROOTFS_ISO9660_BOOTLOADER_CONFIG_PATH)
|
|
endef
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_INITRD
|
|
endif
|
|
|
|
else # ROOTFS_ISO9660_USE_INITRD
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_TRANSPARENT_COMPRESSION),y)
|
|
# We must use the uncompressed kernel image
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_COPY_KERNEL
|
|
endif
|
|
|
|
ROOTFS_ISO9660_PRE_GEN_HOOKS += ROOTFS_ISO9660_DISABLE_EXTERNAL_INITRD
|
|
|
|
endif # ROOTFS_ISO9660_USE_INITRD
|
|
|
|
ROOTFS_ISO9660_OPTS += -J -R
|
|
|
|
ROOTFS_ISO9660_OPTS_BIOS = \
|
|
-b $(ROOTFS_ISO9660_BOOT_IMAGE) \
|
|
-no-emul-boot \
|
|
-boot-load-size 4 \
|
|
-boot-info-table
|
|
|
|
ROOTFS_ISO9660_OPTS_EFI = \
|
|
--efi-boot $(ROOTFS_ISO9660_EFI_PARTITION) \
|
|
-no-emul-boot
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER)$(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),yy)
|
|
ROOTFS_ISO9660_OPTS += \
|
|
$(ROOTFS_ISO9660_OPTS_BIOS) \
|
|
-eltorito-alt-boot \
|
|
$(ROOTFS_ISO9660_OPTS_EFI)
|
|
else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_BIOS_BOOTLOADER),y)
|
|
ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_BIOS)
|
|
else ifeq ($(BR2_TARGET_ROOTFS_ISO9660_EFI_BOOTLOADER),y)
|
|
ROOTFS_ISO9660_OPTS += $(ROOTFS_ISO9660_OPTS_EFI)
|
|
endif
|
|
|
|
define ROOTFS_ISO9660_CMD
|
|
$(HOST_DIR)/bin/xorriso -as mkisofs \
|
|
$(ROOTFS_ISO9660_OPTS) \
|
|
-o $@ $(ROOTFS_ISO9660_TMP_TARGET_DIR)
|
|
endef
|
|
|
|
ifeq ($(BR2_TARGET_ROOTFS_ISO9660_HYBRID),y)
|
|
define ROOTFS_ISO9660_GEN_HYBRID
|
|
$(HOST_DIR)/bin/isohybrid -t 0x96 $@
|
|
endef
|
|
|
|
ROOTFS_ISO9660_POST_GEN_HOOKS += ROOTFS_ISO9660_GEN_HYBRID
|
|
endif
|
|
|
|
$(eval $(rootfs))
|