1186979Ssam# $FreeBSD$
2186979Ssam
3191246SsamNANO_CFGDIR=${NANO_CFGDIR:-${NANO_SRC}/${NANO_TOOLS}/gateworks/cfg}
4186979Ssamtest -d ${NANO_CFGDIR} || NANO_CFGDIR=/var/empty
5186979SsamNANO_PMAKE="make"					# NB: disable -j 3
6186979Ssam
7226242SthompsaNANO_ARCH=armeb
8186979SsamTARGET_CPUTYPE=xscale; export TARGET_CPUTYPE		# XXX
9186979Ssam
10186979SsamNANO_CUSTOMIZE="cust_allow_ssh_root"
11186979Ssam
12186979Ssamclean_usr_local()
13186979Ssam{
14186979Ssam	LOCAL_DIR=${NANO_WORLDDIR}/usr/local
15186979Ssam	pprint 2 "Clean and create world directory (${LOCAL_DIR})"
16186979Ssam	if rm -rf ${LOCAL_DIR}/ > /dev/null 2>&1 ; then
17186979Ssam		true
18186979Ssam	else
19186979Ssam		chflags -R noschg ${LOCAL_DIR}/
20186979Ssam		rm -rf ${LOCAL_DIR}/
21186979Ssam	fi
22186979Ssam	for f in bin etc lib libdata libexec sbin share; do
23186979Ssam		mkdir -p ${LOCAL_DIR}/$f
24186979Ssam	done
25186979Ssam}
26186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE clean_usr_local"
27186979Ssam
28186979Ssamcust_install_machine_files()
29186979Ssam{
30186979Ssam	echo "cd ${NANO_TOOLS}/gateworks/Files"
31186979Ssam	cd ${NANO_TOOLS}/gateworks/Files
32186979Ssam	find . -print | grep -Ev '/(CVS|\.svn)' | cpio -dumpv ${NANO_WORLDDIR}
33186979Ssam}
34186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE cust_install_files cust_install_machine_files"
35186979Ssam
36186979Ssambuildenv()
37186979Ssam{
38186979Ssam	cd ${NANO_SRC}
39205994Simp	env TARGET_ARCH=${NANO_ARCH} __MAKE_CONF=${NANO_MAKE_CONF_BUILD} \
40186979Ssam	    DESTDIR=${NANO_WORLDDIR} make buildenv
41186979Ssam}
42186979Ssam
43186979Ssamnet80211_tools()
44186979Ssam{
45186979Ssam	for f in wlanstats wlanwds wlanwatch; do 
46186979Ssam		echo "(cd tools/tools/net80211/$f; make $1)"; 
47186979Ssam	done | buildenv
48186979Ssam}
49186979Ssamnet80211_clean_tools()
50186979Ssam{
51186979Ssam	net80211_tools "clean"
52186979Ssam}
53186979Ssamnet80211_build_tools()
54186979Ssam{
55186979Ssam	net80211_tools ""
56186979Ssam}
57186979Ssamnet80211_install_tools()
58186979Ssam{
59186979Ssam	net80211_tools "install"
60186979Ssam}
61186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE net80211_clean_tools"
62186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE net80211_build_tools"
63186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE net80211_install_tools"
64186979Ssam
65186979Ssamath_clean_tools()
66186979Ssam{
67186979Ssam	echo "cd tools/tools/ath; make clean" | buildenv
68186979Ssam}
69186979Ssamath_build_tools()
70186979Ssam{
71186979Ssam	echo "cd tools/tools/ath; make" | buildenv
72186979Ssam}
73186979Ssamath_install_tools()
74186979Ssam{
75186979Ssam	echo "cd tools/tools/ath; make install" | buildenv
76186979Ssam}
77186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE ath_clean_tools"
78186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE ath_build_tools"
79186979SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE ath_install_tools"
80186979Ssam
81192662Ssamnpe_clean_tools()
82192662Ssam{
83192662Ssam	echo "cd tools/tools/npe; make clean" | buildenv
84192662Ssam}
85192662Ssamnpe_build_tools()
86192662Ssam{
87192662Ssam	echo "cd tools/tools/npe; make" | buildenv
88192662Ssam}
89192662Ssamnpe_install_tools()
90192662Ssam{
91192662Ssam	echo "cd tools/tools/npe; make install" | buildenv
92192662Ssam}
93192662SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE npe_clean_tools"
94192662SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE npe_build_tools"
95192662SsamNANO_CUSTOMIZE="$NANO_CUSTOMIZE npe_install_tools"
96192662Ssam
97186979SsamNANO_MAKEFS="makefs -B big \
98186979Ssam	-o bsize=4096,fsize=512,density=8192,optimization=space"
99186979Ssamexport NANO_MAKEFS
100186979Ssam
101186979Ssam# NB: leave c++ enabled so devd can be built
102186979SsamCONF_BUILD="
103216930SimpWITHOUT_ACCT=true
104186979SsamWITHOUT_ACPI=true
105216930SimpWITHOUT_APM=true
106186979SsamWITHOUT_ATM=true
107186979SsamWITHOUT_AUDIT=true
108186979SsamWITHOUT_BIND_DNSSEC=true
109186979SsamWITHOUT_BIND_ETC=true
110186979SsamWITHOUT_BIND_LIBS_LWRES=true
111186979SsamWITHOUT_BLUETOOTH=true
112216930SimpWITHOUT_BSNMP=true
113186979SsamWITHOUT_CALENDAR=true
114186979SsamWITHOUT_CDDL=true
115216930SimpWITHOUT_CTM=true
116186979SsamWITHOUT_DICT=true
117186979SsamWITHOUT_EXAMPLES=true
118216930SimpWITHOUT_FLOPPY=true
119186979SsamWITHOUT_FORTRAN=true
120186979SsamWITHOUT_GAMES=true
121186979SsamWITHOUT_GCOV=true
122186979SsamWITHOUT_GPIB=true
123216930SimpWITHOUT_GROFF=true
124186979SsamWITHOUT_HTML=true
125186979SsamWITHOUT_INET6=true
126186979SsamWITHOUT_INFO=true
127186979SsamWITHOUT_IPFILTER=true
128186979SsamWITHOUT_KERBEROS=true
129186979SsamWITHOUT_LOCALES=true
130186979SsamWITHOUT_LPR=true
131186979SsamWITHOUT_MAN=true
132216930SimpWITHOUT_MAIL=true
133216930SimpWITHOUT_MAILWRAPPER=true
134186979SsamWITHOUT_NETCAT=true
135186979SsamWITHOUT_NIS=true
136186979SsamWITHOUT_NLS=true
137186979SsamWITHOUT_NS_CACHING=true
138186979SsamWITHOUT_OBJC=true
139216930SimpWITHOUT_PMC=true
140216930SimpWITHOUT_PORTSNAP=true
141186979SsamWITHOUT_PROFILE=true
142216930SimpWITHOUT_QUOTAS=true
143186979SsamWITHOUT_RCMDS=true
144186979SsamWITHOUT_RCS=true
145186979SsamWITHOUT_RESCUE=true
146186979SsamWITHOUT_SENDMAIL=true
147186979SsamWITHOUT_SHAREDOCS=true
148186979SsamWITHOUT_SSP=true
149186979SsamWITHOUT_SYSCONS=true
150216930SimpWITHOUT_SYSINSTALL=true
151186979SsamWITHOUT_TCSH=true
152216930SimpWITHOUT_TFTPD=true
153216930SimpWITHOUT_ZFS=true
154186979Ssam"
155186979SsamCONF_INSTALL="$CONF_BUILD
156186979SsamWITHOUT_TOOLCHAIN=true
157186979SsamWITHOUT_INSTALLLIB=true
158205994SimpINSTALL_NODEBUG=true
159186979Ssam"
160186979Ssam
161186979Ssam# NB: override to force / on s1 instead of s1a
162186979Ssamsetup_nanobsd_etc()
163186979Ssam{
164186979Ssam	pprint 2 "configure nanobsd /etc"
165186979Ssam
166186979Ssam	(
167186979Ssam	cd ${NANO_WORLDDIR}
168186979Ssam
169186979Ssam	# create diskless marker file
170186979Ssam	touch etc/diskless
171186979Ssam
172186979Ssam	# Make root filesystem R/O by default
173186979Ssam	echo "root_rw_mount=NO" >> etc/defaults/rc.conf
174186979Ssam
175186979Ssam	# save config file for scripts
176186979Ssam	echo "NANO_DRIVE=${NANO_DRIVE}" > etc/nanobsd.conf
177186979Ssam
178186979Ssam	echo "/dev/${NANO_DRIVE}s1 / ufs ro 1 1" > etc/fstab
179186979Ssam	echo "/dev/${NANO_DRIVE}s3 /cfg ufs rw,noauto 2 2" >> etc/fstab
180186979Ssam	mkdir -p cfg
181186979Ssam	)
182186979Ssam}
183186979Ssam
184186979Ssamcreate_arm_diskimage()
185186979Ssam{
186186979Ssam	pprint 2 "build diskimage"
187186979Ssam	pprint 3 "log: ${MAKEOBJDIRPREFIX}/_.di"
188186979Ssam
189186979Ssam	(
190186979Ssam	echo "NANO_MEDIASIZE:	$NANO_MEDIASIZE"
191186979Ssam	echo "NANO_IMAGES:	$NANO_IMAGES"
192186979Ssam	echo "NANO_SECTS:	$NANO_SECTS"
193186979Ssam	echo "NANO_HEADS:	$NANO_HEADS"
194186979Ssam	echo "NANO_CODESIZE:	$NANO_CODESIZE"
195186979Ssam	echo "NANO_CONFSIZE:	$NANO_CONFSIZE"
196186979Ssam	echo "NANO_DATASIZE:	$NANO_DATASIZE"
197186979Ssam
198186979Ssam	echo $NANO_MEDIASIZE $NANO_IMAGES \
199186979Ssam		$NANO_SECTS $NANO_HEADS \
200186979Ssam		$NANO_CODESIZE $NANO_CONFSIZE $NANO_DATASIZE |
201186979Ssam	awk '
202186979Ssam	{
203186979Ssam		printf "# %s\n", $0
204186979Ssam
205186979Ssam		# size of cylinder in sectors
206186979Ssam		cs = $3 * $4
207186979Ssam
208186979Ssam		# number of full cylinders on media
209186979Ssam		cyl = int ($1 / cs)
210186979Ssam
211186979Ssam		# output fdisk geometry spec, truncate cyls to 1023
212186979Ssam		if (cyl <= 1023)
213186979Ssam			print "g c" cyl " h" $4 " s" $3
214186979Ssam		else
215186979Ssam			print "g c" 1023 " h" $4 " s" $3
216186979Ssam
217186979Ssam		if ($7 > 0) { 
218186979Ssam			# size of data partition in full cylinders
219186979Ssam			dsl = int (($7 + cs - 1) / cs)
220186979Ssam		} else {
221186979Ssam			dsl = 0;
222186979Ssam		}
223186979Ssam
224186979Ssam		# size of config partition in full cylinders
225186979Ssam		csl = int (($6 + cs - 1) / cs)
226186979Ssam
227186979Ssam		if ($5 == 0) {
228186979Ssam			# size of image partition(s) in full cylinders
229186979Ssam			isl = int ((cyl - dsl - csl) / $2)
230186979Ssam		} else {
231186979Ssam			isl = int (($5 + cs - 1) / cs)
232186979Ssam		}
233186979Ssam
234186979Ssam		# First image partition start at second track
235186979Ssam		print "p 1 165 " $3, isl * cs - $3
236186979Ssam		c = isl * cs;
237186979Ssam
238186979Ssam		# Second image partition (if any) also starts offset one 
239186979Ssam		# track to keep them identical.
240186979Ssam		if ($2 > 1) {
241186979Ssam			print "p 2 165 " $3 + c, isl * cs - $3
242186979Ssam			c += isl * cs;
243186979Ssam		}
244186979Ssam
245186979Ssam		# Config partition starts at cylinder boundary.
246186979Ssam		print "p 3 165 " c, csl * cs
247186979Ssam		c += csl * cs
248186979Ssam
249186979Ssam		# Data partition (if any) starts at cylinder boundary.
250186979Ssam		if ($7 > 0) {
251186979Ssam			print "p 4 165 " c, dsl * cs
252186979Ssam		} else if ($7 < 0 && $1 > c) {
253186979Ssam			print "p 4 165 " c, $1 - c
254186979Ssam		} else if ($1 < c) {
255186979Ssam			print "Disk space overcommitted by", \
256186979Ssam			    c - $1, "sectors" > "/dev/stderr"
257186979Ssam			exit 2
258186979Ssam		}
259186979Ssam
260186979Ssam		# Force slice 1 to be marked active. This is necessary
261186979Ssam		# for booting the image from a USB device to work.
262186979Ssam		print "a 1"
263186979Ssam	}
264186979Ssam	' > ${MAKEOBJDIRPREFIX}/_.fdisk
265186979Ssam
266186979Ssam	IMG=${NANO_DISKIMGDIR}/${NANO_IMGNAME}
267186979Ssam	BS=${NANO_SECTS}b
268186979Ssam
269186979Ssam	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
270186979Ssam		MD=`mdconfig -a -t swap -s ${NANO_MEDIASIZE} -x ${NANO_SECTS} \
271186979Ssam			-y ${NANO_HEADS}`
272186979Ssam	else
273186979Ssam		echo ""; echo "Creating md backing file ${IMG} ..."
274186979Ssam		_c=`expr ${NANO_MEDIASIZE} / ${NANO_SECTS}`
275186979Ssam		pprint 2 "dd if=/dev/zero of=${IMG} bs=${BS} count=${_c}"
276186979Ssam		dd if=/dev/zero of=${IMG} bs=${BS} count=${_c}
277186979Ssam		pprint 2 "mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} -y ${NANO_HEADS}"
278186979Ssam		MD=`mdconfig -a -t vnode -f ${IMG} -x ${NANO_SECTS} \
279186979Ssam			-y ${NANO_HEADS}`
280186979Ssam	fi
281186979Ssam
282186979Ssam	trap "mdconfig -d -u $MD" 1 2 15 EXIT
283186979Ssam
284186979Ssam	echo ""; echo "Write partition table ..."
285186979Ssam	FDISK=${MAKEOBJDIRPREFIX}/_.fdisk
286186979Ssam	pprint 2 "fdisk -i -f ${FDISK} ${MD}"
287186979Ssam	fdisk -i -f ${FDISK} ${MD}
288186979Ssam	pprint 2 "fdisk ${MD}"
289186979Ssam	fdisk ${MD}
290186979Ssam
291186979Ssam	# Create first image
292186979Ssam	IMG1=${NANO_DISKIMGDIR}/_.disk.image1
293186979Ssam	echo ""; echo "Create first image ${IMG1} ..."
294186979Ssam	SIZE=`awk '/^p 1/ { print $5 "b" }' ${FDISK}`
295186979Ssam	pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}"
296186979Ssam	${NANO_MAKEFS} -s ${SIZE} ${IMG1} ${NANO_WORLDDIR}
297186979Ssam	pprint 2 "dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}"
298186979Ssam	dd if=${IMG1} of=/dev/${MD}s1 bs=${BS}
299186979Ssam
300186979Ssam	if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
301186979Ssam		IMG2=${NANO_DISKIMGDIR}/_.disk.image2
302186979Ssam		echo ""; echo "Create second image ${IMG2}..."
303186979Ssam		for f in ${NANO_WORLDDIR}/etc/fstab ${NANO_WORLDDIR}/conf/base/etc/fstab
304186979Ssam		do
305186979Ssam			sed -i "" "s/${NANO_DRIVE}s1/${NANO_DRIVE}s2/g" $f
306186979Ssam		done
307186979Ssam
308186979Ssam		SIZE=`awk '/^p 2/ { print $5 "b" }' ${FDISK}`
309186979Ssam		pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}"
310186979Ssam		${NANO_MAKEFS} -s ${SIZE} ${IMG2} ${NANO_WORLDDIR}
311186979Ssam		pprint 2 "dd if=${IMG2} of=/dev/${MD}s2 bs=${BS}"
312186979Ssam		dd if=${IMG2} of=/dev/${MD}s2 bs=${BS}
313186979Ssam	fi
314186979Ssam
315186979Ssam	# Create Config slice
316186979Ssam	CFG=${NANO_DISKIMGDIR}/_.disk.cfg
317186979Ssam	echo ""; echo "Creating config partition ${CFG}..."
318186979Ssam	SIZE=`awk '/^p 3/ { print $5 "b" }' ${FDISK}`
319186979Ssam	# XXX: fill from where ?
320186979Ssam	pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}"
321186979Ssam	${NANO_MAKEFS} -s ${SIZE} ${CFG} ${NANO_CFGDIR}
322186979Ssam	pprint 2 "dd if=${CFG} of=/dev/${MD}s3 bs=${BS}"
323186979Ssam	dd if=${CFG} of=/dev/${MD}s3 bs=${BS}
324186979Ssam	pprint 2 "rm ${CFG}"
325186979Ssam	rm ${CFG}; CFG=			# NB: disable printing below
326186979Ssam
327186979Ssam	# Create Data slice, if any.
328186979Ssam	if [ $NANO_DATASIZE -gt 0 ] ; then
329186979Ssam		DATA=${NANO_DISKIMGDIR}/_.disk.data
330186979Ssam		echo ""; echo "Creating data partition ${DATA}..."
331186979Ssam		SIZE=`awk '/^p 4/ { print $5 "b" }' ${FDISK}`
332186979Ssam		# XXX: fill from where ?
333186979Ssam		pprint 2 "${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty"
334186979Ssam		${NANO_MAKEFS} -s ${SIZE} ${DATA} /var/empty
335186979Ssam		pprint 2 "dd if=${DATA} of=/dev/${MD}s4 bs=${BS}"
336186979Ssam		dd if=${DATA} of=/dev/${MD}s4 bs=${BS}
337186979Ssam		pprint 2 "rm ${DATA}"
338186979Ssam		rm ${DATA}; DATA=	# NB: disable printing below
339186979Ssam	fi
340186979Ssam
341186979Ssam	if [ "${NANO_MD_BACKING}" = "swap" ] ; then
342186979Ssam		echo "Writing out _.disk.full..."
343186979Ssam		dd if=/dev/${MD} of=${IMG} bs=${BS}
344186979Ssam	fi
345186979Ssam
346186979Ssam	echo ""
347186979Ssam	echo "Completed images in:"
348186979Ssam	echo ""
349186979Ssam	echo "Full disk:         ${IMG}"
350186979Ssam	echo "Primary partition: ${IMG1}"
351186979Ssam	test "${IMG2}" && echo "2ndary partition:  ${IMG2}"
352186979Ssam	test "${CFG}" &&  echo "/cfg partition:    ${CFG}"
353186979Ssam	test "${DATA}" && echo "/data partition:   ${DATA}"
354186979Ssam	echo ""
355186979Ssam	echo "Use dd if=<file> of=/dev/<somewhere> bs=${BS} to transfer an"
356186979Ssam	echo "image to bootable media /dev/<somewhere>."
357186979Ssam	) > ${MAKEOBJDIRPREFIX}/_.di 2>&1
358186979Ssam}
359