generate-release.sh revision 240967
1219508Snwhitehorn#!/bin/sh
2219508Snwhitehorn
3219508Snwhitehorn# generate-release.sh: check out source trees, and build release components with
4219610Snwhitehorn#  totally clean, fresh trees.
5219508Snwhitehorn#
6240587Sgjb#  Usage: generate-release.sh [-r revision] [-d docrevision] \
7240587Sgjb#	[-p portsrevision] svn-branch scratch-dir
8219508Snwhitehorn#
9219508Snwhitehorn# Environment variables:
10219788Snwhitehorn#  SVNROOT:    SVN URL to FreeBSD source repository (by default, 
11219788Snwhitehorn#   svn://svn.freebsd.org/base)
12219508Snwhitehorn#  MAKE_FLAGS: optional flags to pass to make (e.g. -j)
13227536Snwhitehorn#  RELSTRING:  optional base name for media images (e.g. FreeBSD-9.0-RC2-amd64)
14219508Snwhitehorn# 
15219508Snwhitehorn#  Note: Since this requires a chroot, release cross-builds will not work!
16219508Snwhitehorn#
17219508Snwhitehorn# $FreeBSD: head/release/generate-release.sh 240967 2012-09-26 18:04:16Z gjb $
18219508Snwhitehorn#
19219508Snwhitehorn
20240967Sgjbunset B_ARCH
21240967Sgjbunset ARCH
22240967Sgjbunset MACHINE_ARCH
23240967Sgjb
24240967SgjbHOST_ARCH=`uname -p`
25240967Sgjb
26230106Sglebiususage()
27230106Sglebius{
28240967Sgjb	echo "Usage: $0 [-a arch] [-r revision] [-d docrevision] [-p portsrevision] svn-branch scratch-dir"
29230106Sglebius	exit 1
30230106Sglebius}
31230106Sglebius
32240967Sgjbarch_error ()
33240967Sgjb{
34240967Sgjb	echo "Architecture ${OPTARG} cannot be built on host architecture ${HOST_ARCH}"
35240967Sgjb	exit 1
36240967Sgjb}
37240967Sgjb
38230106SglebiusREVISION=
39240586SgjbDOCREVISION=
40240586SgjbPORTSREVISION=
41240967Sgjbwhile getopts a:d:r:p: opt; do
42230128Sglebius	case $opt in
43240967Sgjb	a)
44240967Sgjb		case "${OPTARG}" in
45240967Sgjb			i386|amd64)
46240967Sgjb				if [ "${HOST_ARCH}" != "amd64" ]; then
47240967Sgjb					arch_error "${OPTARG}"
48240967Sgjb				fi
49240967Sgjb				;;
50240967Sgjb			powerpc|powerpc64)
51240967Sgjb				if [ "${HOST_ARCH}" != "powerpc64" ]; then
52240967Sgjb					arch_error "${OPTARG}"
53240967Sgjb				fi
54240967Sgjb				;;
55240967Sgjb			*)
56240967Sgjb				arch_error "${OPTARG}"
57240967Sgjb				;;
58240967Sgjb		esac
59240967Sgjb		B_ARCH="$OPTARG"
60240967Sgjb		;;
61240586Sgjb	d)
62240586Sgjb		DOCREVISION="-r $OPTARG"
63240586Sgjb		;;
64230128Sglebius	r)
65230128Sglebius		REVISION="-r $OPTARG"
66230106Sglebius		;;
67240586Sgjb	p)
68240586Sgjb		PORTSREVISION="-r $OPTARG"
69240586Sgjb		;;
70230128Sglebius	\?)
71230128Sglebius		usage
72230106Sglebius		;;
73230106Sglebius	esac
74230106Sglebiusdone
75230128Sglebiusshift $(($OPTIND - 1))
76230106Sglebius
77240967Sgjb# If target architecture is not specified, use hw.machine_arch
78240967Sgjbif [ "x${B_ARCH}" == "x" ]; then
79240967Sgjb	B_ARCH="${HOST_ARCH}"
80240967Sgjbfi
81240967SgjbARCH_FLAGS="ARCH=${B_ARCH} TARGET_ARCH=${B_ARCH}"
82240967Sgjb
83230106Sglebiusif [ $# -lt 2 ]; then
84230106Sglebius	usage
85230106Sglebiusfi
86230106Sglebius
87240967Sgjbif [ $(id -u) -ne 0 ]; then
88240967Sgjb	echo "Needs to be run as root."
89240967Sgjb	exit 1
90240967Sgjbfi
91240967Sgjb
92221510Snwhitehornset -e # Everything must succeed
93221510Snwhitehorn
94230107Sglebiuscase $MAKE_FLAGS in
95230107Sglebius	*-j*)
96230107Sglebius		;;
97230107Sglebius	*)
98230107Sglebius		MAKE_FLAGS="$MAKE_FLAGS -j "$(sysctl -n hw.ncpu)
99230107Sglebius		;;
100230107Sglebiusesac
101230107Sglebius
102230107Sglebiusmkdir -p $2/usr/src
103230107Sglebius
104230106Sglebiussvn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src $REVISION
105240586Sgjbsvn co ${SVNROOT:-svn://svn.freebsd.org/doc}/head $2/usr/doc $DOCREVISION
106240586Sgjbsvn co ${SVNROOT:-svn://svn.freebsd.org/ports}/head $2/usr/ports $PORTSREVISION
107219508Snwhitehorn
108219508Snwhitehorncd $2/usr/src
109240967Sgjbmake $MAKE_FLAGS ${ARCH_FLAGS} buildworld
110240967Sgjbmake $ARCH_FLAGS installworld distribution DESTDIR=$2
111219508Snwhitehornmount -t devfs devfs $2/dev
112221510Snwhitehorntrap "umount $2/dev" EXIT # Clean up devfs mount on exit
113219508Snwhitehorn
114240967Sgjb# Most commands below are run in chroot, so fake getosreldate(3) right now
115240967SgjbOSVERSION=$(grep '#define __FreeBSD_version' $2/usr/include/sys/param.h | awk '{print $3}')
116240967Sgjbexport OSVERSION
117240967SgjbBRANCH=$(grep '^BRANCH=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
118240967SgjbBRANCH=`echo ${BRANCH} | sed -e 's,",,g'`
119240967SgjbREVISION=$(grep '^REVISION=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
120240967SgjbREVISION=`echo ${REVISION} | sed -e 's,",,g'`
121240967SgjbOSRELEASE="${REVISION}-${BRANCH}"
122240967Sgjb
123240967Sgjbpkgng_install_docports ()
124240967Sgjb{
125240967Sgjb	# Attempt to install docproj port from pkgng package.
126240967Sgjb	chroot ${CHROOTDIR} /bin/sh -c 'env ASSUME_ALWAYS_YES=1 /usr/sbin/pkg install -y docproj-nojadetex'
127240967Sgjb	# Check if docproj was installed, since pkg(8) returns '0' if unable
128240967Sgjb	# to install a package from the repository.  If it is not installed,
129240967Sgjb	# fallback to installing using pkg_add(1).
130240967Sgjb	chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg info -q docproj-nojadetex' || \
131240967Sgjb		pkgadd_install_docports
132240967Sgjb}
133240967Sgjb
134240967Sgjbbuild_compat9_port ()
135240967Sgjb{
136240967Sgjb	chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/misc/compat9x BATCH=yes install clean'
137240967Sgjb}
138240967Sgjb
139240967Sgjbpkgadd_install_docports ()
140240967Sgjb{
141240967Sgjb	# Attempt to install docproj package with pkg_add(1).
142240967Sgjb	# If not successful, build the docproj port.
143240967Sgjb	if [ "${REVISION}" == "10.0" ]; then
144240967Sgjb		# Packages for 10-CURRENT are still located in the 9-CURRENT
145240967Sgjb		# directory.  Override environment to use correct package
146240967Sgjb		# location if building for 10-CURRENT.
147240967Sgjb		PACKAGESITE="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/Latest/"
148240967Sgjb		export PACKAGESITE
149240967Sgjb		PACKAGEROOT="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/"
150240967Sgjb		export PACKAGEROOT
151240967Sgjb		PKG_PATH="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/All/"
152240967Sgjb		export PKG_PATH
153240967Sgjb		build_compat9_port
154240967Sgjb	fi
155240967Sgjb	chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg_add -r docproj-nojadetex' || \
156240967Sgjb		build_docports
157240967Sgjb}
158240967Sgjb
159240967Sgjbbuild_docports() 
160240967Sgjb{
161240967Sgjb	# Could not install textproc/docproj from pkg(8) or pkg_add(1).  Build
162240967Sgjb	# the port as final fallback.
163240967Sgjb	chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/textproc/docproj BATCH=yes WITH_JADETEX=no WITHOUT_X11=yes WITHOUT_PYTHON=yes install clean' || \
164240967Sgjb		{ echo "*** Could not build the textproj/docproj port.  Exiting."; exit 2; }
165240967Sgjb}
166240967Sgjb
167219788Snwhitehornif [ -d $2/usr/doc ]; then 
168219788Snwhitehorn	cp /etc/resolv.conf $2/etc/resolv.conf
169219788Snwhitehorn
170240586Sgjb	# Install docproj to build release documentation
171240967Sgjb	CHROOTDIR="$2"
172240967Sgjb	set +e
173240967Sgjb	pkgng_install_docports "${CHROOTDIR}"
174240967Sgjb	set -e
175219508Snwhitehornfi
176219610Snwhitehorn
177240967Sgjbchroot $2 make -C /usr/src $MAKE_FLAGS ${ARCH_FLAGS} buildworld buildkernel
178240967Sgjbchroot $2 make -C /usr/src/release ${ARCH_FLAGS} release
179221510Snwhitehornchroot $2 make -C /usr/src/release install DESTDIR=/R
180219508Snwhitehorn
181240967Sgjbif [ "x${OSVERSION}" == "x" ]; then
182240967Sgjb	OSRELEASE=`chroot $2 uname -r`
183240967Sgjbfi
184227536Snwhitehorn
185240967Sgjb: ${RELSTRING=`chroot $2 uname -s`-${OSRELEASE}-${B_ARCH}}
186240967Sgjb
187227536Snwhitehorncd $2/R
188227536Snwhitehornfor i in release.iso bootonly.iso memstick; do
189227536Snwhitehorn	mv $i $RELSTRING-$i
190227536Snwhitehorndone
191227536Snwhitehornsha256 $RELSTRING-* > CHECKSUM.SHA256
192227536Snwhitehornmd5 $RELSTRING-* > CHECKSUM.MD5
193227536Snwhitehorn
194