minix/releasetools/release.sh
Lionel Sambuc 3ba3608c5f Simplifying release.sh script.
As the build system can now generate a full root file system,
there is no need to bootstrap the iso image by copying over
files from the currently system.

The SVN references have also been mostly taken out, as they are
not anymore valid. Some cleanup have been done to try to improve
the readability of the script.
2012-11-28 17:35:55 +01:00

416 lines
10 KiB
Bash
Executable file

#!/bin/sh
set -e
. release.functions
version_pretty="`sh tell_config OS_RELEASE . OS_VERSION | tr -dc 0-9.`"
version="`echo $version_pretty | tr . _`"
PACKAGEDIR=/usr/pkgsrc/packages/$version_pretty/`uname -m`
SRC=src
REPO=git://git.minix3.org/minix
GITBRANCH=master
# List of packages included on installation media
PACKAGELIST=packages.install
secs=`expr 32 '*' 64`
export SHELL=/bin/sh
PKG_ADD=/usr/pkg/sbin/pkg_add
PKG_INFO=/usr/pkg/sbin/pkg_info
if [ ! -x $PKG_ADD ]
then echo Please install pkg_install from pkgsrc.
exit 1
fi
# Packages we have to pre-install, and url to use
PACKAGEURL=ftp://ftp.minix3.org/pub/minix/packages/$version_pretty/`uname -m`/All/
PREINSTALLED_PACKAGES="
pkgin
pkg_install
bmake
binutils
clang
"
# pkg_tarup
PKG_ADD_URL=$PACKAGEURL
RELEASERC=$HOME/.releaserc
if [ -f $RELEASERC ]
then . $RELEASERC
fi
set -- $* $RELOPTS
export RELEASEDIR=/usr/r-staging
RELEASEMNTDIR=/usr/r
RELEASEPACKAGE=${RELEASEDIR}/usr/install/packages
IMAGE=/usr/mdec/bootxx_cd9660
ROOTIMAGE=rootimage
CDFILES=/usr/tmp/cdreleasefiles
sh tell_config OS_RELEASE . OS_VERSION >/tmp/rel.$$
IMG_BASE=minix${version}_ide
BS=4096
HDEMU=0
COPY=0
JAILMODE=0
REVTAG=""
PACKAGES=1
MINIMAL=0
MAKEMAP=0
EXTRAS_INSTALL=0
EXTRAS_PATH=
# Do we have git?
if git --version >/dev/null
then if [ -d ../.git ]
then LOCAL_REVTAG="`git describe --always`"
GITMODE=1
fi
fi
FILENAMEOUT=""
while getopts "b:j:ls:pmMchu?f:L:e:" c
do
case "$c" in
\?)
echo "Usage: $0 [-l] [-p] [-c] [-h] [-m] [-M] [-u] [-f <filename>] [-s <username>] -j<jaildir> [-L <packageurl>] [-e <extras-path>]" >&2
exit 1
;;
b)
GITBRANCH=$OPTARG
;;
h)
echo " * Making HD image"
IMG_BASE=minix${version}_bios
HDEMU=1
;;
c)
echo " * Copying, not using GIT"
COPY=1
;;
p)
PACKAGES=0
;;
j)
RELEASEDIR=$OPTARG
JAILMODE=1
;;
u)
echo " * Making live USB-stick image"
IMG_BASE=minix${version}_usb
HDEMU=1
USB=1
;;
f)
FILENAMEOUT="$OPTARG"
;;
s) USERNAME="--username=$OPTARG"
;;
m) MINIMAL=1
PACKAGES=0
;;
M) MAKEMAP=1
;;
l) PKG_ADD_URL=file://$PACKAGEDIR/All
;;
L) PKG_ADD_URL="$OPTARG"
CUSTOM_PACKAGES=1
;;
e) EXTRAS_INSTALL=1
EXTRAS_PATH="$OPTARG"
;;
esac
done
if [ $GITMODE -ne 1 -a $COPY -ne 1 ]
then echo "Need git to retrieve latest minix! Copying src instead!"
COPY=1
fi
if [ ! "$ZIP" ]
then ZIP=bzip2
fi
if [ $PACKAGES -ne 0 ]
then mkdir -p $PACKAGEDIR/All || true
retrieve $PACKAGEDIR/All $PACKAGELIST packages/`uname -p`/$VERSION_PRETTY
fi
TMPDISKUSR=/dev/ram0
TMPDISKROOT=/dev/ram1
if [ ! -b $TMPDISKUSR -o ! $TMPDISKROOT ]
then echo "$TMPDISKUSR or $TMPDISKROOT is not a block device.."
exit 1
fi
if [ $TMPDISKUSR = $TMPDISKROOT ]
then
echo "Temporary devices can't be equal."
exit
fi
if [ $JAILMODE = 0 ]
then echo " * Cleanup old files"
umount $TMPDISKUSR || true
umount $TMPDISKROOT || true
umount $RELEASEMNTDIR/usr || true
umount $RELEASEMNTDIR || true
fi
rm -rf $RELEASEDIR $RELEASEMNTDIR $IMG $ROOTIMAGE $CDFILES image* || true
mkdir -p $CDFILES || exit
mkdir -p $RELEASEDIR $RELEASEMNTDIR
mkdir -p $RELEASEPACKAGE
##########################################################################
echo " * Bootstrapping filesystem in $RELEASEDIR"
##########################################################################
CONFIGHEADER=$RELEASEDIR/usr/src/include/minix/sys_config.h
copy_local_packages
if [ "$COPY" -ne 1 ]
then
echo "Retrieving latest minix repo from $REPO branch $GITBRANCH."
srcdir=$RELEASEDIR/usr/src
git clone -b $GITBRANCH $REPO $srcdir
if [ "$REVTAG" ]
then echo "Doing checkout of $REVTAG."
(cd $srcdir && git checkout $REVTAG )
else REVTAG=`(cd $srcdir && git rev-parse --short HEAD)`
echo "Retrieved repository head in $srcdir is $REVTAG."
fi
if [ $MINIMAL -ne 0 ]
then rm -r $srcdir/.git
fi
echo "
/* Added by release script */
#ifndef _VCS_REVISION
#define _VCS_REVISION \"$REVTAG\"
#endif" >>$CONFIGHEADER
DATE=`date +%Y%m%d`
# output image name
if [ "$USB" -ne 0 ]; then
IMG=${IMG_BASE}_${DATE}_${REVTAG}.img
else
IMG=${IMG_BASE}_${DATE}_${REVTAG}.iso
fi
else
echo "Copying contents from current src dir."
( cd .. && make cleandir )
srcdir=/usr/$SRC
( cd $srcdir && tar --exclude .svn -cf - . ) | ( cd $RELEASEDIR/usr && mkdir $SRC && cd $SRC && tar xf - )
REVTAG=copy
REVISION=unknown
IMG=${IMG_BASE}_copy.iso
fi
# Make sure the CD knows it's a CD, unless it's not
if [ "$USB" -eq 0 ]
then date >$RELEASEDIR/CD
fi
rm -f $RELEASEDIR/usr/$SRC/releasetools/revision
for p in $PREINSTALLED_PACKAGES
do echo " * Pre-installing: $p from $PKG_ADD_URL"
$PKG_ADD -f -P $RELEASEDIR $PKG_ADD_URL/$p
done
if [ "$CUSTOM_PACKAGES" ]
then echo $PKG_ADD_URL >$RELEASEDIR/usr/pkg/etc/pkgin/repositories.conf
fi
echo " * Resetting timestamps"
find $RELEASEDIR | xargs touch
##########################################################################
echo " * Build"
##########################################################################
cd $RELEASEDIR/usr/src
make distribution DESTDIR=$RELEASEDIR CHECKFLIST=no
make -C releasetools do-hdboot DESTDIR=$RELEASEDIR MKINSTALLBOOT=yes
cp $RELEASEDIR/usr/mdec/boot_monitor $RELEASEDIR
cp $RELEASEDIR/boot/minix_latest/* $RELEASEDIR/boot/minix_default/
if [ $MAKEMAP -ne 0 ]; then
find . -type f -perm 755 | xargs nm -n 2> /dev/null > symbols.txt
fi
make cleandir
cd -
echo " * build done"
##########################################################################
echo " * Removing bootstrap files"
##########################################################################
# The build process leaves some file in $SRC as bin.
chown -R root $RELEASEDIR/usr/src*
cp issue.install $RELEASEDIR/etc/issue
echo $version_pretty, SVN revision $REVISION, generated `date` >$RELEASEDIR/etc/version
rm -rf $RELEASEDIR/tmp/*
if [ $MINIMAL -ne 0 ]
then
if [ "$MAKEMAP" -ne 0 ]
then
echo " * Copying symbol map to ${IMG}-symbols.txt"
cp $RELEASEDIR/usr/src/symbols.txt ${IMG}-symbols.txt
$ZIP -f ${IMG}-symbols.txt
fi
echo " * Removing files to create minimal image"
rm -rf $RELEASEDIR/usr/man/man*/* \
$RELEASEDIR/usr/share/zoneinfo* $RELEASEDIR/usr/src
mkdir -p $RELEASEDIR/usr/src/releasetools
fi
if [ $EXTRAS_INSTALL -ne 0 ] ; then
echo " * Copying files from $EXTRAS_PATH"
cp -Rv $EXTRAS_PATH/* $RELEASEDIR
fi
# If we are making a jail, all is done!
if [ $JAILMODE = 1 ]
then echo "Created new minix install in $RELEASEDIR."
echo "Enter it by typing: "
echo "# chroot $RELEASEDIR /bin/sh"
exit 0
fi
##########################################################################
echo " * Counting files"
##########################################################################
extrakb=`du -ks $RELEASEDIR/usr/install | awk '{ print $1 }'`
find $RELEASEDIR/usr | fgrep -v /install/ | wc -l >$RELEASEDIR/.usrfiles
find $RELEASEDIR -print -path $RELEASEDIR/usr -prune | wc -l >$RELEASEDIR/.rootfiles
fstab_marker="# Poor man's File System Table."
echo " * Writing fstab"
if [ "$USB" -ne 0 ]
then
echo \
"$fstab_marker
root=/dev/c0d7p0s0
usr=/dev/c0d7p0s2
" > $RELEASEDIR/etc/fstab
elif [ "$HDEMU" -ne 0 ]
then
echo \
"$fstab_marker
root=/dev/c0d7p0s0
usr=/dev/c0d7p0s2
usr_roflag=\"-r\"" > $RELEASEDIR/etc/fstab
fi
##########################################################################
echo " * Mounting $TMPDISKROOT as $RELEASEMNTDIR"
##########################################################################
fitfs $RELEASEDIR $TMPDISKROOT 64 256 "$ROOTMB"
ROOTBLOCKS=$blocks
ROOTSECTS="`expr $blocks \* \( $BS / 512 \)`"
mount $TMPDISKROOT $RELEASEMNTDIR || exit
echo " * Mounting $TMPDISKUSR as $RELEASEMNTDIR/usr"
fitfs $RELEASEDIR/usr $TMPDISKUSR 0 0 "$USRMB"
USRBLOCKS=$blocks
USRSECTS="`expr $blocks \* \( $BS / 512 \)`"
mkdir -m 755 $RELEASEMNTDIR/usr
mount $TMPDISKUSR $RELEASEMNTDIR/usr || exit
##########################################################################
echo " * Copying files from staging to image"
##########################################################################
synctree -f $RELEASEDIR $RELEASEMNTDIR > /dev/null || true
expr `df -k $TMPDISKUSR | tail -1 | awk '{ print $4 }'` - $extrakb >$RELEASEMNTDIR/.usrkb
echo " * Unmounting $TMPDISKUSR from $RELEASEMNTDIR/usr"
umount $TMPDISKUSR || exit
echo " * Making image bootable"
if [ "$USB" -ne 0 ]
then
usb_root_changes
elif [ "$HDEMU" -ne 0 ]
then
hdemu_root_changes
else
cd_root_changes
fi
echo " * Unmounting $TMPDISKROOT from $RELEASEMNTDIR"
umount $TMPDISKROOT || exit
rm -r $RELEASEMNTDIR
##########################################################################
echo " * Generating image files"
##########################################################################
dd if=$TMPDISKROOT of=$ROOTIMAGE bs=$BS count=$ROOTBLOCKS
cp release/cd/* $CDFILES || true
echo "This is Minix version $version_pretty prepared `date`." >$CDFILES/VERSION.TXT
boottype=-n
bootimage=$IMAGE
if [ "$HDEMU" -ne 0 ]; then
make_hdimage
boottype='-h'
bootimage=hdimage
fi
if [ "$USB" -ne 0 ]; then
mv $bootimage $IMG
else
cp $RELEASEDIR/usr/mdec/boot_monitor $CDFILES/boot
cp -rf $RELEASEDIR/boot/minix_latest/* $CDFILES/
gzip -d $CDFILES/*gz
writeisofs -s0x0 -l MINIX -B $bootimage $boottype $CDFILES $IMG || exit 1
if [ "$HDEMU" -eq 0 ]
then
echo "Appending Minix root and usr filesystem"
# Pad ISO out to cylinder boundary
isobytes=`stat -f %z $IMG`
isosects=`expr $isobytes / 512`
isopad=`expr $secs - '(' $isosects % $secs ')'`
dd if=/dev/zero count=$isopad >>$IMG
# number of sectors
isosects=`expr $isosects + $isopad`
( cat $IMG $ROOTIMAGE ;
dd if=$TMPDISKUSR bs=$BS count=$USRBLOCKS ) >m
mv m $IMG
# Make CD partition table
installboot_nbsd -m $IMG /usr/mdec/mbr
# Make sure there is no hole..! Otherwise the ISO format is
# unreadable.
partition -m $IMG 0 81:$isosects 81:$ROOTSECTS 81:$USRSECTS
fi
fi
# Clean up: RELEASEDIR no longer needed
rm -r $RELEASEDIR
echo "${ZIP}ping $IMG"
$ZIP -f $IMG
if [ "$FILENAMEOUT" ]
then echo "$IMG" >$FILENAMEOUT
fi
##########################################################################
echo " * Freeing up memory used by ramdisks"
##########################################################################
ramdisk 1 $TMPDISKROOT
ramdisk 1 $TMPDISKUSR