3 # generate-release.sh: check out source trees, and build release components with
4 # totally clean, fresh trees.
6 # Usage: generate-release.sh [-r revision] [-d docrevision] \
7 # [-p portsrevision] svn-branch scratch-dir
9 # Environment variables:
10 # SVNROOT: SVN URL to FreeBSD source repository (by default,
11 # svn://svn.freebsd.org/base)
12 # MAKE_FLAGS: optional flags to pass to make (e.g. -j)
13 # RELSTRING: optional base name for media images (e.g. FreeBSD-9.0-RC2-amd64)
15 # Note: Since this requires a chroot, release cross-builds will not work!
28 echo "Usage: $0 [-a arch] [-r revision] [-d docrevision] [-p portsrevision] svn-branch scratch-dir"
34 echo "Architecture ${OPTARG} cannot be built on host architecture ${HOST_ARCH}"
41 while getopts a:d:r:p: opt; do
46 if [ "${HOST_ARCH}" != "amd64" ]; then
47 arch_error "${OPTARG}"
51 if [ "${HOST_ARCH}" != "powerpc64" ]; then
52 arch_error "${OPTARG}"
56 arch_error "${OPTARG}"
62 DOCREVISION="-r $OPTARG"
68 PORTSREVISION="-r $OPTARG"
75 shift $(($OPTIND - 1))
77 # If target architecture is not specified, use hw.machine_arch
78 if [ "x${B_ARCH}" == "x" ]; then
81 ARCH_FLAGS="ARCH=${B_ARCH} TARGET_ARCH=${B_ARCH}"
87 if [ $(id -u) -ne 0 ]; then
88 echo "Needs to be run as root."
92 set -e # Everything must succeed
94 svn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src
95 svn co ${SVNROOT:-svn://svn.freebsd.org/doc}/head $2/usr/doc $DOCREVISION
96 svn co ${SVNROOT:-svn://svn.freebsd.org/ports}/head $2/usr/ports $PORTSREVISION
99 make $MAKE_FLAGS ${ARCH_FLAGS} buildworld
100 make $ARCH_FLAGS installworld distribution DESTDIR=$2
101 mount -t devfs devfs $2/dev
102 trap "umount $2/dev" EXIT # Clean up devfs mount on exit
104 # Most commands below are run in chroot, so fake getosreldate(3) right now
105 OSVERSION=$(grep '#define __FreeBSD_version' $2/usr/include/sys/param.h | awk '{print $3}')
107 BRANCH=$(grep '^BRANCH=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
108 BRANCH=`echo ${BRANCH} | sed -e 's,",,g'`
109 REVISION=$(grep '^REVISION=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
110 REVISION=`echo ${REVISION} | sed -e 's,",,g'`
111 OSRELEASE="${REVISION}-${BRANCH}"
113 pkgng_install_docports ()
115 # Attempt to install docproj port from pkgng package.
116 chroot ${CHROOTDIR} /bin/sh -c 'env ASSUME_ALWAYS_YES=1 /usr/sbin/pkg install -y docproj-nojadetex'
117 # Check if docproj was installed, since pkg(8) returns '0' if unable
118 # to install a package from the repository. If it is not installed,
119 # fallback to installing using pkg_add(1).
120 chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg info -q docproj-nojadetex' || \
121 pkgadd_install_docports
124 build_compat9_port ()
126 chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/misc/compat9x BATCH=yes install clean'
129 pkgadd_install_docports ()
131 # Attempt to install docproj package with pkg_add(1).
132 # If not successful, build the docproj port.
133 if [ "${REVISION}" == "10.0" ]; then
134 # Packages for 10-CURRENT are still located in the 9-CURRENT
135 # directory. Override environment to use correct package
136 # location if building for 10-CURRENT.
137 PACKAGESITE="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/Latest/"
139 PACKAGEROOT="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/"
141 PKG_PATH="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/All/"
145 chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg_add -r docproj-nojadetex' || \
151 # Could not install textproc/docproj from pkg(8) or pkg_add(1). Build
152 # the port as final fallback.
153 chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/textproc/docproj BATCH=yes WITH_JADETEX=no WITHOUT_X11=yes WITHOUT_PYTHON=yes install clean' || \
154 { echo "*** Could not build the textproj/docproj port. Exiting."; exit 2; }
157 if [ -d $2/usr/doc ]; then
158 cp /etc/resolv.conf $2/etc/resolv.conf
160 # Install docproj to build release documentation
163 pkgng_install_docports "${CHROOTDIR}"
167 chroot $2 make -C /usr/src $MAKE_FLAGS ${ARCH_FLAGS} buildworld buildkernel
168 chroot $2 make -C /usr/src/release ${ARCH_FLAGS} release
169 chroot $2 make -C /usr/src/release install DESTDIR=/R
171 if [ "x${OSVERSION}" == "x" ]; then
172 OSRELEASE=`chroot $2 uname -r`
175 : ${RELSTRING=`chroot $2 uname -s`-${OSRELEASE}-${B_ARCH}}
178 for i in release.iso bootonly.iso memstick; do
181 sha256 $RELSTRING-* > CHECKSUM.SHA256
182 md5 $RELSTRING-* > CHECKSUM.MD5