Codebase list live-build / cc76d80 scripts / build / binary_iso
cc76d80

Tree @cc76d80 (Download .tar.gz)

binary_iso @cc76d80raw · history · blame

#!/bin/sh

## live-build(7) - System Build Scripts
## Copyright (C) 2006-2015 Daniel Baumann <[email protected]>
##
## This program comes with ABSOLUTELY NO WARRANTY; for details see COPYING.
## This is free software, and you are welcome to redistribute it
## under certain conditions; see COPYING for details.


set -e

# Including common functions
[ -e "${LIVE_BUILD}/scripts/build.sh" ] && . "${LIVE_BUILD}/scripts/build.sh" || . /usr/lib/live/build.sh

# Setting static variables
DESCRIPTION="$(Echo 'build iso binary image')"
HELP=""
USAGE="${PROGRAM} [--force]"

Arguments "${@}"

# Reading configuration files
Read_conffiles config/all config/common config/bootstrap config/chroot config/binary config/source
Set_defaults

case "${LIVE_IMAGE_TYPE}" in
	iso)
		IMAGE="${LIVE_IMAGE_NAME}-${LB_ARCHITECTURES}.iso"
		;;

	iso-hybrid)
		IMAGE="${LIVE_IMAGE_NAME}-${LB_ARCHITECTURES}.hybrid.iso"
		;;

	*)
		exit 0
		;;
esac

Echo_message "Begin building binary iso image..."

# Requiring stage file
Require_stagefile .build/config .build/bootstrap

# Checking stage file
Check_stagefile .build/binary_iso

# Checking lock file
Check_lockfile .lock

# Creating lock file
Create_lockfile .lock

# Checking depends
Check_package chroot /usr/bin/xorriso xorriso
Check_package chroot /usr/lib/ISOLINUX/isohdpfx.bin isolinux

# Restoring cache
Restore_cache cache/packages.binary

# Installing depends
Install_package

# Remove old iso image
if [ -f ${IMAGE} ]
then
	rm -f ${IMAGE}
fi

# Handle xorriso generic options
XORRISO_OPTIONS="-R -r -J -joliet-long -l -cache-inodes -iso-level 3"

