#!/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)
--symbols do not strip PE binaries (distro)
--flysyms do not strip PE binaries (live environment)
--defroot default location to which the distribution should
be installed (substitutes @sysroot@)
--product name of the distribution to be installed
(substitutes @product@)
--radmins provide members of the builtin administrators group
with root-like access to the sysroot directory
(substitutes @radmins@)
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
# symbols
mb_symbols='no'
mb_flysyms='no'
# setup
mb_defroot=@sysroot@
mb_product=@product@
mb_radmins='no'
# 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
}
strip_symbols()
{
( perk -y $f 2>/dev/null | grep -v '\-obj\-' >/dev/null ) \
&& ( strip $1 || exit 2 )
}
gen_setup()
{
pkgdir="$mb_tmproot/once"
objdir="$mb_project_dir/once"
cp -av "$objdir" "$pkgdir" || exit 2
cd "$pkgdir" || exit 2
for f in $(find -type f); do
sed -e 's#@sysroot@#'"$mb_defroot"'#g' \
-e 's#@product@#'"$mb_product"'#g' \
-e 's#@radmins@#'"$mb_radmins"'#g' \
-e 's#@SYSROOT@#'"@sysroot@"'#g' \
$f > $f.tmp || exit 2
cat $f.tmp > $f || exit 2
rm $f.tmp || exit 2
done
}
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
for f in $(find -type f); do
if [ $mb_symbols = 'no' ]; then
strip_symbols $f
fi
done
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
cd "$mb_sysroot" || exit 2
for f in $(find -type f); do
if [ $mb_flysyms = 'no' ]; then
strip_symbols $f
fi
done
# common
cd "$mb_project_dir/common" || exit 2
cp -av * "$mb_sysroot" || exit 2
# once
cd "$mb_tmproot/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#*=}
;;
--defroot=*)
mb_defroot=${arg#*=}
;;
--product=*)
mb_product=${arg#*=}
;;
--symbols)
mb_symbols='yes'
;;
--flysyms)
mb_flysyms='yes'
;;
--radmins)
mb_radmins='yes'
;;
--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, setup
gen_setup
gen_tarballs
gen_sysroot
# six: zipfile
gen_zipfile
# all done
exit 0