Blob Blame History Raw
#!/bin/sh

usage()
{
	cat << EOF

USAGE:
  --target  TARGEET            target triplet
  --subset  SUBSET             the name of a file containing a list of packages
                               to be added to the distribution; otherwise,
                               the name of a project-provided subset; multiple
                               subsets are allowed and may overlap in one or
                               more packages

  --minroot MINIPIX_ROOT       location of the top-level minipix directory
  --objroot OBJECT_ROOT        location of the top-level object directory

  --usrpkgs USER_PKGS          a folder containing user-provided distribution tarballs
  --usrdata USER_DATA          a folder containing user-provided installation files

  --tmproot TEMPORARY_ROOT     where temporary files should be created
  --pkgroot PACKAGE_ROOT       where package tarballs should be created
  --sysroot SYSTEM_ROOT        where the live distribution should be created

  --zipfile ZIPFILE_NAME       name of the zipfile to be created (optional)

EOF
	exit 1
}

error_msg()
{
	echo $@ >&2
	exit 2
}

init_vars()
{
	# project
	mb_project_dir=$(cd `dirname $0` ; pwd)
	mb_pwd=`pwd`

	# subsets
	mb_subset=
	mb_subsets=
	mb_pkglist=

	# target
	mb_target=$TARGET

	# midipix_build directories
	mb_minroot=$MINIPIX_ROOT
	mb_objroot=$OBJECT_ROOT

	# user directories
	mb_usrpkgs=$USER_PKGS
	mb_usrdata=$USER_DATA

	# mpackage directories
	mb_tmproot=$TEMPORARY_ROOT
	mb_pkgroot=$PACKAGE_ROOT
	mb_sysroot=$SYSTEM_ROOT

	# and voila
	mb_zipfile=$ZIPFILE_NAME
}

validate_args()
{
	[ -z "$mb_target" ]  && error_msg "!! target not set, quitting..."

	[ -z "$mb_minroot" ] && error_msg "!! minroot not set, quitting..."
	[ -z "$mb_objroot" ] && error_msg "!! objroot not set, quitting..."

	[ -z "$mb_tmproot" ] && error_msg "!! tmproot not set, quitting..."
	[ -z "$mb_pkgroot" ] && error_msg "!! pkgroot not set, quitting..."
	[ -z "$mb_sysroot" ] && error_msg "!! sysroot not set, quitting..."


	if ! [ -d "$mb_minroot" ]; then
		error_msg "!! $mb_minroot: minroot directory not found, quitting..."
	fi

	if ! [ -d "$mb_objroot" ]; then
		error_msg "!! $mb_objroot: objroot directory not found, quitting..."
	fi


	if ! [ -z "$mb_usrpkgs" ] && ! [ -d "$mb_usrpkgs"]; then
		error_msg "!! $mb_usrpkgs: usrpkgs directory does not exist, quitting..."
	fi

	if ! [ -z "$mb_usrdata" ] && ! [ -d "$mb_usrdata"]; then
		error_msg "!! $mb_usrdata: usrdata directory does not exist, quitting..."
	fi

	if ! [ -z "$mb_zipfile" ] && ! [ -d `dirname "$mb_zipfile"` ]; then
		error_msg "!! $mb_zipfile: zipfile directory does not exist, quitting..."
	fi


	if [ -d "$mb_tmproot" ]; then
		error_msg "!! $mb_tmproot: tmproot directory already exists, quitting..."
	fi

	if [ -d "$mb_pkgroot" ]; then
		error_msg "!! $mb_pkgroot: pkgroot directory already exists, quitting..."
	fi

	if [ -d "$mb_sysroot" ]; then
		error_msg "!! $mb_sysroot: sysroot directory already exists, quitting..."
	fi
}

init_dirs()
{
	mkdir "$mb_tmproot" || exit 2
	mkdir "$mb_pkgroot" || exit 2
	mkdir "$mb_sysroot" || exit 2

	mb_minroot=$(cd "$mb_minroot" ; pwd)
	mb_objroot=$(cd "$mb_objroot" ; pwd)

	mb_tmproot=$(cd "$mb_tmproot" ; pwd)
	mb_pkgroot=$(cd "$mb_pkgroot" ; pwd)
	mb_sysroot=$(cd "$mb_sysroot" ; pwd)

	if ! [ -z "$mb_usrpkgs" ]; then
		mb_usrpkgs=$(cd "$mb_usrpkgs" ; pwd)
	fi

	if ! [ -z "$mb_usrpkgs" ]; then
		mb_usrdata=$(cd "$mb_usrdata" ; pwd)
	fi

	if ! [ -z "$mb_zipfile" ]; then
		mb_zipdir=$(cd `dirname "$mb_zipfile"` ; pwd)
		mb_zipbase=`basename "$mb_zipfile"`
		mb_zipfile="$mb_zipdir/$mb_zipbase"
	fi
}

