nanobsd.sh revision 181460
1148422Sphk#!/bin/sh
2150366Sphk#
3148422Sphk# Copyright (c) 2005 Poul-Henning Kamp.
4150366Sphk# All rights reserved.
5148422Sphk#
6150366Sphk# Redistribution and use in source and binary forms, with or without
7150366Sphk# modification, are permitted provided that the following conditions
8150366Sphk# are met:
9150366Sphk# 1. Redistributions of source code must retain the above copyright
10150366Sphk#    notice, this list of conditions and the following disclaimer.
11150366Sphk# 2. Redistributions in binary form must reproduce the above copyright
12150366Sphk#    notice, this list of conditions and the following disclaimer in the
13150366Sphk#    documentation and/or other materials provided with the distribution.
14148422Sphk#
15150366Sphk# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16150366Sphk# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17150366Sphk# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18150366Sphk# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19150366Sphk# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20150366Sphk# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21150366Sphk# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22150366Sphk# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23150366Sphk# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24150366Sphk# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25150366Sphk# SUCH DAMAGE.
26150366Sphk#
27148422Sphk# $FreeBSD: head/tools/tools/nanobsd/nanobsd.sh 181460 2008-08-09 09:27:54Z phk $
28148422Sphk#
29148422Sphk
30148422Sphkset -e
31148422Sphk
32150366Sphk#######################################################################
33150366Sphk#
34150366Sphk# Setup default values for all controlling variables.
35150366Sphk# These values can be overridden from the config file(s)
36150366Sphk#
37150366Sphk#######################################################################
38150366Sphk
39148422Sphk# Name of this NanoBSD build.  (Used to construct workdir names)
40148422SphkNANO_NAME=full
41148422Sphk
42148422Sphk# Source tree directory
43148422SphkNANO_SRC=/usr/src
44148422Sphk
45150366Sphk# Where nanobsd additional files live under the source tree
46150366SphkNANO_TOOLS=tools/tools/nanobsd
47150366Sphk
48170607Sphk# Where cust_pkg() finds packages to install
49170607SphkNANO_PACKAGE_DIR=${NANO_SRC}/${NANO_TOOLS}/Pkg
50170607Sphk
51148422Sphk# Object tree directory
52148422Sphk# default is subdir of /usr/obj
53148422Sphk# XXX: MAKEOBJDIRPREFIX handling... ?
54148648Sphk#NANO_OBJ=""
55148422Sphk
56175258Ssimon# The directory to put the final images
57175258Ssimon# default is ${NANO_OBJ}
58175258Ssimon#NANO_DISKIMGDIR=""
59175258Ssimon
60148422Sphk# Parallel Make
61148422SphkNANO_PMAKE="make -j 3"
62148422Sphk
63148422Sphk# Options to put in make.conf during buildworld only
64148422SphkCONF_BUILD=' '
65148422Sphk
66148422Sphk# Options to put in make.conf during installworld only
67148422SphkCONF_INSTALL=' '
68148422Sphk
69148422Sphk# Options to put in make.conf during both build- & installworld.
70148422SphkCONF_WORLD=' '
71148422Sphk
72148422Sphk# Kernel config file to use
73148422SphkNANO_KERNEL=GENERIC
74148422Sphk
75149073Sphk# Customize commands.
76149073SphkNANO_CUSTOMIZE=""
77149073Sphk
78148648Sphk# Newfs paramters to use
79148648SphkNANO_NEWFS="-b 4096 -f 512 -i 8192 -O1 -U"
80148648Sphk
81149082Sphk# The drive name of the media at runtime
82149082SphkNANO_DRIVE=ad0
83149082Sphk
84148648Sphk# Target media size in 512 bytes sectors
85170607SphkNANO_MEDIASIZE=1000000
86148648Sphk
87148648Sphk# Number of code images on media (1 or 2)
88148422SphkNANO_IMAGES=2
89148648Sphk
90171986Sphk# 0 -> Leave second image all zeroes so it compresses better.
91171986Sphk# 1 -> Initialize second image with a copy of the first
92171986SphkNANO_INIT_IMG2=1
93171986Sphk
94149535Ssimon# Size of code file system in 512 bytes sectors
95149120Sphk# If zero, size will be as large as possible.
96149120SphkNANO_CODESIZE=0
97149120Sphk
98149120Sphk# Size of configuration file system in 512 bytes sectors
99149120Sphk# Cannot be zero.
100148422SphkNANO_CONFSIZE=2048
101148648Sphk
102148648Sphk# Size of data file system in 512 bytes sectors
103149120Sphk# If zero: no partition configured.
104149120Sphk# If negative: max size possible
105149120SphkNANO_DATASIZE=0
106148422Sphk
107154466Sphk# Size of the /etc ramdisk in 512 bytes sectors
108154466SphkNANO_RAM_ETCSIZE=10240
109154466Sphk
110154466Sphk# Size of the /tmp+/var ramdisk in 512 bytes sectors
111154466SphkNANO_RAM_TMPVARSIZE=10240
112154466Sphk
113148422Sphk# Media geometry, only relevant if bios doesn't understand LBA.
114170607SphkNANO_SECTS=63
115148422SphkNANO_HEADS=16
116148422Sphk
117168894Sadrian# boot0 flags/options and configuration
118168894SadrianNANO_BOOT0CFG="-o packet -s 1 -m 3"
119168894SadrianNANO_BOOTLOADER="boot/boot0sio"
120168894Sadrian
121175258Ssimon# Backing type of md(4) device
122175258Ssimon# Can be "file" or "swap"
123175258SsimonNANO_MD_BACKING="file"
124175258Ssimon
125148422Sphk#######################################################################
126148648Sphk# Not a variable at this time
127148648Sphk
128148648SphkNANO_ARCH=i386
129148648Sphk
130148648Sphk#######################################################################
131150366Sphk#
132150366Sphk# The functions which do the real work.
133150366Sphk# Can be overridden from the config file(s)
134150366Sphk#
135150366Sphk#######################################################################
136148422Sphk
137149120Sphkclean_build ( ) (
138148422Sphk	echo "## Clean and create object directory (${MAKEOBJDIRPREFIX})"
139148422Sphk
140148422Sphk	if rm -rf ${MAKEOBJDIRPREFIX} > /dev/null 2>&1 ; then
141148422Sphk		true
142148422Sphk	else
143148422Sphk		chflags -R noschg ${MAKEOBJDIRPREFIX}
144148422Sphk		rm -rf ${MAKEOBJDIRPREFIX}
145148422Sphk	fi
146148422Sphk	mkdir -p ${MAKEOBJDIRPREFIX}
147150343Sphk	printenv > ${MAKEOBJDIRPREFIX}/_.env
148148422Sphk)
149148422Sphk
150148422Sphkmake_conf_build ( ) (
151148422Sphk	echo "## Construct build make.conf ($NANO_MAKE_CONF)"
152148422Sphk
153148648Sphk	echo "${CONF_WORLD}" > ${NANO_MAKE_CONF}
154148648Sphk	echo "${CONF_BUILD}" >> ${NANO_MAKE_CONF}
155148422Sphk)
156148422Sphk
157148422Sphkbuild_world ( ) (
158148422Sphk	echo "## run buildworld"
159148422Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.bw"
160148422Sphk
161148422Sphk	cd ${NANO_SRC}
162148422Sphk	${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} buildworld \
163148422Sphk		> ${MAKEOBJDIRPREFIX}/_.bw 2>&1
164148422Sphk)
165148422Sphk
166148422Sphkbuild_kernel ( ) (
167150321Sphk	echo "## build kernel ($NANO_KERNEL)"
168148422Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.bk"
169148422Sphk
170148422Sphk	if [ -f ${NANO_KERNEL} ] ; then
171148422Sphk		cp ${NANO_KERNEL} ${NANO_SRC}/sys/${NANO_ARCH}/conf
172148422Sphk	fi
173148422Sphk
174181083Ssam	(cd ${NANO_SRC};
175181083Ssam	# unset these just in case to avoid compiler complaints
176181083Ssam	# when cross-building
177181083Ssam	unset TARGET_CPUTYPE
178181083Ssam	unset TARGET_BIG_ENDIAN
179148422Sphk	${NANO_PMAKE} buildkernel \
180163922Sn_hibma		__MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=`basename ${NANO_KERNEL}` \
181148422Sphk		> ${MAKEOBJDIRPREFIX}/_.bk 2>&1
182181083Ssam	)
183148422Sphk)
184148422Sphk
185148422Sphkclean_world ( ) (
186148422Sphk	echo "## Clean and create world directory (${NANO_WORLDDIR})"
187148422Sphk	if rm -rf ${NANO_WORLDDIR}/ > /dev/null 2>&1 ; then
188148422Sphk		true
189148422Sphk	else
190148422Sphk		chflags -R noschg ${NANO_WORLDDIR}/
191148422Sphk		rm -rf ${NANO_WORLDDIR}/
192148422Sphk	fi
193148422Sphk	mkdir -p ${NANO_WORLDDIR}/
194148422Sphk)
195148422Sphk
196148422Sphkmake_conf_install ( ) (
197148422Sphk	echo "## Construct install make.conf ($NANO_MAKE_CONF)"
198148422Sphk
199148648Sphk	echo "${CONF_WORLD}" > ${NANO_MAKE_CONF}
200148648Sphk	echo "${CONF_INSTALL}" >> ${NANO_MAKE_CONF}
201148422Sphk)
202148422Sphk
203148422Sphkinstall_world ( ) (
204148422Sphk	echo "## installworld"
205148422Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.iw"
206148422Sphk
207148422Sphk	cd ${NANO_SRC}
208148422Sphk	${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} installworld \
209148422Sphk		DESTDIR=${NANO_WORLDDIR} \
210148422Sphk		> ${MAKEOBJDIRPREFIX}/_.iw 2>&1
211148422Sphk	chflags -R noschg ${NANO_WORLDDIR}
212148422Sphk)
213148422Sphk
214148422Sphkinstall_etc ( ) (
215148422Sphk
216148422Sphk	echo "## install /etc"
217148422Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.etc"
218148422Sphk
219160783Sthomas	cd ${NANO_SRC}
220148422Sphk	${NANO_PMAKE} __MAKE_CONF=${NANO_MAKE_CONF} distribution \
221148422Sphk		DESTDIR=${NANO_WORLDDIR} \
222148422Sphk		> ${MAKEOBJDIRPREFIX}/_.etc 2>&1
223148422Sphk)
224148422Sphk
225148422Sphkinstall_kernel ( ) (
226148422Sphk	echo "## install kernel"
227148422Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.ik"
228148422Sphk
229148422Sphk	cd ${NANO_SRC}
230148422Sphk	${NANO_PMAKE} installkernel \
231148422Sphk		DESTDIR=${NANO_WORLDDIR} \
232164660Sn_hibma		__MAKE_CONF=${NANO_MAKE_CONF} KERNCONF=`basename ${NANO_KERNEL}` \
233148422Sphk		> ${MAKEOBJDIRPREFIX}/_.ik 2>&1
234148422Sphk)
235148422Sphk
236150366Sphkrun_customize() (
237150366Sphk
238150366Sphk	echo "## run customize scripts"
239150366Sphk	for c in $NANO_CUSTOMIZE
240150366Sphk	do
241150366Sphk		echo "## customize \"$c\""
242150366Sphk		echo "### log: ${MAKEOBJDIRPREFIX}/_.cust.$c"
243150366Sphk		echo "### `type $c`"
244150366Sphk		( $c ) > ${MAKEOBJDIRPREFIX}/_.cust.$c 2>&1
245150366Sphk	done
246150366Sphk)
247150366Sphk
248150366Sphksetup_nanobsd ( ) (
249150366Sphk	echo "## configure nanobsd setup"
250149103Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.dl"
251148422Sphk
252149103Sphk	(
253148422Sphk	cd ${NANO_WORLDDIR}
254148422Sphk
255170607Sphk	# Move /usr/local/etc to /etc/local so that the /cfg stuff
256170607Sphk	# can stomp on it.  Otherwise packages like ipsec-tools which
257170607Sphk	# have hardcoded paths under ${prefix}/etc are not tweakable.
258170607Sphk	if [ -d usr/local/etc ] ; then
259170607Sphk		(
260170607Sphk		mkdir etc/local
261170607Sphk		cd usr/local/etc
262170607Sphk		find . -print | cpio -dumpl ../../../etc/local
263170607Sphk		cd ..
264170607Sphk		rm -rf etc
265170607Sphk		ln -s ../../etc/local etc
266170607Sphk		)
267170607Sphk	fi
268170607Sphk
269149082Sphk	for d in var etc
270149082Sphk	do
271149082Sphk		# link /$d under /conf
272149082Sphk		# we use hard links so we have them both places.
273149082Sphk		# the files in /$d will be hidden by the mount.
274149082Sphk		# XXX: configure /$d ramdisk size
275149082Sphk		mkdir -p conf/base/$d conf/default/$d
276149082Sphk		find $d -print | cpio -dumpl conf/base/
277149082Sphk	done
278148422Sphk
279154466Sphk	echo "$NANO_RAM_ETCSIZE" > conf/base/etc/md_size
280154466Sphk	echo "$NANO_RAM_TMPVARSIZE" > conf/base/var/md_size
281154466Sphk
282148422Sphk	# pick up config files from the special partition
283149082Sphk	echo "mount -o ro /dev/${NANO_DRIVE}s3" > conf/default/etc/remount
284148422Sphk
285149082Sphk	# Put /tmp on the /var ramdisk (could be symlink already)
286149082Sphk	rmdir tmp || true
287149082Sphk	rm tmp || true
288148422Sphk	ln -s var/tmp tmp
289149082Sphk
290149103Sphk	) > ${MAKEOBJDIRPREFIX}/_.dl 2>&1
291148422Sphk)
292148422Sphk
293161341Ssimonsetup_nanobsd_etc ( ) (
294161341Ssimon	echo "## configure nanobsd /etc"
295161341Ssimon
296161341Ssimon	(
297161341Ssimon	cd ${NANO_WORLDDIR}
298161341Ssimon
299161341Ssimon	# create diskless marker file
300161341Ssimon	touch etc/diskless
301161341Ssimon
302170324Sphk	# Make root filesystem R/O by default
303170324Sphk	echo "root_rw_mount=NO" >> etc/defaults/rc.conf
304170324Sphk
305161341Ssimon	# save config file for scripts
306161341Ssimon	echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf
307161341Ssimon
308161341Ssimon	echo "/dev/${NANO_DRIVE}s1a / ufs ro 1 1" > etc/fstab
309161341Ssimon	echo "/dev/${NANO_DRIVE}s3 /cfg ufs rw,noauto 2 2" >> etc/fstab
310161341Ssimon	mkdir -p cfg
311161341Ssimon	)
312161341Ssimon)
313161341Ssimon
314149014Sphkprune_usr() (
315149014Sphk
316149014Sphk	# Remove all empty directories in /usr 
317149014Sphk	find ${NANO_WORLDDIR}/usr -type d -depth -print |
318149014Sphk		while read d
319149014Sphk		do
320149014Sphk			rmdir $d > /dev/null 2>&1 || true 
321149014Sphk		done
322149014Sphk)
323149014Sphk
324148422Sphkcreate_i386_diskimage ( ) (
325149103Sphk	echo "## build diskimage"
326149103Sphk	echo "### log: ${MAKEOBJDIRPREFIX}/_.di"
327148422Sphk
328149103Sphk	(
329149120Sphk	echo $NANO_MEDIASIZE $NANO_IMAGES \
330149120Sphk		$NANO_SECTS $NANO_HEADS \
331149120Sphk		$NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE |
332148422Sphk	awk '
333150717Sphk	{
334149120Sphk		printf "# %s\n", $0
335149120Sphk
336148422Sphk		# size of cylinder in sectors
337149120Sphk		cs = $3 * $4
338148422Sphk
339148422Sphk		# number of full cylinders on media
340148422Sphk		cyl = int ($1 / cs)
341148422Sphk
342149120Sphk		# output fdisk geometry spec, truncate cyls to 1023
343148422Sphk		if (cyl <= 1023)
344149120Sphk			print "g c" cyl " h" $4 " s" $3
345148422Sphk		else
346149120Sphk			print "g c" 1023 " h" $4 " s" $3
347148422Sphk
348149120Sphk		if ($7 > 0) { 
349149120Sphk			# size of data partition in full cylinders
350149120Sphk			dsl = int (($7 + cs - 1) / cs)
351149120Sphk		} else {
352149120Sphk			dsl = 0;
353149120Sphk		}
354148422Sphk
355148422Sphk		# size of config partition in full cylinders
356149120Sphk		csl = int (($6 + cs - 1) / cs)
357148422Sphk
358150717Sphk		if ($5 == 0) {
359149120Sphk			# size of image partition(s) in full cylinders
360149120Sphk			isl = int ((cyl - dsl - csl) / $2)
361149120Sphk		} else {
362149120Sphk			isl = int (($5 + cs - 1) / cs)
363149120Sphk		}
364148422Sphk
365148422Sphk		# First image partition start at second track
366149120Sphk		print "p 1 165 " $3, isl * cs - $3
367148422Sphk		c = isl * cs;
368148422Sphk
369148422Sphk		# Second image partition (if any) also starts offset one 
370148422Sphk		# track to keep them identical.
371148422Sphk		if ($2 > 1) {
372149120Sphk			print "p 2 165 " $3 + c, isl * cs - $3
373148422Sphk			c += isl * cs;
374148422Sphk		}
375148422Sphk
376148422Sphk		# Config partition starts at cylinder boundary.
377148422Sphk		print "p 3 165 " c, csl * cs
378148422Sphk		c += csl * cs
379148422Sphk
380148422Sphk		# Data partition (if any) starts at cylinder boundary.
381149120Sphk		if ($7 > 0) {
382148422Sphk			print "p 4 165 " c, dsl * cs
383174936Ssimon		} else if ($7 < 0 && $1 > c) {
384174936Ssimon			print "p 4 165 " c, $1 - c
385150717Sphk		} else if ($1 < c) {
386150717Sphk			print "Disk space overcommitted by", \
387150717Sphk			    c - $1, "sectors" > "/dev/stderr"
388150717Sphk			exit 2
389148422Sphk		}
390150717Sphk	}
391148422Sphk	' > ${MAKEOBJDIRPREFIX}/_.fdisk
392148422Sphk
393175258Ssimon	IMG=${NANO_DISKIMGDIR}/_.disk.full
394148422Sphk	MNT=${MAKEOBJDIRPREFIX}/_.mnt
395148422Sphk	mkdir -p ${MNT}
396148422Sphk
397175258Ssimon	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
398175258Ssimon		MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} \
399175258Ssimon			-y ${NANO_HEADS}`
400175258Ssimon	else
401175258Ssimon		echo "Creating md backing file..."
402175258Ssimon		dd if=/dev/zero of=${IMG} bs=${NANO_SECTS}b \
403175258Ssimon			count=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}`
404175258Ssimon		MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} \
405175258Ssimon			-y ${NANO_HEADS}`
406175258Ssimon	fi
407148422Sphk
408149014Sphk	trap "df -i ${MNT} ; umount ${MNT} || true ; mdconfig -d -u $MD" 1 2 15 EXIT
409148422Sphk
410148422Sphk	fdisk -i -f ${MAKEOBJDIRPREFIX}/_.fdisk ${MD}
411149120Sphk	fdisk ${MD}
412148422Sphk	# XXX: params
413148422Sphk	# XXX: pick up cached boot* files, they may not be in image anymore.
414168894Sadrian	boot0cfg -B -b ${NANO_WORLDDIR}/${NANO_BOOTLOADER} ${NANO_BOOT0CFG} ${MD}
415160388Sthomas	bsdlabel -w -B -b ${NANO_WORLDDIR}/boot/boot ${MD}s1
416149120Sphk	bsdlabel ${MD}s1
417148422Sphk
418148422Sphk	# Create first image
419148648Sphk	newfs ${NANO_NEWFS} /dev/${MD}s1a
420148422Sphk	mount /dev/${MD}s1a ${MNT}
421149014Sphk	df -i ${MNT}
422175258Ssimon	echo "Copying worlddir..."
423148422Sphk	( cd ${NANO_WORLDDIR} && find . -print | cpio -dump ${MNT} )
424148422Sphk	df -i ${MNT}
425175258Ssimon	echo "Generating mtree..."
426148648Sphk	( cd ${MNT} && mtree -c ) > ${MAKEOBJDIRPREFIX}/_.mtree
427148648Sphk	( cd ${MNT} && du -k ) > ${MAKEOBJDIRPREFIX}/_.du
428148422Sphk	umount ${MNT}
429148422Sphk
430171986Sphk	if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
431148422Sphk		# Duplicate to second image (if present)
432175258Ssimon		echo "Duplicating to second image..."
433148422Sphk		dd if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k
434170322Sphk		mount /dev/${MD}s2a ${MNT}
435170322Sphk		for f in ${MNT}/etc/fstab ${MNT}/conf/base/etc/fstab
436170322Sphk		do
437170322Sphk			sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/g" $f
438170322Sphk		done
439170322Sphk		umount ${MNT}
440170322Sphk
441148422Sphk	fi
442148422Sphk	
443148422Sphk	# Create Config slice
444148648Sphk	newfs ${NANO_NEWFS} /dev/${MD}s3
445148422Sphk	# XXX: fill from where ?
446148422Sphk
447148422Sphk	# Create Data slice, if any.
448148422Sphk	if [ $NANO_DATASIZE -gt 0 ] ; then
449148648Sphk		newfs ${NANO_NEWFS} /dev/${MD}s4
450148422Sphk		# XXX: fill from where ?
451148422Sphk	fi
452148422Sphk
453175258Ssimon	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
454175258Ssimon		echo "Writing out _.disk.full..."
455175258Ssimon		dd if=/dev/${MD} of=${IMG} bs=64k
456175258Ssimon	fi
457175258Ssimon
458175258Ssimon	echo "Writing out _.disk.image..."
459175258Ssimon	dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
460148422Sphk	mdconfig -d -u $MD
461149103Sphk	) > ${MAKEOBJDIRPREFIX}/_.di 2>&1
462148422Sphk)
463148422Sphk
464154466Sphklast_orders () (
465154466Sphk	# Redefine this function with any last orders you may have
466154466Sphk	# after the build completed, for instance to copy the finished
467154466Sphk	# image to a more convenient place:
468154466Sphk	# cp ${MAKEOBJDIRPREFIX}/_.disk.image /home/ftp/pub/nanobsd.disk
469154466Sphk)
470154466Sphk
471148422Sphk#######################################################################
472148422Sphk#
473150366Sphk# Optional convenience functions.
474148422Sphk#
475148422Sphk#######################################################################
476148422Sphk
477149014Sphk#######################################################################
478150367Sphk# Common Flash device geometries
479150367Sphk#
480150367Sphk
481150367SphkFlashDevice () {
482150717Sphk	if [ -d ${NANO_TOOLS} ] ; then
483150717Sphk		. ${NANO_TOOLS}/FlashDevice.sub
484150717Sphk	else
485150717Sphk		. ${NANO_SRC}/${NANO_TOOLS}/FlashDevice.sub
486150717Sphk	fi
487150367Sphk	sub_FlashDevice $1 $2
488150367Sphk}
489150367Sphk
490150367Sphk
491150367Sphk#######################################################################
492150366Sphk# Setup serial console
493150343Sphk
494150366Sphkcust_comconsole () (
495150366Sphk	# Enable getty on console
496181459Sphk	sed -i "" -e /ttyu0/s/off/on/ ${NANO_WORLDDIR}/etc/ttys
497150366Sphk
498150366Sphk	# Disable getty on syscons devices
499150366Sphk	sed -i "" -e '/^ttyv[0-8]/s/	on/	off/' ${NANO_WORLDDIR}/etc/ttys
500150366Sphk
501150366Sphk	# Tell loader to use serial console early.
502150366Sphk	echo " -h" > ${NANO_WORLDDIR}/boot.config
503150366Sphk)
504150366Sphk
505150366Sphk#######################################################################
506150366Sphk# Allow root login via ssh
507150366Sphk
508150366Sphkcust_allow_ssh_root () (
509150366Sphk	sed -i "" -e '/PermitRootLogin/s/.*/PermitRootLogin yes/' \
510150366Sphk	    ${NANO_WORLDDIR}/etc/ssh/sshd_config
511150366Sphk)
512150366Sphk
513150366Sphk#######################################################################
514150366Sphk# Install the stuff under ./Files
515150366Sphk
516150366Sphkcust_install_files () (
517150511Ssimon	cd ${NANO_TOOLS}/Files
518150366Sphk	find . -print | grep -v /CVS | cpio -dumpv ${NANO_WORLDDIR}
519150366Sphk)
520150366Sphk
521150366Sphk#######################################################################
522170607Sphk# Install packages from ${NANO_PACKAGE_DIR}
523170607Sphk
524170607Sphkcust_pkg () (
525170607Sphk
526170607Sphk	# Copy packages into chroot
527170607Sphk	mkdir -p ${NANO_WORLDDIR}/Pkg
528170607Sphk	cp ${NANO_PACKAGE_DIR}/* ${NANO_WORLDDIR}/Pkg
529170607Sphk
530170607Sphk	# Count & report how many we have to install
531170607Sphk	todo=`ls ${NANO_WORLDDIR}/Pkg | wc -l`
532170607Sphk	echo "=== TODO: $todo"
533170607Sphk	ls ${NANO_WORLDDIR}/Pkg
534170607Sphk	echo "==="
535170607Sphk	while true
536170607Sphk	do
537170607Sphk		# Record how may we have now
538170607Sphk		have=`ls ${NANO_WORLDDIR}/var/db/pkg | wc -l`
539170607Sphk
540171986Sphk		# Attempt to install more packages
541171986Sphk		# ...but no more than 200 at a time due to pkg_add's internal
542171986Sphk		# limitations.
543171986Sphk		chroot ${NANO_WORLDDIR} sh -c \
544171986Sphk			'ls Pkg/*tbz | xargs -n 200 pkg_add -F' || true
545170607Sphk
546170607Sphk		# See what that got us
547170607Sphk		now=`ls ${NANO_WORLDDIR}/var/db/pkg | wc -l`
548170607Sphk		echo "=== NOW $now"
549170607Sphk		ls ${NANO_WORLDDIR}/var/db/pkg
550170607Sphk		echo "==="
551170607Sphk
552170607Sphk
553170607Sphk		if [ $now -eq $todo ] ; then
554170607Sphk			echo "DONE $now packages"
555170607Sphk			break
556170607Sphk		elif [ $now -eq $have ] ; then
557170607Sphk			echo "FAILED: Nothing happened on this pass"
558170607Sphk			exit 2
559170607Sphk		fi
560170607Sphk	done
561170607Sphk	rm -rf ${NANO_WORLDDIR}/Pkg
562170607Sphk)
563170607Sphk
564170607Sphk#######################################################################
565150366Sphk# Convenience function:
566150366Sphk# 	Register $1 as customize function.
567150366Sphk
568150343Sphkcustomize_cmd () {
569150343Sphk	NANO_CUSTOMIZE="$NANO_CUSTOMIZE $1"
570150343Sphk}
571150343Sphk
572150343Sphk#######################################################################
573150366Sphk#
574150366Sphk# All set up to go...
575150366Sphk#
576150366Sphk#######################################################################
577150366Sphk
578156496Sphkusage () {
579156496Sphk	(
580156496Sphk	echo "Usage: $0 [-b/-k/-w] [-c config_file]"
581156496Sphk	echo "	-b	suppress builds (both kernel and world)"
582156496Sphk	echo "	-k	suppress buildkernel"
583156496Sphk	echo "	-w	suppress buildworld"
584181460Sphk	echo "  -i	suppress disk image build"
585156496Sphk	echo "	-c	specify config file"
586156496Sphk	) 1>&2
587156496Sphk	exit 2
588156496Sphk}
589156496Sphk
590150366Sphk#######################################################################
591149014Sphk# Parse arguments
592148422Sphk
593156496Sphkdo_kernel=true
594156496Sphkdo_world=true
595181460Sphkdo_image=true
596150366Sphk
597156496Sphkset +e
598181460Sphkargs=`getopt bc:hkwi $*`
599149014Sphkif [ $? -ne 0 ] ; then
600156496Sphk	usage
601149014Sphk	exit 2
602149014Sphkfi
603156496Sphkset -e
604149014Sphk
605149014Sphkset -- $args
606149014Sphkfor i
607149014Sphkdo
608149014Sphk	case "$i" 
609149014Sphk	in
610150366Sphk	-b)
611150366Sphk		shift;
612156496Sphk		do_world=false
613156496Sphk		do_kernel=false
614150366Sphk		;;
615156496Sphk	-k)
616156496Sphk		shift;
617156496Sphk		do_kernel=false
618156496Sphk		;;
619149014Sphk	-c)
620149014Sphk		. "$2"
621149014Sphk		shift;
622149014Sphk		shift;
623149014Sphk		;;
624150366Sphk	-h)
625156496Sphk		usage
626150366Sphk		;;
627181460Sphk	-i)
628181460Sphk		do_image=false
629156496Sphk	-w)
630156496Sphk		shift;
631156496Sphk		do_world=false
632156496Sphk		;;
633149014Sphk	--)
634149014Sphk		shift;
635149014Sphk		break;
636149014Sphk	esac
637149014Sphkdone
638149014Sphk
639150366Sphkif [ $# -gt 0 ] ; then
640156496Sphk	echo "$0: Extraneous arguments supplied"
641156496Sphk	usage
642150366Sphkfi
643150366Sphk
644148422Sphk#######################################################################
645150366Sphk# Setup and Export Internal variables
646150366Sphk#
647148422Sphkif [ "x${NANO_OBJ}" = "x" ] ; then
648148422Sphk	MAKEOBJDIRPREFIX=/usr/obj/nanobsd.${NANO_NAME}/
649149073Sphk	NANO_OBJ=${MAKEOBJDIRPREFIX}
650148422Sphkelse
651148422Sphk	MAKEOBJDIRPREFIX=${NANO_OBJ}
652148422Sphkfi
653148422Sphk
654175258Ssimonif [ "x${NANO_DISKIMGDIR}" = "x" ] ; then
655175258Ssimon	NANO_DISKIMGDIR=${MAKEOBJDIRPREFIX}
656175258Ssimonfi
657175258Ssimon
658148422SphkNANO_WORLDDIR=${MAKEOBJDIRPREFIX}/_.w
659148422SphkNANO_MAKE_CONF=${MAKEOBJDIRPREFIX}/make.conf
660148422Sphk
661150511Ssimonif [ -d ${NANO_TOOLS} ] ; then
662150511Ssimon	true
663150511Ssimonelif [ -d ${NANO_SRC}/${NANO_TOOLS} ] ; then
664150511Ssimon	NANO_TOOLS=${NANO_SRC}/${NANO_TOOLS}
665150511Ssimonelse
666150511Ssimon	echo "NANO_TOOLS directory does not exist" 1>&2
667150511Ssimon	exit 1
668150511Ssimonfi
669150511Ssimon
670148422Sphkexport MAKEOBJDIRPREFIX
671148422Sphk
672148422Sphkexport NANO_ARCH
673149120Sphkexport NANO_CODESIZE
674148422Sphkexport NANO_CONFSIZE
675149073Sphkexport NANO_CUSTOMIZE
676148422Sphkexport NANO_DATASIZE
677149082Sphkexport NANO_DRIVE
678148422Sphkexport NANO_HEADS
679148648Sphkexport NANO_IMAGES
680148648Sphkexport NANO_MAKE_CONF
681149120Sphkexport NANO_MEDIASIZE
682148648Sphkexport NANO_NAME
683148648Sphkexport NANO_NEWFS
684148648Sphkexport NANO_OBJ
685148422Sphkexport NANO_PMAKE
686148648Sphkexport NANO_SECTS
687148422Sphkexport NANO_SRC
688150366Sphkexport NANO_TOOLS
689148648Sphkexport NANO_WORLDDIR
690168894Sadrianexport NANO_BOOT0CFG
691168894Sadrianexport NANO_BOOTLOADER
692148422Sphk
693148422Sphk#######################################################################
694150366Sphk# And then it is as simple as that...
695148422Sphk
696156496Sphkif $do_world ; then
697150366Sphk	clean_build
698150366Sphk	make_conf_build
699150366Sphk	build_world
700156496Sphkelse
701156496Sphk	echo "## Skipping buildworld (as instructed)"
702156496Sphkfi
703156496Sphk
704156496Sphkif $do_kernel ; then
705150366Sphk	build_kernel
706150366Sphkelse
707156496Sphk	echo "## Skipping buildkernel (as instructed)"
708150366Sphkfi
709149120Sphk
710149120Sphkclean_world
711149082Sphkmake_conf_install
712148422Sphkinstall_world
713148422Sphkinstall_etc
714161341Ssimonsetup_nanobsd_etc
715148422Sphkinstall_kernel
716149120Sphk
717149082Sphkrun_customize
718150366Sphksetup_nanobsd
719149014Sphkprune_usr
720181460Sphkif $do_image ; then
721181460Sphk	create_${NANO_ARCH}_diskimage
722181460Sphkelse
723181460Sphk	echo "## Skipping image build (as instructed)"
724181460Sphkfi
725154466Sphklast_orders
726149120Sphk
727149120Sphkecho "# NanoBSD image completed"
728