Add the first snapshot at rewriting the nanobsd build to be a shellscript.
The overall idea is to get a single build script which will not need editing, but instead overrides and changes happen by config files passed as arguments.
This commit is contained in:
parent
3c0898098e
commit
2a6de17fc9
359
tools/tools/nanobsd/nanobsd.sh
Normal file
359
tools/tools/nanobsd/nanobsd.sh
Normal file
@ -0,0 +1,359 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2005 Poul-Henning Kamp.
|
||||
#
|
||||
# See /usr/share/examples/etc/bsd-style-copyright for license terms.
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Name of this NanoBSD build. (Used to construct workdir names)
|
||||
NANO_NAME=full
|
||||
|
||||
# Source tree directory
|
||||
NANO_SRC=/usr/src
|
||||
|
||||
# Object tree directory
|
||||
# default is subdir of /usr/obj
|
||||
# XXX: MAKEOBJDIRPREFIX handling... ?
|
||||
NANO_OBJ=""
|
||||
|
||||
# Parallel Make
|
||||
NANO_PMAKE="make -j 3"
|
||||
|
||||
# Options to put in make.conf during buildworld only
|
||||
CONF_BUILD=' '
|
||||
|
||||
# Options to put in make.conf during installworld only
|
||||
CONF_INSTALL=' '
|
||||
|
||||
# Options to put in make.conf during both build- & installworld.
|
||||
CONF_WORLD=' '
|
||||
|
||||
# Kernel config file to use
|
||||
NANO_KERNEL=GENERIC
|
||||
|
||||
# Media data, sizes in 512 bytes sectors
|
||||
NANO_MEDIA=1048576
|
||||
NANO_IMAGES=2
|
||||
NANO_CONFSIZE=2048
|
||||
NANO_DATASIZE=1023
|
||||
|
||||
# Media geometry, only relevant if bios doesn't understand LBA.
|
||||
NANO_SECTS=32
|
||||
NANO_HEADS=16
|
||||
|
||||
#######################################################################
|
||||
# Functions which can be overridden in configs.
|
||||
|
||||
clean_target ( ) (
|
||||
echo "## Clean and create object directory (${MAKEOBJDIRPREFIX})"
|
||||
|
||||
if rm -rf ${MAKEOBJDIRPREFIX} > /dev/null 2>&1 ; then
|
||||
true
|
||||
else
|
||||
chflags -R noschg ${MAKEOBJDIRPREFIX}
|
||||
rm -rf ${MAKEOBJDIRPREFIX}
|
||||
fi
|
||||
mkdir -p ${MAKEOBJDIRPREFIX}
|
||||
)
|
||||
|
||||
make_conf_build ( ) (
|
||||
echo "## Construct build make.conf ($NANO_MAKE_CONF)"
|
||||
|
||||
echo ${CONF_WORLD} > ${NANO_MAKE_CONF}
|
||||
echo ${CONF_BUILD} >> ${NANO_MAKE_CONF}
|
||||
)
|
||||
|
||||
build_world ( ) (
|
||||
echo "## run buildworld"
|
||||
echo "### log: ${MAKEOBJDIRPREFIX}/_.bw"
|
||||
|
||||
cd ${NANO_SRC}
|
||||
${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} buildworld \
|
||||
> ${MAKEOBJDIRPREFIX}/_.bw 2>&1
|
||||
)
|
||||
|
||||
build_kernel ( ) (
|
||||
echo "## build kernel ($NANO_KERNEL"
|
||||
echo "### log: ${MAKEOBJDIRPREFIX}/_.bk"
|
||||
|
||||
if [ -f ${NANO_KERNEL} ] ; then
|
||||
cp ${NANO_KERNEL} ${NANO_SRC}/sys/${NANO_ARCH}/conf
|
||||
fi
|
||||
|
||||
cd ${NANO_SRC}
|
||||
${NANO_PMAKE} buildkernel \
|
||||
__MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=${NANO_KERNEL} \
|
||||
> ${MAKEOBJDIRPREFIX}/_.bk 2>&1
|
||||
)
|
||||
|
||||
clean_world ( ) (
|
||||
echo "## Clean and create world directory (${NANO_WORLDDIR})"
|
||||
if rm -rf ${NANO_WORLDDIR}/ > /dev/null 2>&1 ; then
|
||||
true
|
||||
else
|
||||
chflags -R noschg ${NANO_WORLDDIR}/
|
||||
rm -rf ${NANO_WORLDDIR}/
|
||||
fi
|
||||
mkdir -p ${NANO_WORLDDIR}/
|
||||
)
|
||||
|
||||
make_conf_install ( ) (
|
||||
echo "## Construct install make.conf ($NANO_MAKE_CONF)"
|
||||
|
||||
echo ${CONF_WORLD} > ${NANO_MAKE_CONF}
|
||||
echo ${CONF_INSTALL} >> ${NANO_MAKE_CONF}
|
||||
)
|
||||
|
||||
install_world ( ) (
|
||||
echo "## installworld"
|
||||
echo "### log: ${MAKEOBJDIRPREFIX}/_.iw"
|
||||
|
||||
cd ${NANO_SRC}
|
||||
${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} installworld \
|
||||
DESTDIR=${NANO_WORLDDIR} \
|
||||
> ${MAKEOBJDIRPREFIX}/_.iw 2>&1
|
||||
chflags -R noschg ${NANO_WORLDDIR}
|
||||
)
|
||||
|
||||
install_etc ( ) (
|
||||
|
||||
echo "## install /etc"
|
||||
echo "### log: ${MAKEOBJDIRPREFIX}/_.etc"
|
||||
|
||||
cd ${NANO_SRC}/etc
|
||||
${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} distribution \
|
||||
DESTDIR=${NANO_WORLDDIR} \
|
||||
> ${MAKEOBJDIRPREFIX}/_.etc 2>&1
|
||||
)
|
||||
|
||||
install_kernel ( ) (
|
||||
echo "## install kernel"
|
||||
echo "### log: ${MAKEOBJDIRPREFIX}/_.ik"
|
||||
|
||||
cd ${NANO_SRC}
|
||||
${NANO_PMAKE} installkernel \
|
||||
DESTDIR=${NANO_WORLDDIR} \
|
||||
__MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=${NANO_KERNEL} \
|
||||
> ${MAKEOBJDIRPREFIX}/_.ik 2>&1
|
||||
)
|
||||
|
||||
setup_diskless ( ) (
|
||||
echo "## configure diskless setup"
|
||||
|
||||
cd ${NANO_WORLDDIR}
|
||||
|
||||
# create diskless marker file
|
||||
touch etc/diskless
|
||||
|
||||
# link /var under /conf
|
||||
# we use hard links so we have them both places.
|
||||
# the files in /var will be hidden by the mount.
|
||||
# XXX: configure /var ramdisk size
|
||||
mkdir -p conf/base/var
|
||||
find var -print | cpio -dumpl ../conf/base/var
|
||||
|
||||
# move /etc under /conf
|
||||
# we use hard links so we have them both places.
|
||||
# the files in /etc will be hidden by the mount.
|
||||
# XXX: configure /etc ramdisk size
|
||||
mkdir -p conf/base/etc conf/default/etc
|
||||
find etc -print | cpio -dumpl ../conf/base/etc
|
||||
|
||||
# pick up config files from the special partition
|
||||
echo "mount -o ro /dev/ad0s3" > conf/default/etc/remount
|
||||
|
||||
# Put /tmp on the /var ramdisk
|
||||
rmdir tmp
|
||||
ln -s var/tmp tmp
|
||||
)
|
||||
|
||||
create_i386_diskimage ( ) (
|
||||
|
||||
set -x
|
||||
|
||||
# XXX: param ?
|
||||
# NEWFSPARAM="-b 4096 -f 512 -i 8192 -O1 -U"
|
||||
|
||||
echo $NANO_MEDIA $NANO_IMAGES \
|
||||
$NANO_CONFSIZE $NANO_DATASIZE \
|
||||
$NANO_SECTS $NANO_HEADS |
|
||||
awk '
|
||||
{
|
||||
# size of cylinder in sectors
|
||||
cs = $5 * $6
|
||||
|
||||
# number of full cylinders on media
|
||||
cyl = int ($1 / cs)
|
||||
|
||||
# output fdisk geometry spec
|
||||
if (cyl <= 1023)
|
||||
print "g c" cyl " h" $6 " s" $5
|
||||
else
|
||||
print "g c" 1023 " h" $6 " s" $5
|
||||
|
||||
# size of data partition in full cylinders
|
||||
dsl = int (($4 + cs - 1) / cs)
|
||||
|
||||
# size of config partition in full cylinders
|
||||
csl = int (($3 + cs - 1) / cs)
|
||||
|
||||
# size of image partition(s) in full cylinders
|
||||
isl = int ((cyl - dsl - csl) / $2)
|
||||
|
||||
# First image partition start at second track
|
||||
print "p 1 165 " $5, isl * cs - $5
|
||||
c = isl * cs;
|
||||
|
||||
# Second image partition (if any) also starts offset one
|
||||
# track to keep them identical.
|
||||
if ($2 > 1) {
|
||||
print "p 2 165 " $5 + c, isl * cs - $5
|
||||
c += isl * cs;
|
||||
}
|
||||
|
||||
# Config partition starts at cylinder boundary.
|
||||
print "p 3 165 " c, csl * cs
|
||||
c += csl * cs
|
||||
|
||||
# Data partition (if any) starts at cylinder boundary.
|
||||
if ($4 > 0)
|
||||
print "p 4 165 " c, dsl * cs
|
||||
}
|
||||
' > ${MAKEOBJDIRPREFIX}/_.fdisk
|
||||
|
||||
IMG=${MAKEOBJDIRPREFIX}/_.disk.full
|
||||
MNT=${MAKEOBJDIRPREFIX}/_.mnt
|
||||
mkdir -p ${MNT}
|
||||
|
||||
dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \
|
||||
count=`expr ${NANO_MEDIA} / ${NANO_SECTS}`
|
||||
|
||||
MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}`
|
||||
|
||||
trap "umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT
|
||||
|
||||
fdisk -i -f ${MAKEOBJDIRPREFIX}/_.fdisk ${MD}
|
||||
# XXX: params
|
||||
# XXX: pick up cached boot* files, they may not be in image anymore.
|
||||
boot0cfg -B -b ${NANO_WORLDDIR}/boot/boot0sio -o packet -s 1 -m 3 ${MD}
|
||||
bsdlabel -w -B ${MD}s1
|
||||
|
||||
# Create first image
|
||||
newfs ${NEWFSPARAM} /dev/${MD}s1a
|
||||
mount /dev/${MD}s1a ${MNT}
|
||||
( cd ${NANO_WORLDDIR} && find . -print | cpio -dump ${MNT} )
|
||||
# XXX: make_fstab
|
||||
df -i ${MNT}
|
||||
umount ${MNT}
|
||||
|
||||
if [ $NANO_IMAGES -gt 1 ] ; then
|
||||
# Duplicate to second image (if present)
|
||||
dd if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k
|
||||
fi
|
||||
|
||||
# Create Config slice
|
||||
newfs ${NEWFSPARAM} /dev/${MD}s3
|
||||
# XXX: fill from where ?
|
||||
|
||||
# Create Data slice, if any.
|
||||
if [ $NANO_DATASIZE -gt 0 ] ; then
|
||||
newfs ${NEWFSPARAM} /dev/${MD}s4
|
||||
# XXX: fill from where ?
|
||||
fi
|
||||
|
||||
dd if=/dev/${MD}s1 of=${MAKEOBJDIRPREFIX}/_.disk.image bs=64k
|
||||
mdconfig -d -u $MD
|
||||
)
|
||||
|
||||
|
||||
#######################################################################
|
||||
#
|
||||
# Heavy wizardry ahead, no user serviceable parts below.
|
||||
#
|
||||
#######################################################################
|
||||
|
||||
|
||||
#######################################################################
|
||||
# Internal variables
|
||||
if [ "x${NANO_OBJ}" = "x" ] ; then
|
||||
MAKEOBJDIRPREFIX=/usr/obj/nanobsd.${NANO_NAME}/
|
||||
else
|
||||
MAKEOBJDIRPREFIX=${NANO_OBJ}
|
||||
fi
|
||||
|
||||
NANO_WORLDDIR=${MAKEOBJDIRPREFIX}/_.w
|
||||
NANO_MAKE_CONF=${MAKEOBJDIRPREFIX}/make.conf
|
||||
|
||||
#######################################################################
|
||||
# Not a variable at this time
|
||||
|
||||
NANO_ARCH=i386
|
||||
|
||||
#######################################################################
|
||||
#
|
||||
export MAKEOBJDIRPREFIX
|
||||
|
||||
export NANO_WORLDDIR
|
||||
export NANO_ARCH
|
||||
export NANO_MEDIA
|
||||
export NANO_IMAGES
|
||||
export NANO_CONFSIZE
|
||||
export NANO_DATASIZE
|
||||
export NANO_SECTS
|
||||
export NANO_HEADS
|
||||
export NANO_PMAKE
|
||||
export NANO_OBJ
|
||||
export NANO_NAME
|
||||
export NANO_SRC
|
||||
export NANO_MAKE_CONF
|
||||
|
||||
#######################################################################
|
||||
# Parse arguments
|
||||
|
||||
args=`getopt c: $*`
|
||||
if [ $? -ne 0 ] ; then
|
||||
echo "Usage: $0 [-c config file]" 1>&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
set -- $args
|
||||
for i
|
||||
do
|
||||
case "$i"
|
||||
in
|
||||
-c)
|
||||
copt="$2"
|
||||
shift;
|
||||
shift;
|
||||
;;
|
||||
--)
|
||||
shift;
|
||||
break;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "x${copt}" != "x" ] ; then
|
||||
if [ ! -f ${copt} ] ; then
|
||||
echo "Cannot read ${copt}" 1>&2
|
||||
exit 2
|
||||
fi
|
||||
. ${copt}
|
||||
fi
|
||||
|
||||
#######################################################################
|
||||
# Set up object directory
|
||||
|
||||
clean_target
|
||||
make_conf_build
|
||||
build_world
|
||||
build_kernel
|
||||
clean_world
|
||||
make_conf_install
|
||||
install_world
|
||||
install_etc
|
||||
install_kernel
|
||||
setup_diskless
|
||||
create_i386_diskimage
|
Loading…
Reference in New Issue
Block a user