generate-release.sh revision 246283
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 svn-branch[@revision] scratch-dir
7#
8# Environment variables:
9#  SVNROOTBASE: SVN base URL to FreeBSD repository (svn://svn.freebsd.org)
10#  SVNROOTSRC:  URL to FreeBSD src tree (${SVNROOTBASE}/base)
11#  SVNROOTDOC:  URL to FreeBSD doc tree (${SVNROOTBASE}/doc)
12#  SVNROOTPORTS:URL to FreeBSD ports tree (${SVNROOTBASE}/ports)
13#  BRANCHSRC:   branch name of src (svn-branch[@revision])
14#  BRANCHDOC:   branch name of doc (head)
15#  BRANCHPORTS: branch name of ports (head)
16#  WORLD_FLAGS: optional flags to pass to buildworld (e.g. -j)
17#  KERNEL_FLAGS: optional flags to pass to buildkernel (e.g. -j)
18#
19# $FreeBSD: head/release/generate-release.sh 246283 2013-02-03 10:26:24Z hrs $
20#
21
22usage()
23{
24	echo "Usage: $0 svn-branch[@revision] scratch-dir" 2>&1
25	exit 1
26}
27
28if [ $# -lt 2 ]; then
29	usage
30fi
31
32: ${SVNROOTBASE:=svn://svn.freebsd.org}
33: ${SVNROOTSRC:=${SVNROOTBASE}/base}
34: ${SVNROOTDOC:=${SVNROOTBASE}/doc}
35: ${SVNROOTPORTS:=${SVNROOTBASE}/ports}
36: ${SVNROOT:=${SVNROOTSRC}} # for backward compatibility
37: ${SVN_CMD:=/usr/local/bin/svn}
38BRANCHSRC=$1
39: ${BRANCHDOC:=head}
40: ${BRANCHPORTS:=head}
41: ${WORLD_FLAGS:=${MAKE_FLAGS}}
42: ${KERNEL_FLAGS:=${MAKE_FLAGS}}
43: ${CHROOTDIR:=$2}
44 
45if [ ! -r "${CHROOTDIR}" ]; then
46	echo "${CHROOTDIR}: scratch dir not found."
47	exit 1
48fi
49
50CHROOT_CMD="/usr/sbin/chroot ${CHROOTDIR}"
51case ${TARGET} in
52"")	;;
53*)	SETENV_TARGET="TARGET=$TARGET" ;;
54esac
55case ${TARGET_ARCH} in
56"")	;;
57*)	SETENV_TARGET_ARCH="TARGET_ARCH=$TARGET_ARCH" ;;
58esac
59SETENV="env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin"
60CROSSENV="${SETENV_TARGET} ${SETENV_TARGET_ARCH}"
61WMAKE="make -C /usr/src ${WORLD_FLAGS}"
62NWMAKE="${WMAKE} __MAKE_CONF=/dev/null SRCCONF=/dev/null"
63KMAKE="make -C /usr/src ${KERNEL_FLAGS}"
64RMAKE="make -C /usr/src/release"
65
66if [ $(id -u) -ne 0 ]; then
67	echo "Needs to be run as root."
68	exit 1
69fi
70
71set -e # Everything must succeed
72
73mkdir -p ${CHROOTDIR}/usr/src
74${SVN_CMD} co ${SVNROOT}/${BRANCHSRC} ${CHROOTDIR}/usr/src
75${SVN_CMD} co ${SVNROOTDOC}/${BRANCHDOC} ${CHROOTDIR}/usr/doc
76${SVN_CMD} co ${SVNROOTPORTS}/${BRANCHPORTS} ${CHROOTDIR}/usr/ports
77
78${SETENV} ${NWMAKE} -C ${CHROOTDIR}/usr/src ${WORLD_FLAGS} buildworld
79${SETENV} ${NWMAKE} -C ${CHROOTDIR}/usr/src installworld distribution DESTDIR=${CHROOTDIR}
80mount -t devfs devfs ${CHROOTDIR}/dev
81trap "umount ${CHROOTDIR}/dev" EXIT # Clean up devfs mount on exit
82
83if [ -d ${CHROOTDIR}/usr/doc ]; then 
84	cp /etc/resolv.conf ${CHROOTDIR}/etc/resolv.conf
85
86	# Install docproj to build release documentation
87	${CHROOT_CMD} /bin/sh -c \
88		'make -C /usr/ports/textproc/docproj \
89			BATCH=yes \
90			WITHOUT_SVN=yes \
91			WITHOUT_JADETEX=yes \
92			WITHOUT_X11=yes \
93			WITHOUT_PYTHON=yes \
94			install'
95fi
96
97${CHROOT_CMD} ${SETENV} ${CROSSENV} ${WMAKE} buildworld
98${CHROOT_CMD} ${SETENV} ${CROSSENV} ${KMAKE} buildkernel
99${CHROOT_CMD} ${SETENV} ${CROSSENV} ${RMAKE} release
100${CHROOT_CMD} ${SETENV} ${CROSSENV} ${RMAKE} install DESTDIR=/R
101