mirror of
				https://git.launchpad.net/livecd-rootfs
				synced 2025-11-04 10:54:07 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
## live-build(7) - System Build Scripts
 | 
						|
## Copyright (C) 2006-2012 Daniel Baumann <daniel@debian.org>
 | 
						|
##
 | 
						|
## 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
 | 
						|
( . "${LIVE_BUILD}/scripts/build.sh" > /dev/null 2>&1 || true ) || . /usr/lib/live/build.sh
 | 
						|
 | 
						|
 | 
						|
# Automatically populating config tree
 | 
						|
if [ -x auto/config ] && [ ! -e .build/config ]
 | 
						|
then
 | 
						|
	Echo_message "Automatically populating config tree."
 | 
						|
	lb config
 | 
						|
fi
 | 
						|
 | 
						|
# Setting static variables
 | 
						|
DESCRIPTION="$(Echo 'build binary images')"
 | 
						|
HELP=""
 | 
						|
USAGE="${PROGRAM} [--force]"
 | 
						|
 | 
						|
Arguments "${@}"
 | 
						|
 | 
						|
# Reading configuration files
 | 
						|
Read_conffiles config/all config/common config/bootstrap config/chroot config/binary config/source
 | 
						|
Set_defaults
 | 
						|
 | 
						|
# Setup cleanup function
 | 
						|
Setup_cleanup
 | 
						|
 | 
						|
. config/functions
 | 
						|
 | 
						|
build_layered_squashfs() {
 | 
						|
	local pass=$1   # install|install_subpass|install_subpass_subsubpass|…
 | 
						|
	local prevpass=$2  # install|install_subpass|…
 | 
						|
	local prefix=$3 # 01-|02-|…
 | 
						|
	local lowerlayers=$4
 | 
						|
	shift 4 # restore ${*}
 | 
						|
 | 
						|
	# Cleanup root filesystem
 | 
						|
	lb binary_chroot ${*}
 | 
						|
 | 
						|
	# Building squashfs filesystem & manifest
 | 
						|
	base="${PWD}/livecd.${PROJECT}.${prefix}${pass}"
 | 
						|
	squashfs_f="${base}.squashfs"
 | 
						|
 | 
						|
	# We have already treated that pass
 | 
						|
	if [ -f "${squashfs_f}" ]; then
 | 
						|
		return
 | 
						|
	fi
 | 
						|
 | 
						|
	if [ -n "${lowerlayers}" ]; then
 | 
						|
		mount_overlay ${lowerlayers} "overlay.${pass}/" chroot/
 | 
						|
	else
 | 
						|
		# first pass
 | 
						|
		rmdir chroot 2>/dev/null||true
 | 
						|
		ln -s "overlay.${pass}/" chroot
 | 
						|
	fi
 | 
						|
 | 
						|
	# Full manifest until that PASS
 | 
						|
	squashfs_f_manifest="${base}.manifest"
 | 
						|
	create_manifest "chroot" "${squashfs_f_manifest}.full"
 | 
						|
 | 
						|
	# Delta manifest
 | 
						|
	diff -NU0 ${PWD}/livecd.${PROJECT}.[0-9][0-9]-${prevpass}.manifest.full ${squashfs_f_manifest}.full|grep -v ^@ > $squashfs_f_manifest
 | 
						|
 | 
						|
	squashfs_f_size="${base}.size"
 | 
						|
	du -B 1 -s "overlay.${pass}/" | cut -f1 > "${squashfs_f_size}"
 | 
						|
 | 
						|
	(cd "overlay.${pass}/" &&
 | 
						|
		mksquashfs . ${squashfs_f} \
 | 
						|
		-no-progress -xattrs -comp xz )
 | 
						|
 | 
						|
	if [ -n "${lowerlayers}" ]; then
 | 
						|
		umount chroot
 | 
						|
	else
 | 
						|
		rm chroot
 | 
						|
		mkdir chroot/
 | 
						|
	fi
 | 
						|
 | 
						|
	# Handle direct sublayer of current one
 | 
						|
	# Extract the name of the pass corresponding to the sublayer
 | 
						|
	for subpass in $(ls -d overlay.${pass}_* 2>/dev/null | sed -e "s/overlay\.\(${pass}_[^_]\+\).*/\1/"); do
 | 
						|
		lowerlayers_for_subpass="overlay.${pass}:${lowerlayers}"
 | 
						|
		lowerlayers_for_subpass="${lowerlayers_for_subpass%:}"
 | 
						|
		build_layered_squashfs "${subpass}" "${pass}" "${prefix}" "${lowerlayers_for_subpass}" ${*}
 | 
						|
	done
 | 
						|
}
 | 
						|
 | 
						|
CURPASS=1
 | 
						|
PREVPASS=""
 | 
						|
PASSPREFIX=""
 | 
						|
LOWER_LAYERS=""
 | 
						|
for _PASS in $PASSES
 | 
						|
do
 | 
						|
	PASSPREFIX="$(printf "%02g" $CURPASS)-"
 | 
						|
 | 
						|
	build_layered_squashfs "${_PASS}" "${PREVPASS}" "$PASSPREFIX" "${LOWER_LAYERS}" ${*}
 | 
						|
 | 
						|
	LOWER_LAYERS="overlay.${_PASS}:$LOWER_LAYERS"
 | 
						|
	LOWER_LAYERS="${LOWER_LAYERS%:}"
 | 
						|
	PREVPASS=${_PASS}
 | 
						|
	CURPASS=$(( CURPASS + 1 ))
 | 
						|
done
 | 
						|
 | 
						|
# remount last "main" pass on chroot for lb binary
 | 
						|
mount_overlay "${LOWER_LAYERS}" "overlay.${_PASS}/" chroot/
 | 
						|
 | 
						|
# Prepare initrd + kernel
 | 
						|
lb binary_linux-image ${*}
 | 
						|
 | 
						|
umount chroot/
 | 
						|
 | 
						|
# Full ISO manifest & size from last main PASS
 | 
						|
PREFIX="livecd.$PROJECT${SUBARCH:+-$SUBARCH}"
 | 
						|
cp "livecd.${PROJECT}.${PASSPREFIX}${_PASS}.size" "$PREFIX.size"
 | 
						|
cp "livecd.${PROJECT}.${PASSPREFIX}${_PASS}.manifest.full" "$PREFIX.manifest"
 | 
						|
 | 
						|
# Ubiquity-compatible removal manifest for ISO not using a layered-aware installer
 | 
						|
if [ -n "$(ls livecd.${PROJECT}.[0-9][0-9]-live.manifest.full 2>/dev/null)" ] && \
 | 
						|
   [ -n "$(ls livecd.${PROJECT}.[0-9][0-9]-install.manifest.full 2>/dev/null)" ]; then
 | 
						|
	echo "$(diff livecd.${PROJECT}.[0-9][0-9]-live.manifest.full livecd.${PROJECT}.[0-9][0-9]-install.manifest.full | awk '/^< / { print $2 }')" > livecd.${PROJECT}-manifest-remove
 | 
						|
fi
 | 
						|
 | 
						|
chmod 644 *.squashfs *.manifest* *.size
 |