generate-release.sh revision 230107
1#!/bin/sh
2
3# generate-release.sh: check out source trees, and build release components with
4#  totally clean, fresh trees.
5#
6#  Usage: generate-release.sh [-r revision] svn-branch scratch-dir
7#
8# Environment variables:
9#  CVSUP_HOST: Host of a cvsup server to obtain the ports and documentation
10#   trees. This or CVSROOT must be set to include ports and documentation.
11#  CVSROOT:    CVS root to obtain the ports and documentation trees. This or
12#   CVSUP_HOST must be set to include ports and documentation.
13#  CVS_TAG:    CVS tag for ports and documentation (HEAD by default)
14#  SVNROOT:    SVN URL to FreeBSD source repository (by default, 
15#   svn://svn.freebsd.org/base)
16#  MAKE_FLAGS: optional flags to pass to make (e.g. -j)
17#  RELSTRING:  optional base name for media images (e.g. FreeBSD-9.0-RC2-amd64)
18# 
19#  Note: Since this requires a chroot, release cross-builds will not work!
20#
21# $FreeBSD: head/release/generate-release.sh 230107 2012-01-14 14:43:22Z glebius $
22#
23
24usage()
25{
26	echo "Usage: $0 [-r revision] svn-branch scratch-dir"
27	exit 1
28}
29
30args=`getopt r: $*`
31if [ $? -ne 0 ]; then
32	usage
33fi
34set -- $args
35REVISION=
36while true; do
37	case "$1" in
38	-r)
39		REVISION="-r $2"
40		shift; shift
41		;;
42	--)
43		shift; break
44		;;
45	esac
46done
47
48if [ $# -lt 2 ]; then
49	usage
50fi
51
52set -e # Everything must succeed
53
54case $MAKE_FLAGS in
55	*-j*)
56		;;
57	*)
58		MAKE_FLAGS="$MAKE_FLAGS -j "$(sysctl -n hw.ncpu)
59		;;
60esac
61
62mkdir -p $2/usr/src
63
64svn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src $REVISION
65if [ ! -z $CVSUP_HOST ]; then
66	cat > $2/docports-supfile << EOF
67	*default host=$CVSUP_HOST
68	*default base=/var/db
69	*default prefix=/usr
70	*default release=cvs tag=${CVS_TAG:-.}
71	*default delete use-rel-suffix
72	*default compress
73	ports-all
74	doc-all
75EOF
76elif [ ! -z $CVSROOT ]; then
77	cd $2/usr
78	cvs -R ${CVSARGS} -d ${CVSROOT} co -P -r ${CVS_TAG:-HEAD} ports
79	cvs -R ${CVSARGS} -d ${CVSROOT} co -P -r ${CVS_TAG:-HEAD} doc
80fi
81
82cd $2/usr/src
83make $MAKE_FLAGS buildworld
84make installworld distribution DESTDIR=$2
85mount -t devfs devfs $2/dev
86trap "umount $2/dev" EXIT # Clean up devfs mount on exit
87
88if [ ! -z $CVSUP_HOST ]; then 
89	cp /etc/resolv.conf $2/etc/resolv.conf
90
91	# Checkout ports and doc trees
92	chroot $2 /usr/bin/csup /docports-supfile
93fi
94
95if [ -d $2/usr/doc ]; then 
96	cp /etc/resolv.conf $2/etc/resolv.conf
97
98	# Build ports to build release documentation
99	chroot $2 /bin/sh -c 'pkg_add -r docproj || (cd /usr/ports/textproc/docproj && make install clean BATCH=yes WITHOUT_X11=yes JADETEX=no WITHOUT_PYTHON=yes)'
100fi
101
102chroot $2 make -C /usr/src $MAKE_FLAGS buildworld buildkernel
103chroot $2 make -C /usr/src/release release
104chroot $2 make -C /usr/src/release install DESTDIR=/R
105
106: ${RELSTRING=`chroot $2 uname -s`-`chroot $2 uname -r`-`chroot $2 uname -p`}
107
108cd $2/R
109for i in release.iso bootonly.iso memstick; do
110	mv $i $RELSTRING-$i
111done
112sha256 $RELSTRING-* > CHECKSUM.SHA256
113md5 $RELSTRING-* > CHECKSUM.MD5
114
115