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