init_pkglist()
{
	if [ -z "$mb_subsets" ]; then
		mb_pkglist=''
	else
		mb_srclist=''

		for subset in $mb_subsets; do
			if [ -f $subset ]; then
				mb_srclist="$mb_srclist $subset"
			elif [ -f "$mb_project_dir/subset/$subset" ]; then
				mb_srclist="$mb_srclist $mb_project_dir/subset/$subset"
			else
				error_msg "!! $subset: subset not found, quitting..."
			fi
		done

		mb_pkglist=`cat $mb_srclist | grep -v '#' | sort --unique`

		echo "$mb_pkglist"
	fi
}

gen_tarballs()
{
	for pkg in $mb_pkglist; do
		pkgdir="$mb_tmproot/$pkg"
		objdir="$mb_objroot/$pkg-native-$mb_target/destdir"

		cp  -av "$objdir" "$pkgdir"           || exit 2
		cd "$pkgdir"                          || exit 2
		tar -cvzf "$mb_pkgroot/$pkg.tar.gz" * || exit 2
	done

	# common, distro
	for pkg in common distro; do
		cd "$mb_project_dir/$pkg"
		tar -cvzf "$mb_pkgroot/$pkg.tar.gz" * || exit 2
	done
}

gen_sysroot()
{
	# layout
	mkdir "$mb_sysroot/tarballs"    || exit 2
	mkdir "$mb_sysroot/updates"     || exit 2

	# minipix
	cd "$mb_minroot"                || exit 2
	cp -av * "$mb_sysroot"          || exit 2

	# common
	cd "$mb_project_dir/common"     || exit 2
	cp -av * "$mb_sysroot"          || exit 2

	# once
	cd "$mb_project_dir/once"       || exit 2
	cp -av * "$mb_sysroot"          || exit 2

	# tarballs
	cd "$mb_pkgroot"                || exit 2
	cp -av * "$mb_sysroot/tarballs" || exit 2

	# user packages
	if ! [ -z "$mb_usrpkgs" ]; then
		cd "$mb_usrpkgs"                || exit 2
		cp -av * "$mb_sysroot/tarballs" || exit 2
	fi

	# user installation scripts
	if ! [ -z "$mb_usrdata" ]; then
		cd "$mb_usrdata"                || exit 2
		cp -av * "$mb_sysroot"          || exit 2
	fi
}

gen_zipfile()
{
	if [ -z "$mb_zipfile" ]; then
		return 0
	fi

	cd "$mb_sysroot"         || exit 2
	zip -rv9 "$mb_zipfile" * || exit 2
}

# one: vars
init_vars

# two: args
for arg ; do
	case "$arg" in
		--help)	usage
			;;
		--target=*)
			mb_target=${arg#*=}
			;;
		--minroot=*)
			mb_minroot=${arg#*=}
			;;
		--objroot=*)
			mb_objroot=${arg#*=}
			;;
		--usrpkgs=*)
			mb_usrpkgs=${arg#*=}
			;;
		--usrdata=*)
			mb_usrdata=${arg#*=}
			;;
		--tmproot=*)
			mb_tmproot=${arg#*=}
			;;
		--pkgroot=*)
			mb_pkgroot=${arg#*=}
			;;
		--sysroot=*)
			mb_sysroot=${arg#*=}
			;;
		--zipfile=*)
			mb_zipfile=${arg#*=}
			;;
		--subset=*)
			mb_subset=${arg#*=}
			mb_subsets="$mb_subsets $mb_subset"
			;;
		*)
			error_msg ${arg#}: "unsupported script argument."
			exit 2
			;;
	esac
done

# three: sanity
validate_args

# four:  dirs, package list
init_dirs
init_pkglist

# five:  tarballs, sysroot
gen_tarballs
gen_sysroot

# six:   zipfile
gen_zipfile

# all done
exit 0