#!/bin/sh

source ../Config.sh

[ -x ${FW_TOPDIR}/bin/mkimage ] || {
    echo "u-boot must be built first!" >&2
    exit 1
}

LOCKFILE="/var/lock/make_image"
TAR_EXCLUDES="$PWD/tar-EXCLUDES"

cleanup() {
    exit_code=$?
    rm -f "${LOCKFILE}"
    rm -f "${TAR_EXCLUDES}"
    umount -f ${LOOP_DIR}
    rmdir ${LOOP_DIR}
    exit $exit_code
}

PATH="$PATH:/sbin:/usr/sbin"
IMAGE_SIZE="10240"
if [ "$PP_PRODUCT" = "kimtestermst" ]; then
    # empty space for uncompressing the bzip2'ed kernel
    let IMAGE_SIZE=$IMAGE_SIZE+2030
fi
FINAL_DIR="${DESTDIR}"
INITRD_DIR="${FW_TOPDIR}/mkfirmware"
LOOP_DIR="`mktemp -d /mnt.${PP_BOARD}.XXXXXX`"
LOOP_FILE="image.bin"
LOOP_DEV="`losetup -f`"
if test $? -eq 1 ; then 
	echo "Using default loop dev /dev/loop0."
	LOOP_DEV="/dev/loop0" 
fi

# make sure no one uses make_image currently
lockfile -2 -r 60 ${LOCKFILE} || exit 1
trap cleanup EXIT HUP INT TERM

if [ "${PP_BUILD_TYPE}" != "final" ]; then
	echo "Using make_image on a devel fs doesn't make sense."
	exit 1
fi	

if [ "$PP_BUILD_ARCH" = "powerpc" ]; then
	IMG_ARCH="ppc"
elif [ "$PP_BUILD_ARCH" = "arm" ]; then
        IMG_ARCH="arm"	
else
	echo "Unknown build architecture $PP_BUILD_ARCH"
	exit 1
fi
	
# init some things
mkdir -p "$LOOP_DIR"
umount "$LOOP_DIR" 2> /dev/null

# make a e2fs filesystem
dd if=/dev/zero of="$LOOP_FILE" bs=1k count=$IMAGE_SIZE

losetup "$LOOP_DEV" "$LOOP_FILE"
if [ $? != 0 ]; then
	echo "Cannot open loop device."
	exit 1
fi

mke2fs -O ^resize_inode -vm0 "$LOOP_DEV" $IMAGE_SIZE
losetup -d "$LOOP_DEV"

# create list of files that we do not want in the final firmware
rm -f "$TAR_EXCLUDES"
cd "$FINAL_DIR" && {
    find . -name "*.a" >> "$TAR_EXCLUDES" || exit 1
    find . -name "*.la" >> "$TAR_EXCLUDES" || exit 1
    find . -name "*.so" \
      -exec /bin/sh -c '(file -L {} | grep -q "shared object") || echo {}' \; \
      >> "$TAR_EXCLUDES" || exit 1
    find share/{aclocal*,autoconf*,automake*,libtool*} >> "$TAR_EXCLUDES" || exit 1
    sed -i 's,^\./,,' "$TAR_EXCLUDES" || exit 1
    cd -
} || exit 1
echo "./share" >> "$TAR_EXCLUDES"
echo "./include" >> "$TAR_EXCLUDES"
echo "./usr/include" >> "$TAR_EXCLUDES"
echo "./flashdisk/*" >> "$TAR_EXCLUDES"
echo ---- Excluding the following files ----
cat "$TAR_EXCLUDES"
echo ---------------------------------------

# mount the filesystem, copy the fs structure and unmount it
echo "Copying files from $FINAL_DIR to the ramdisk image ($LOOP_DIR)..."
mount -t ext2 -o loop=$LOOP_DEV "$LOOP_FILE" "$LOOP_DIR" || exit 1
tar -C "$FINAL_DIR" --exclude-from "$TAR_EXCLUDES" -cf - . | tar -C "$LOOP_DIR" -xf -
[ "${PIPESTATUS[0]}" != "0" -o "${PIPESTATUS[1]}" != "0" ] && exit 1
umount "$LOOP_DIR"

# compress the fs image
echo "Now compressing ramdisk image ..."
dd if="$LOOP_FILE" bs=1k count=$IMAGE_SIZE | \
	gzip -v9 > "$INITRD_DIR/$LOOP_FILE".gz

if [ -e ${INITRD_DIR}/initrd.bin ]; then
    mv ${INITRD_DIR}/initrd.bin ${INITRD_DIR}/initrd.bin.old
fi

${FW_TOPDIR}/bin/mkimage \
    -n "Ramdisk Image" -A $IMG_ARCH -O linux -T ramdisk -C gzip \
    -d "$INITRD_DIR/$LOOP_FILE".gz "$INITRD_DIR"/initrd.bin

rm -f "$INITRD_DIR/$LOOP_FILE"
rm -f "$INITRD_DIR/$LOOP_FILE".gz
