summaryrefslogtreecommitdiff
path: root/classes/concatenated-image.bbclass
blob: 5cf8d33c05866272e886b8579d53e01c7cb6494f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

#
# define the FLASH_KERNEL_SIZE and FLASH_ROOT_SIZE in your machine.conf,
# and this class builds a simple, padded concatenated image of 
# <kernel><padding><rootfs> and performs error checking that either
# kernel or rootfs isn't too large to fit.
#
concat_pack_image() {
	# find latest kernel - is there a more general way to do this?
        KERNEL=`ls -tr ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}* | tail -n 1`
	if [ -z "$KERNEL" ]; then
		oefatal "No kernel found in ${DEPLOY_DIR_IMAGE}.  Was expecting a ${KERNEL_IMAGETYPE}\* file."
		exit 1
	fi
	ROOTFS=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.jffs2
	OUTPUT=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.flash.img
	PADFILE=${DEPLOY_DIR_IMAGE}/padfile.zzz
	KERNEL_SIZE_MAX_DEC=`echo ${FLASH_KERNEL_SIZE} | awk --non-decimal-data '{printf "%d\n", $1}' `
	ROOT_SIZE_MAX_DEC=`echo ${FLASH_ROOT_SIZE} | awk --non-decimal-data '{printf "%d\n", $1}' `
	KERNEL_SIZE=`ls -l $KERNEL | awk '{print $5}'`
	if [ $KERNEL_SIZE -gt $KERNEL_SIZE_MAX_DEC ]; then
		oefatal "Kernel too large at $KERNEL_SIZE bytes.  Max is $KERNEL_SIZE_MAX_DEC."
		exit 1
	fi
	ROOT_SIZE=`ls -l $ROOTFS | awk '{print $5}'`
	if [ $ROOT_SIZE -gt $ROOT_SIZE_MAX_DEC ]; then
		oefatal "Rootfs is too large at $ROOT_SIZE bytes.  Max is $ROOT_SIZE_MAX_DEC."
		exit 1
	fi
	PAD_SIZE=`echo "$KERNEL_SIZE_MAX_DEC - $KERNEL_SIZE" | bc `
	dd if=/dev/zero of=$PADFILE bs=$PAD_SIZE count=1 2>>/dev/null
	cat $KERNEL $PADFILE $ROOTFS > $OUTPUT
	rm -f $PADFILE
	ls -l $OUTPUT
}

IMAGE_POSTPROCESS_COMMAND += "concat_pack_image; "