tty: don't use custom kputc; this fixes tty printf()s.
[minix.git] / tools / release.sh
blob339e0baf2d183233cb6bd93b1823b303781aacea
1 #!/bin/sh
3 set -e
5 PATH=$PATH:/usr/local/bin
7 XBIN=usr/xbin
8 SRC=src
10 # size of /tmp during build
11 TMPKB=32000
13 PACKAGEDIR=/usr/bigports/Packages
14 PACKAGESOURCEDIR=/usr/bigports/Sources
15 # List of packages included on installation media
16 PACKAGELIST=packages.install
17 # List of package source included on installation media
18 PACKAGESOURCELIST=package_sources.install
19 secs=`expr 32 '*' 64`
20 export SHELL=/bin/sh
22 RELEASERC=$HOME/.releaserc
24 if [ -f $RELEASERC ]
25 then . $RELEASERC
28 set -- $* $RELOPTS
30 # SVN trunk repo
31 TRUNK=https://gforge.cs.vu.nl/svn/minix/trunk
33 make_hdimage()
35 dd if=$TMPDISK1 of=usrimage bs=$BS count=$USRBLOCKS
37 rootsize=`stat -size rootimage`
38 usrsize=`stat -size usrimage`
40 rootsects=`expr $rootsize / 512`
41 usrsects=`expr $usrsize / 512`
43 # installboot -m needs at least 1KB
44 dd < /dev/zero >tmpimage count=2
45 partition -fm tmpimage 2 81:$rootsects* 0:0 81:$usrsects
46 installboot -m tmpimage /usr/mdec/masterboot
47 dd < tmpimage > subpart count=1
49 primsects=`expr 1 + $rootsects + $usrsects`
50 cyl=`expr '(' $primsects ')' / $secs + 1`
51 padsects=`expr $cyl \* $secs - 1 - $primsects`
53 { dd < /dev/zero count=1
54 cat subpart
55 cat rootimage
56 cat usrimage
57 dd < /dev/zero count=$padsects
58 } > hdimage
59 partition -m hdimage 81:`expr $primsects + $padsects`*
60 installboot -m hdimage /usr/mdec/masterboot
63 retrieve()
65 dir=$1
66 list=`pwd`/$2
67 url=http://www.minix3.org/$3
68 BIGPORTS=bigports
70 cd $dir || exit 1
71 echo " * Updating $dir
72 from $url
73 with $list"
74 files=`awk <$list '{ print "'$url'/" $1 ".tar.bz2" }'`
75 wget -c $url/List $files || true
79 hdemu_root_changes()
81 $RELEASEDIR/usr/bin/installboot -d $TMPDISK3 \
82 $RELEASEDIR/usr/mdec/bootblock boot/boot
83 echo \
84 'bootcd=2
85 disable=inet
86 bios_wini=yes
87 bios_remap_first=1
88 ramimagedev=c0d7p0s0
89 bootbig(1, Regular MINIX 3) { image=/boot/image_big; boot }
90 main() { trap 10000 boot ; menu; }
91 save' | $RELEASEDIR/usr/bin/edparams $TMPDISK3
93 echo \
94 'root=/dev/c0d7p0s0
95 usr=/dev/c0d7p0s2
96 usr_roflag="-r"' > $RELEASEDIR/etc/fstab
99 usb_root_changes()
101 $RELEASEDIR/usr/bin/installboot -d $TMPDISK3 \
102 $RELEASEDIR/usr/mdec/bootblock boot/boot
103 echo \
104 'bios_wini=yes
105 bios_remap_first=1
106 rootdev=c0d7p0s0
107 save' | $RELEASEDIR/usr/bin/edparams $TMPDISK3
109 echo \
110 'root=/dev/c0d7p0s0
111 usr=/dev/c0d7p0s2
112 ' > $RELEASEDIR/etc/fstab
115 RELEASEDIR=/usr/r
116 RELEASEPACKAGE=${RELEASEDIR}/usr/install/packages
117 RELEASEPACKAGESOURCES=${RELEASEDIR}/usr/install/package-sources
118 IMAGE=../boot/cdbootblock
119 ROOTIMAGE=rootimage
120 CDFILES=/usr/tmp/cdreleasefiles
121 sh tell_config OS_RELEASE . OS_VERSION >/tmp/rel.$$
122 version_pretty=`sed 's/[" ]//g;/^$/d' </tmp/rel.$$`
123 version=`sed 's/[" ]//g;/^$/d' </tmp/rel.$$ | tr . _`
124 IMG_BASE=minix${version}_ide
125 BS=4096
127 HDEMU=0
128 COPY=0
129 SVNREV=""
130 REVTAG=""
131 PACKAGES=1
133 FILENAMEOUT=""
135 while getopts "s:pchu?r:f:" c
137 case "$c" in
139 echo "Usage: $0 [-p] [-c] [-h] [-r <tag>] [-u] [-f <filename>] [-s <username>]" >&2
140 exit 1
143 echo " * Making HD image"
144 IMG_BASE=minix${version}_bios
145 HDEMU=1
148 echo " * Copying, not SVN"
149 COPY=1
152 PACKAGES=0
155 SVNREV=-r$OPTARG
158 echo " * Making live USB-stick image"
159 IMG_BASE=minix${version}_usb
160 HDEMU=1
161 USB=1
164 FILENAMEOUT="$OPTARG"
166 s) USERNAME="--username=$OPTARG"
168 esac
169 done
171 if [ ! "$USRMB" ]
172 then USRMB=600
175 if [ $PACKAGES -ne 0 ]
176 then mkdir -p $PACKAGEDIR || true
177 mkdir -p $PACKAGESOURCEDIR || true
178 rm -f $PACKAGEDIR/List
179 retrieve $PACKAGEDIR $PACKAGELIST packages/`uname -p`/`uname -r`.`uname -v`
180 retrieve $PACKAGESOURCEDIR $PACKAGESOURCELIST software
183 echo $USRMB MB
185 USRKB=$(($USRMB*1024))
186 USRBLOCKS=$(($USRMB * 1024 * 1024 / $BS))
187 USRSECTS=$(($USRMB * 1024 * 2))
188 ROOTKB=8192
189 ROOTSECTS=$(($ROOTKB * 2))
190 ROOTBLOCKS=$(($ROOTKB * 1024 / $BS))
192 if [ "$COPY" -ne 1 ]
193 then
194 echo "Note: this script wants to do svn operations."
197 TMPDISK1=/dev/ram0
198 TMPDISK2=/dev/ram1
199 TMPDISK3=/dev/ram2
201 if [ ! -b $TMPDISK1 -o ! -b $TMPDISK2 -o ! $TMPDISK3 ]
202 then echo "$TMPDISK1, $TMPDISK2 or $TMPDISK3 is not a block device.."
203 exit 1
206 umount $TMPDISK1 || true
207 umount $TMPDISK2 || true
208 umount $TMPDISK3 || true
210 ramdisk $USRKB $TMPDISK1
211 ramdisk $TMPKB $TMPDISK2
212 ramdisk $ROOTKB $TMPDISK3
214 if [ $TMPDISK1 = $TMPDISK2 -o $TMPDISK1 = $TMPDISK3 -o $TMPDISK2 = $TMPDISK3 ]
215 then
216 echo "Temporary devices can't be equal."
217 exit
220 echo " * Cleanup old files"
221 rm -rf $RELEASEDIR $IMG $ROOTIMAGE $CDFILES image*
222 mkdir -p $CDFILES || exit
223 mkdir -p $RELEASEDIR
224 mkfs -i 2000 -B $BS -b $ROOTBLOCKS $TMPDISK3 || exit
225 mkfs -B 1024 -b $TMPKB $TMPDISK2 || exit
226 echo " * mounting $TMPDISK3 as $RELEASEDIR"
227 mount $TMPDISK3 $RELEASEDIR || exit
228 mkdir -m 755 $RELEASEDIR/usr
229 mkdir -m 1777 $RELEASEDIR/tmp
230 mount $TMPDISK2 $RELEASEDIR/tmp
232 mkfs -B $BS -i 30000 -b $USRBLOCKS $TMPDISK1 || exit
233 echo " * Mounting $TMPDISK1 as $RELEASEDIR/usr"
234 mount $TMPDISK1 $RELEASEDIR/usr || exit
235 mkdir -p $RELEASEDIR/tmp
236 mkdir -p $RELEASEDIR/usr/tmp
237 mkdir -p $RELEASEDIR/$XBIN
238 mkdir -p $RELEASEDIR/usr/bin
239 mkdir -p $RELEASEDIR/bin
240 mkdir -p $RELEASEPACKAGE
241 mkdir -p $RELEASEPACKAGESOURCES
243 echo " * Transfering bootstrap dirs to $RELEASEDIR"
244 cp -p /bin/* /usr/bin/* $RELEASEDIR/$XBIN
245 cp -rp /usr/lib $RELEASEDIR/usr
246 cp -rp /bin/bigsh /bin/sh /bin/echo $RELEASEDIR/bin
247 cp -rp /usr/bin/make /usr/bin/install /usr/bin/yacc /usr/bin/flex /usr/bin/asmconv $RELEASEDIR/usr/bin
249 if [ -d $PACKAGEDIR -a -d $PACKAGESOURCEDIR -a -f $PACKAGELIST -a -f $PACKAGESOURCELIST -a $PACKAGES -ne 0 ]
250 then echo " * Transfering $PACKAGEDIR to $RELEASEPACKAGE"
251 : >$RELEASEPACKAGE/List
252 for p in `cat $PACKAGELIST`
253 do if [ -f $PACKAGEDIR/$p.tar.bz2 ]
254 then
255 cp $PACKAGEDIR/$p.tar.bz2 $RELEASEPACKAGE/
256 grep "^$p|" $PACKAGEDIR/List >>$RELEASEPACKAGE/List || echo "$p not found in List"
257 else
258 echo "Can't copy $PACKAGEDIR/$p.tar.bz2. Missing."
260 done
262 echo " * Transfering $PACKAGESOURCEDIR to $RELEASEPACKAGESOURCES"
263 for p in `cat $PACKAGESOURCELIST`
265 if [ -f $PACKAGESOURCEDIR/$p.tar.bz2 ]
266 then
267 cp $PACKAGESOURCEDIR/$p.tar.bz2 $RELEASEPACKAGESOURCES/
268 else
269 echo "Can't copy $PACKAGESOURCEDIR/$p.tar.bz2. Missing."
271 done
274 # Make sure compilers and libraries are bin-owned
275 chown -R bin $RELEASEDIR/usr/lib
276 chmod -R u+w $RELEASEDIR/usr/lib
278 if [ "$COPY" -ne 1 ]
279 then
280 echo " * Doing new svn export"
281 TOOLSREPO="`svn info | grep '^URL: ' | awk '{ print $2 }'`"
282 REPO="`echo $TOOLSREPO | sed 's/.tools$//'`"
283 BRANCHNAME="`echo $REPO | awk -F/ '{ print $NF }'`"
284 REVISION="`svn info $USERNAME $SVNREV $REPO | grep '^Revision: ' | awk '{ print $2 }'`"
285 echo "Doing export of revision $REVISION from $REPO."
286 ( cd $RELEASEDIR/usr && svn -q $USERNAME export -r$REVISION $REPO $SRC )
287 if [ $BRANCHNAME = src ]
288 then REVTAG=r$REVISION
289 else REVTAG=branch-$BRANCHNAME-r$REVISION
292 echo "
294 /* Added by release script */
295 #ifndef _SVN_REVISION
296 #define _SVN_REVISION \"$REVTAG\"
297 #endif" >>$RELEASEDIR/usr/src/include/minix/sys_config.h
299 # output image name
300 if [ "$USB" -ne 0 ]; then
301 IMG=${IMG_BASE}_${REVTAG}.img
302 else
303 IMG=${IMG_BASE}_${REVTAG}.iso
306 else
307 ( cd .. && make depend && make clean )
308 srcdir=/usr/$SRC
309 ( cd $srcdir && tar cf - . ) | ( cd $RELEASEDIR/usr && mkdir $SRC && cd $SRC && tar xf - )
310 REVTAG=copy
311 REVISION=unknown
312 IMG=${IMG_BASE}_copy.iso
315 echo " * Fixups for owners and modes of dirs and files"
316 chown -R bin $RELEASEDIR/usr/$SRC
317 chmod -R u+w $RELEASEDIR/usr/$SRC
318 find $RELEASEDIR/usr/$SRC -type d | xargs chmod 755
319 find $RELEASEDIR/usr/$SRC -type f | xargs chmod 644
320 find $RELEASEDIR/usr/$SRC -name configure | xargs chmod 755
321 find $RELEASEDIR/usr/$SRC/commands -name build | xargs chmod 755
322 # Bug tracking system not for on cd
323 rm -rf $RELEASEDIR/usr/$SRC/doc/bugs
325 # Make sure the CD knows it's a CD, unless it's not
326 if [ "$USB" -eq 0 ]
327 then date >$RELEASEDIR/CD
329 echo " * Bootstrap /etc/mk files"
330 # Need /etc/mk in the new system to invoke make. Real ownerships
331 # and permissions will be set by its own src/etc/Makefile.
332 # They have to be owned by bin so that the new make can do its work.
333 mkdir -p $RELEASEDIR/etc/mk
334 chmod 755 $RELEASEDIR/etc/mk
335 cp $RELEASEDIR/usr/src/etc/mk/* $RELEASEDIR/etc/mk/
336 chown -R bin $RELEASEDIR/etc/mk
337 echo " * Chroot build"
338 cp chrootmake.sh $RELEASEDIR/usr/$SRC/tools/chrootmake.sh
339 chroot $RELEASEDIR "PATH=/$XBIN sh -x /usr/$SRC/tools/chrootmake.sh" || exit 1
340 # Copy built images for cd booting
341 cp $RELEASEDIR/boot/image_big image
342 echo " * Chroot build done"
343 echo " * Removing bootstrap files"
344 rm -rf $RELEASEDIR/$XBIN
345 # The build process leaves some file in $SRC as root.
346 chown -R bin $RELEASEDIR/usr/src*
347 cp issue.install $RELEASEDIR/etc/issue
349 if [ "$USB" -ne 0 ]
350 then
351 usb_root_changes
352 elif [ "$HDEMU" -ne 0 ]
353 then
354 hdemu_root_changes
357 echo $version_pretty, SVN revision $REVISION, generated `date` >$RELEASEDIR/etc/version
358 echo " * Counting files"
359 extrakb=`du -s $RELEASEDIR/usr/install | awk '{ print $1 }'`
360 expr `df $TMPDISK1 | tail -1 | awk '{ print $4 }'` - $extrakb >$RELEASEDIR/.usrkb
361 find $RELEASEDIR/usr | fgrep -v /install/ | wc -l >$RELEASEDIR/.usrfiles
362 find $RELEASEDIR -xdev | wc -l >$RELEASEDIR/.rootfiles
363 echo " * Zeroing remainder of temporary areas"
364 df $TMPDISK1
365 df $TMPDISK3
366 cp /dev/zero $RELEASEDIR/usr/.x 2>/dev/null || true
367 rm $RELEASEDIR/usr/.x
368 cp /dev/zero $RELEASEDIR/.x 2>/dev/null || true
369 rm $RELEASEDIR/.x
371 umount $TMPDISK1 || exit
372 umount $TMPDISK2 || exit
373 umount $TMPDISK3 || exit
375 # Boot monitor variables for boot CD
376 edparams $TMPDISK3 'unset bootopts;
377 unset servers;
378 unset rootdev;
379 unset leader;
380 unset image;
381 disable=inet;
382 bootcd=1;
383 cdproberoot=1;
384 ata_id_timeout=2;
385 bootbig(1, Regular MINIX 3) { unset image; boot }
386 leader() { echo \n--- Welcome to MINIX 3. This is the boot monitor. ---\n\nChoose an option from the menu or press ESC if you need to do anything special.\nOtherwise I will boot with my defaults in 10 seconds.\n\n }; main(){trap 10000 boot; menu; };
387 save'
389 (cd ../boot && make)
390 dd if=$TMPDISK3 of=$ROOTIMAGE bs=$BS count=$ROOTBLOCKS
391 cp release/cd/* $CDFILES || true
392 echo "This is Minix version $version_pretty prepared `date`." >$CDFILES/VERSION.TXT
394 boottype=-n
395 bootimage=$IMAGE
396 if [ "$HDEMU" -ne 0 ]; then
397 make_hdimage
398 boottype='-h'
399 bootimage=hdimage
402 if [ "$USB" -ne 0 ]; then
403 mv $bootimage $IMG
404 else
405 cp ../boot/boot $CDFILES
406 writeisofs -s0x0 -l MINIX -a boot -b $bootimage $boottype $CDFILES $IMG || exit 1
408 if [ "$HDEMU" -eq 0 ]
409 then
410 echo "Appending Minix root and usr filesystem"
411 # Pad ISO out to cylinder boundary
412 isobytes=`stat -size $IMG`
413 isosects=`expr $isobytes / 512`
414 isopad=`expr $secs - '(' $isosects % $secs ')'`
415 dd if=/dev/zero count=$isopad >>$IMG
416 # number of sectors
417 isosects=`expr $isosects + $isopad`
418 ( cat $IMG $ROOTIMAGE ;
419 dd if=$TMPDISK1 bs=$BS count=$USRBLOCKS ) >m
420 mv m $IMG
421 # Make CD partition table
422 installboot -m $IMG /usr/mdec/masterboot
423 # Make sure there is no hole..! Otherwise the ISO format is
424 # unreadable.
425 partition -m $IMG 0 81:$isosects 81:$ROOTSECTS 81:$USRSECTS
426 echo "gzipping $IMG"
427 gzip $IMG
431 if [ "$FILENAMEOUT" ]
432 then echo "$IMG" >$FILENAMEOUT