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] [-d docrevision] \ 7# [-p portsrevision] svn-branch scratch-dir 8# 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) 14# 15# Note: Since this requires a chroot, release cross-builds will not work! 16#
| 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] [-d docrevision] \ 7# [-p portsrevision] svn-branch scratch-dir 8# 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) 14# 15# Note: Since this requires a chroot, release cross-builds will not work! 16#
|
17# $FreeBSD: head/release/generate-release.sh 240587 2012-09-17 02:35:00Z gjb $
| 17# $FreeBSD: head/release/generate-release.sh 240967 2012-09-26 18:04:16Z gjb $
|
18# 19
| 18# 19
|
| 20unset B_ARCH 21unset ARCH 22unset MACHINE_ARCH 23 24HOST_ARCH=`uname -p` 25
|
20usage() 21{
| 26usage() 27{
|
22 echo "Usage: $0 [-r revision] [-d docrevision] [-p portsrevision] svn-branch scratch-dir"
| 28 echo "Usage: $0 [-a arch] [-r revision] [-d docrevision] [-p portsrevision] svn-branch scratch-dir"
|
23 exit 1 24} 25
| 29 exit 1 30} 31
|
| 32arch_error () 33{ 34 echo "Architecture ${OPTARG} cannot be built on host architecture ${HOST_ARCH}" 35 exit 1 36} 37
|
26REVISION= 27DOCREVISION= 28PORTSREVISION=
| 38REVISION= 39DOCREVISION= 40PORTSREVISION=
|
29while getopts d:r:p: opt; do
| 41while getopts a:d:r:p: opt; do
|
30 case $opt in
| 42 case $opt in
|
| 43 a) 44 case "${OPTARG}" in 45 i386|amd64) 46 if [ "${HOST_ARCH}" != "amd64" ]; then 47 arch_error "${OPTARG}" 48 fi 49 ;; 50 powerpc|powerpc64) 51 if [ "${HOST_ARCH}" != "powerpc64" ]; then 52 arch_error "${OPTARG}" 53 fi 54 ;; 55 *) 56 arch_error "${OPTARG}" 57 ;; 58 esac 59 B_ARCH="$OPTARG" 60 ;;
|
31 d) 32 DOCREVISION="-r $OPTARG" 33 ;; 34 r) 35 REVISION="-r $OPTARG" 36 ;; 37 p) 38 PORTSREVISION="-r $OPTARG" 39 ;; 40 \?) 41 usage 42 ;; 43 esac 44done 45shift $(($OPTIND - 1)) 46
| 61 d) 62 DOCREVISION="-r $OPTARG" 63 ;; 64 r) 65 REVISION="-r $OPTARG" 66 ;; 67 p) 68 PORTSREVISION="-r $OPTARG" 69 ;; 70 \?) 71 usage 72 ;; 73 esac 74done 75shift $(($OPTIND - 1)) 76
|
| 77# If target architecture is not specified, use hw.machine_arch 78if [ "x${B_ARCH}" == "x" ]; then 79 B_ARCH="${HOST_ARCH}" 80fi 81ARCH_FLAGS="ARCH=${B_ARCH} TARGET_ARCH=${B_ARCH}" 82
|
47if [ $# -lt 2 ]; then 48 usage 49fi 50
| 83if [ $# -lt 2 ]; then 84 usage 85fi 86
|
| 87if [ $(id -u) -ne 0 ]; then 88 echo "Needs to be run as root." 89 exit 1 90fi 91
|
51set -e # Everything must succeed 52 53case $MAKE_FLAGS in 54 *-j*) 55 ;; 56 *) 57 MAKE_FLAGS="$MAKE_FLAGS -j "$(sysctl -n hw.ncpu) 58 ;; 59esac 60 61mkdir -p $2/usr/src 62 63svn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src $REVISION 64svn co ${SVNROOT:-svn://svn.freebsd.org/doc}/head $2/usr/doc $DOCREVISION 65svn co ${SVNROOT:-svn://svn.freebsd.org/ports}/head $2/usr/ports $PORTSREVISION 66 67cd $2/usr/src
| 92set -e # Everything must succeed 93 94case $MAKE_FLAGS in 95 *-j*) 96 ;; 97 *) 98 MAKE_FLAGS="$MAKE_FLAGS -j "$(sysctl -n hw.ncpu) 99 ;; 100esac 101 102mkdir -p $2/usr/src 103 104svn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src $REVISION 105svn co ${SVNROOT:-svn://svn.freebsd.org/doc}/head $2/usr/doc $DOCREVISION 106svn co ${SVNROOT:-svn://svn.freebsd.org/ports}/head $2/usr/ports $PORTSREVISION 107 108cd $2/usr/src
|
68make $MAKE_FLAGS buildworld 69make installworld distribution DESTDIR=$2
| 109make $MAKE_FLAGS ${ARCH_FLAGS} buildworld 110make $ARCH_FLAGS installworld distribution DESTDIR=$2
|
70mount -t devfs devfs $2/dev 71trap "umount $2/dev" EXIT # Clean up devfs mount on exit 72
| 111mount -t devfs devfs $2/dev 112trap "umount $2/dev" EXIT # Clean up devfs mount on exit 113
|
| 114# Most commands below are run in chroot, so fake getosreldate(3) right now 115OSVERSION=$(grep '#define __FreeBSD_version' $2/usr/include/sys/param.h | awk '{print $3}') 116export OSVERSION 117BRANCH=$(grep '^BRANCH=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}') 118BRANCH=`echo ${BRANCH} | sed -e 's,",,g'` 119REVISION=$(grep '^REVISION=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}') 120REVISION=`echo ${REVISION} | sed -e 's,",,g'` 121OSRELEASE="${REVISION}-${BRANCH}" 122 123pkgng_install_docports () 124{ 125 # Attempt to install docproj port from pkgng package. 126 chroot ${CHROOTDIR} /bin/sh -c 'env ASSUME_ALWAYS_YES=1 /usr/sbin/pkg install -y docproj-nojadetex' 127 # Check if docproj was installed, since pkg(8) returns '0' if unable 128 # to install a package from the repository. If it is not installed, 129 # fallback to installing using pkg_add(1). 130 chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg info -q docproj-nojadetex' || \ 131 pkgadd_install_docports 132} 133 134build_compat9_port () 135{ 136 chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/misc/compat9x BATCH=yes install clean' 137} 138 139pkgadd_install_docports () 140{ 141 # Attempt to install docproj package with pkg_add(1). 142 # If not successful, build the docproj port. 143 if [ "${REVISION}" == "10.0" ]; then 144 # Packages for 10-CURRENT are still located in the 9-CURRENT 145 # directory. Override environment to use correct package 146 # location if building for 10-CURRENT. 147 PACKAGESITE="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/Latest/" 148 export PACKAGESITE 149 PACKAGEROOT="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/" 150 export PACKAGEROOT 151 PKG_PATH="ftp://ftp.freebsd.org/pub/FreeBSD/ports/${B_ARCH}/packages-9-current/All/" 152 export PKG_PATH 153 build_compat9_port 154 fi 155 chroot ${CHROOTDIR} /bin/sh -c '/usr/sbin/pkg_add -r docproj-nojadetex' || \ 156 build_docports 157} 158 159build_docports() 160{ 161 # Could not install textproc/docproj from pkg(8) or pkg_add(1). Build 162 # the port as final fallback. 163 chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/textproc/docproj BATCH=yes WITH_JADETEX=no WITHOUT_X11=yes WITHOUT_PYTHON=yes install clean' || \ 164 { echo "*** Could not build the textproj/docproj port. Exiting."; exit 2; } 165} 166
|
73if [ -d $2/usr/doc ]; then 74 cp /etc/resolv.conf $2/etc/resolv.conf 75 76 # Install docproj to build release documentation
| 167if [ -d $2/usr/doc ]; then 168 cp /etc/resolv.conf $2/etc/resolv.conf 169 170 # Install docproj to build release documentation
|
77 chroot $2 /bin/sh -c '(export ASSUME_ALWAYS_YES=1 && /usr/sbin/pkg install -y docproj) || (cd /usr/ports/textproc/docproj && make install clean BATCH=yes WITHOUT_X11=yes JADETEX=no WITHOUT_PYTHON=yes)'
| 171 CHROOTDIR="$2" 172 set +e 173 pkgng_install_docports "${CHROOTDIR}" 174 set -e
|
78fi 79
| 175fi 176
|
80chroot $2 make -C /usr/src $MAKE_FLAGS buildworld buildkernel 81chroot $2 make -C /usr/src/release release
| 177chroot $2 make -C /usr/src $MAKE_FLAGS ${ARCH_FLAGS} buildworld buildkernel 178chroot $2 make -C /usr/src/release ${ARCH_FLAGS} release
|
82chroot $2 make -C /usr/src/release install DESTDIR=/R 83
| 179chroot $2 make -C /usr/src/release install DESTDIR=/R 180
|
84: ${RELSTRING=`chroot $2 uname -s`-`chroot $2 uname -r`-`chroot $2 uname -p`}
| 181if [ "x${OSVERSION}" == "x" ]; then 182 OSRELEASE=`chroot $2 uname -r` 183fi
|
85
| 184
|
| 185: ${RELSTRING=`chroot $2 uname -s`-${OSRELEASE}-${B_ARCH}} 186
|
86cd $2/R 87for i in release.iso bootonly.iso memstick; do 88 mv $i $RELSTRING-$i 89done 90sha256 $RELSTRING-* > CHECKSUM.SHA256 91md5 $RELSTRING-* > CHECKSUM.MD5 92
| 187cd $2/R 188for i in release.iso bootonly.iso memstick; do 189 mv $i $RELSTRING-$i 190done 191sha256 $RELSTRING-* > CHECKSUM.SHA256 192md5 $RELSTRING-* > CHECKSUM.MD5 193
|