# Handle xorriso live-build specific options
if [ "${LIVE_IMAGE_TYPE}" = "iso-hybrid" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16"
fi

if [ "${_QUIET}" = "true" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -quiet"
fi

if [ "${_VERBOSE}" = "true" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -v"
fi

if [ -n "${LB_ISO_APPLICATION}" ] && [ "${LB_ISO_APPLICATION}" != "none" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -A \"${LB_ISO_APPLICATION}\""
fi

if [ -n "${LB_ISO_PREPARER}" ] && [ "${LB_ISO_PREPARER}" != "none" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -p \"${LB_ISO_PREPARER}\""
fi

if [ -n "${LB_ISO_PUBLISHER}" ] && [ "${LB_ISO_PUBLISHER}" != "none" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -publisher \"${LB_ISO_PUBLISHER}\""
fi

if [ -n "${LB_ISO_VOLUME}" ] && [ "${LB_ISO_VOLUME}" != "none" ]
then
	XORRISO_OPTIONS="${XORRISO_OPTIONS} -V \"${LB_ISO_VOLUME}\""
fi

# Set an explicit modification date
XORRISO_OPTIONS="${XORRISO_OPTIONS} --modification-date=$(date --utc --date="@${SOURCE_DATE_EPOCH:-$(date +%s)}" +%Y%m%d%H%m%S00)"

OLDIFS="$IFS"
IFS=","
BOOTLOADER_NUMBER=0
for BOOTLOADER in ${LB_BOOTLOADERS}
do
	BOOTLOADER_NUMBER=$(expr ${BOOTLOADER_NUMBER} + 1)
	# Handle xorriso architecture specific options

	# If the bootloader number is greater or equal than 2 it means
	# we are not the first bootloader and thus we need to tell
	# mkisosfs to add an additional eltorito entry
	if [ ${BOOTLOADER_NUMBER} -ge 2 ]
	then
		XORRISO_OPTIONS="${XORRISO_OPTIONS} -eltorito-alt-boot "
	fi
	case "${BOOTLOADER}" in
		grub)
			XORRISO_OPTIONS="${XORRISO_OPTIONS} -no-emul-boot -boot-load-size 4 -boot-info-table"
			XORRISO_OPTIONS="${XORRISO_OPTIONS} -b boot/grub/stage2_eltorito"
			XORRISO_EXCLUDE="boot/grub/stage2_eltorito"
			;;

		grub-pc)
			XORRISO_OPTIONS="${XORRISO_OPTIONS} -no-emul-boot -boot-load-size 4 -boot-info-table"
			XORRISO_OPTIONS="${XORRISO_OPTIONS} -b boot/grub/grub_eltorito -J"
			XORRISO_EXCLUDE="boot/grub/grub_eltorito"
			;;

		syslinux)
			case "${LB_MODE}" in
				progress-linux)
					XORRISO_OPTIONS="${XORRISO_OPTIONS} -b boot/boot.bin -c boot/boot.cat"
					XORRISO_EXCLUDE="boot/boot.bin"
					;;

				*)
					XORRISO_OPTIONS="${XORRISO_OPTIONS} -b isolinux/isolinux.bin -c isolinux/boot.cat"
					XORRISO_EXCLUDE="isolinux/isolinux.bin"
					;;
			esac

			XORRISO_OPTIONS="${XORRISO_OPTIONS} -no-emul-boot -boot-load-size 4 -boot-info-table"
			;;

		grub-efi)
			if [ -e binary/boot/grub/efi.img ]
			then
				XORRISO_OPTIONS="${XORRISO_OPTIONS} --efi-boot boot/grub/efi.img"
				XORRISO_OPTIONS="${XORRISO_OPTIONS} -append_partition 2 0x01 binary/boot/grub/efi.img"
			else
				Echo "No EFI boot code to include in the ISO"
			fi
			;;

		*)
			Echo_warning "Bootloader on your architecture not yet supported by live-build."
			Echo_warning "This will produce a most likely not bootable image (Continuing in 5 seconds)."
			sleep 5
			;;
	esac

done
IFS="$OLDIFS"

#if [ "${LB_DEBIAN_INSTALLER}" != "live" ]
#then
#	XORRISO_OPTIONS="${XORRISO_OPTIONS} -m ${XORRISO_EXCLUDE}"
#fi

if [ "${LB_FIRST_BOOTLOADER}" = "grub-pc" ]
then

cat > binary.sh << EOF
#!/bin/sh

input_dir=/usr/lib/grub/i386-pc

# build core.img
core_img=\$(mktemp)
grub-mkimage -d \${input_dir} -o \${core_img} -O i386-pc biosdisk iso9660

# build grub_eltorito image
cat \${input_dir}/cdboot.img \${core_img} > binary/boot/grub/grub_eltorito

rm -f \${core_img}

for file in \${input_dir}/*.mod \${input_dir}/efiemu??.o \
	\${input_dir}/command.lst \${input_dir}/moddep.lst \${input_dir}/fs.lst \
	\${input_dir}/handler.lst \${input_dir}/parttool.lst
do
	if test -f "\$file"
	then
		cp -f "\$file" binary/boot/grub/i386-pc
	fi
done
EOF

else
	echo "#!/bin/sh" > binary.sh
fi

cat >> binary.sh << EOF

mkdir -p binary/.disk
xorriso -as mkisofs ${XORRISO_OPTIONS} -o ${IMAGE} binary
EOF

# retain the xorriso command used to create the image in the image itself
cat <<-EOF >binary/.disk/mkisofs
xorriso -as mkisofs ${XORRISO_OPTIONS} -o ${IMAGE} binary
EOF

case "${LB_BUILD_WITH_CHROOT}" in
	true)
		# Moving image
		mv binary.sh chroot
		mv binary chroot

		Chroot chroot "sh binary.sh"

		# Move image
		mv chroot/binary chroot/${IMAGE} ./
		rm -f chroot/binary.sh
		;;

	false)
		sh binary.sh
		rm -f binary.sh
		;;
esac

# Saving cache
Save_cache cache/packages.binary

# Removing depends
Remove_package

# Creating stage file
Create_stagefile .build/binary_iso