xref: /minix/releasetools/release.sh (revision eb95f895)
1#!/bin/sh
2
3set -e
4
5. ./release.functions
6
7version_pretty="`sh ../sys/conf/osrelease.sh`"
8version="`echo $version_pretty | tr . _`"
9PACKAGEDIR=/usr/pkgsrc/packages/$version_pretty/`uname -m`
10
11SRC=src
12: ${REPO:=git://git.minix3.org/minix}
13: ${GITBRANCH:=master}
14: ${BUILDOPTIONS:=}
15
16# Packages we have to pre-install, and url to use
17: ${PACKAGEURL="http://www.minix3.org/pkgsrc/packages/$version_pretty/`uname -m`/All/"}
18: ${PREINSTALLED_PACKAGES:="pkg_install pkgin"}
19
20# List of packages included on installation media
21PACKAGELIST=packages.install
22secs=`expr 32 '*' 64`
23export SHELL=/bin/sh
24
25PKG_ADD=/usr/pkg/sbin/pkg_add
26PKG_INFO=/usr/pkg/sbin/pkg_info
27
28if [ ! -x $PKG_ADD ]
29then	echo Please install pkg_install from pkgsrc.
30	exit 1
31fi
32
33RELEASERC=$HOME/.releaserc
34
35if [ -f $RELEASERC ]
36then	. $RELEASERC
37fi
38
39set -- $* $RELOPTS
40
41export RELEASEDIR=/usr/r-staging
42RELEASEMNTDIR=/usr/r
43
44IMAGE=/usr/mdec/bootxx_cd9660
45ROOTIMAGE=rootimage
46CDFILES=/usr/tmp/cdreleasefiles
47IMG_BASE=minix${version}_ide
48BS=4096
49
50COPY=0
51JAILMODE=0
52REVTAG=""
53PACKAGES=1
54MINIMAL=0
55MAKEMAP=0
56EXTRAS_INSTALL=0
57EXTRAS_PATH=
58
59# Do we have git?
60if git --version >/dev/null
61then	if [ -d ../.git ]
62	then	LOCAL_REVTAG="`git describe --always`"
63		GITMODE=1
64	fi
65fi
66
67FILENAMEOUT=""
68
69while getopts "b:j:lpmMch?f:L:e:" c
70do
71	case "$c" in
72	\?)
73		echo "Usage: $0 [-l] [-p] [-c] [-m] [-M] [-f <filename>] -j<jaildir> [-L <packageurl>] [-e <extras-path>]" >&2
74		exit 1
75	;;
76	b)
77		GITBRANCH=$OPTARG
78		;;
79	c)
80		echo " * Copying, not using GIT"
81		COPY=1
82		;;
83	p)
84		PACKAGES=0
85		;;
86	j)
87		RELEASEDIR=$OPTARG
88		JAILMODE=1
89		;;
90	f)
91		FILENAMEOUT="$OPTARG"
92		;;
93	m)	MINIMAL=1
94		PACKAGES=0
95		;;
96	M)	MAKEMAP=1
97		;;
98	l)	PACKAGEURL=file://$PACKAGEDIR/All
99		;;
100	L)	PACKAGEURL="$OPTARG"
101		CUSTOM_PACKAGES=1
102		;;
103	e)	EXTRAS_INSTALL=1
104		EXTRAS_PATH="$OPTARG"
105		;;
106	esac
107done
108
109RELEASEPACKAGE=${RELEASEDIR}/usr/install/packages
110
111if [ $GITMODE -ne 1 -a $COPY -ne 1 ]
112then	echo "Need git to retrieve latest minix! Copying src instead!"
113	COPY=1
114fi
115
116if [ ! "$ZIP" ]
117then	ZIP=bzip2
118fi
119
120if [ $PACKAGES -ne 0 ]
121then	mkdir -p $PACKAGEDIR/All || true
122	retrieve $PACKAGEDIR/All $PACKAGELIST packages/`uname -p`/$VERSION_PRETTY
123fi
124
125TMPDISKUSR=/dev/ram0
126TMPDISKROOT=/dev/ram1
127
128if [ ! -b $TMPDISKUSR -o ! $TMPDISKROOT ]
129then	echo "$TMPDISKUSR or $TMPDISKROOT is not a block device.."
130	exit 1
131fi
132
133if [ $TMPDISKUSR = $TMPDISKROOT ]
134then
135	echo "Temporary devices can't be equal."
136	exit
137fi
138
139if [ $JAILMODE = 0 ]
140then	echo " * Cleanup old files"
141	umount $TMPDISKUSR || true
142	umount $TMPDISKROOT || true
143	umount $RELEASEMNTDIR/usr || true
144	umount $RELEASEMNTDIR || true
145fi
146
147rm -rf $RELEASEDIR $RELEASEMNTDIR $IMG $ROOTIMAGE $CDFILES image* || true
148mkdir -p $CDFILES || exit
149mkdir -p $RELEASEDIR $RELEASEMNTDIR
150mkdir -p $RELEASEPACKAGE
151
152##########################################################################
153echo " * Bootstrapping filesystem in $RELEASEDIR"
154##########################################################################
155CONFIGHEADER=$RELEASEDIR/usr/src/minix/include/minix/sys_config.h
156
157copy_local_packages
158
159if [ "$COPY" -ne 1 ]
160then
161	echo "Retrieving latest minix repo from $REPO branch $GITBRANCH."
162	srcdir=$RELEASEDIR/usr/src
163	git clone -b $GITBRANCH $REPO $srcdir
164	echo "Triggering fetch scripts"
165	( cd $srcdir && sh ./gnu/dist/fetch.sh )
166	( cd $srcdir && sh ./external/gpl3/binutils/fetch.sh )
167	if [ "$REVTAG" ]
168	then	echo "Doing checkout of $REVTAG."
169		(cd $srcdir && git checkout $REVTAG )
170	else	REVTAG=`(cd $srcdir && git rev-parse --short HEAD)`
171		echo "Retrieved repository head in $srcdir is $REVTAG."
172	fi
173	if [ $MINIMAL -ne 0 ]
174	then	rm -r $srcdir/.git
175	fi
176	echo "
177/* Added by release script  */
178#ifndef _VCS_REVISION
179#define _VCS_REVISION \"$REVTAG\"
180#endif" >>$CONFIGHEADER
181	DATE=`date +%Y%m%d`
182	# output image name
183	IMG=${IMG_BASE}_${DATE}_${REVTAG}.iso
184else
185	echo "First cleaning current sourcedir.."
186	( cd .. && make cleandir >/dev/null )
187	echo "Copying contents from current src dir."
188	srcdir=/usr/$SRC
189	( cd $srcdir && tar --exclude .git -cf - .  ) | ( cd $RELEASEDIR/usr && mkdir $SRC && cd $SRC && tar xf - )
190	echo "Copying done."
191	REVTAG=copy
192	IMG=${IMG_BASE}_copy.iso
193fi
194
195# Make sure the CD knows it's a CD, unless it's not
196date >$RELEASEDIR/CD
197
198rm -f $RELEASEDIR/usr/$SRC/releasetools/revision
199
200for p in $PREINSTALLED_PACKAGES
201do	echo " * Pre-installing: $p from $PACKAGEURL"
202    $PKG_ADD -f -P $RELEASEDIR $PACKAGEURL/$p
203done
204
205if [ "$CUSTOM_PACKAGES" ]
206then	echo $PACKAGEURL >$RELEASEDIR/usr/pkg/etc/pkgin/repositories.conf
207fi
208
209echo " * Resetting timestamps"
210find $RELEASEDIR -print0 | xargs -n1000 -0 touch
211
212##########################################################################
213echo " * Build"
214##########################################################################
215
216cd $RELEASEDIR/usr/src
217make distribution MKLIBCXX=yes DESTDIR=$RELEASEDIR SLOPPY_FLIST=yes $BUILDOPTIONS
218make -C releasetools do-hdboot DESTDIR=$RELEASEDIR MKINSTALLBOOT=yes
219cp $RELEASEDIR/usr/mdec/boot_monitor $RELEASEDIR
220cp $RELEASEDIR/boot/minix_latest/* $RELEASEDIR/boot/minix_default/
221
222if [ $MAKEMAP -ne 0 ]; then
223        find . -type f -perm 755 | xargs nm -n 2> /dev/null > symbols.txt
224fi
225make cleandir
226
227cd -
228
229echo " * build done"
230
231##########################################################################
232echo " * Removing bootstrap files"
233##########################################################################
234# The build process leaves some file in $SRC as bin.
235chown -R root $RELEASEDIR/usr/src*
236cp issue.install $RELEASEDIR/etc/issue
237
238echo $version_pretty, GIT revision $REVTAG, generated `date` >$RELEASEDIR/etc/version
239rm -rf $RELEASEDIR/tmp/*
240
241if [ $MINIMAL -ne 0 ]
242then
243	if [ "$MAKEMAP" -ne 0 ]
244	then
245		echo " * Copying symbol map to ${IMG}-symbols.txt"
246		cp $RELEASEDIR/usr/src/symbols.txt ${IMG}-symbols.txt
247		$ZIP -f ${IMG}-symbols.txt
248	fi
249
250	echo " * Removing files to create minimal image"
251	rm -rf $RELEASEDIR/usr/man/man*/* 	\
252		$RELEASEDIR/usr/share/zoneinfo* $RELEASEDIR/usr/src
253	mkdir -p $RELEASEDIR/usr/src/releasetools
254fi
255
256if [ $EXTRAS_INSTALL -ne 0 ] ; then
257    echo " * Copying files from $EXTRAS_PATH"
258    cp -Rv $EXTRAS_PATH/* $RELEASEDIR
259fi
260
261echo " * Removing sources"
262
263rm -rf $RELEASEDIR/usr/src # No space for /usr/src
264rm -f $RELEASEDIR/SETS.* # No need for those.
265
266# If we are making a jail, all is done!
267if [ $JAILMODE = 1 ]
268then	echo "Created new minix install in $RELEASEDIR."
269	echo "Enter it by typing: "
270	echo "# chroot $RELEASEDIR /bin/sh"
271	exit 0
272fi
273
274##########################################################################
275echo " * Counting files"
276##########################################################################
277extrakb=`du -ks $RELEASEDIR/usr/install | awk '{ print $1 }'`
278find $RELEASEDIR/usr | fgrep -v /install/ | wc -l >$RELEASEDIR/.usrfiles
279find $RELEASEDIR -print -path $RELEASEDIR/usr -prune | wc -l >$RELEASEDIR/.rootfiles
280
281##########################################################################
282echo " * Mounting $TMPDISKROOT as $RELEASEMNTDIR"
283##########################################################################
284fitfs $RELEASEDIR $TMPDISKROOT 64 256 "$ROOTMB"
285ROOTBLOCKS=$blocks
286ROOTSECTS="`expr $blocks \* \( $BS / 512 \)`"
287mount $TMPDISKROOT $RELEASEMNTDIR || exit
288
289echo " * Mounting $TMPDISKUSR as $RELEASEMNTDIR/usr"
290fitfs $RELEASEDIR/usr $TMPDISKUSR 0 0 "$USRMB"
291USRBLOCKS=$blocks
292USRSECTS="`expr $blocks \* \( $BS / 512 \)`"
293mkdir -m 755 $RELEASEMNTDIR/usr
294mount $TMPDISKUSR $RELEASEMNTDIR/usr || exit
295
296##########################################################################
297echo " * Copying files from staging to image"
298##########################################################################
299synctree -f $RELEASEDIR $RELEASEMNTDIR > /dev/null || true
300expr `df -kP $TMPDISKUSR | tail -1 | awk '{ print $3 }'` - $extrakb >$RELEASEMNTDIR/.usrkb
301
302echo " * Unmounting $TMPDISKUSR from $RELEASEMNTDIR/usr"
303umount $TMPDISKUSR || exit
304
305echo " * Making image bootable"
306cd_root_changes
307
308echo " * Unmounting $TMPDISKROOT from $RELEASEMNTDIR"
309umount $TMPDISKROOT || exit
310rm -r $RELEASEMNTDIR
311
312##########################################################################
313echo " * Generating image files"
314##########################################################################
315dd if=$TMPDISKROOT of=$ROOTIMAGE bs=$BS count=$ROOTBLOCKS
316cp release/cd/* $CDFILES || true
317echo "This is Minix version $version_pretty prepared `date`." >$CDFILES/VERSION.TXT
318
319boottype=-n
320bootimage=$IMAGE
321
322cp $RELEASEDIR/usr/mdec/boot_monitor $CDFILES/boot
323cp -rf $RELEASEDIR/boot/minix_latest/* $CDFILES/
324gzip -d $CDFILES/*gz
325writeisofs -s0x0 -l MINIX -B $bootimage $boottype $CDFILES $IMG || exit 1
326
327echo "Appending Minix root and usr filesystem"
328# Pad ISO out to cylinder boundary
329isobytes=`stat -f %z $IMG`
330isosects=`expr $isobytes / 512`
331isopad=`expr $secs - '(' $isosects % $secs ')'`
332dd if=/dev/zero count=$isopad >>$IMG
333# number of sectors
334isosects=`expr $isosects + $isopad`
335( cat $IMG $ROOTIMAGE ;
336	dd if=$TMPDISKUSR bs=$BS count=$USRBLOCKS ) >m
337mv m $IMG
338# Make CD partition table
339installboot_nbsd -m $IMG /usr/mdec/mbr
340# Make sure there is no hole..! Otherwise the ISO format is
341# unreadable.
342partition -m $IMG 0 81:$isosects 81:$ROOTSECTS 81:$USRSECTS
343
344# Clean up: RELEASEDIR no longer needed
345rm -r $RELEASEDIR
346
347if [ "$FILENAMEOUT" ]
348then	echo "$IMG" >$FILENAMEOUT
349fi
350
351##########################################################################
352echo " * Freeing up memory used by ramdisks"
353##########################################################################
354ramdisk 1 $TMPDISKROOT
355ramdisk 1 $TMPDISKUSR
356