]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - release/generate-release.sh
MFV r243395:
[FreeBSD/FreeBSD.git] / release / generate-release.sh
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$
18 #
19
20 unset B_ARCH
21 unset ARCH
22 unset MACHINE_ARCH
23
24 HOST_ARCH=`uname -p`
25
26 usage()
27 {
28         echo "Usage: $0 [-a arch] [-r revision] [-d docrevision] [-p portsrevision] svn-branch scratch-dir"
29         exit 1
30 }
31
32 arch_error ()
33 {
34         echo "Architecture ${OPTARG} cannot be built on host architecture ${HOST_ARCH}"
35         exit 1
36 }
37
38 REVISION=
39 DOCREVISION=
40 PORTSREVISION=
41 while getopts a:d:r:p: opt; do
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                 ;;
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
74 done
75 shift $(($OPTIND - 1))
76
77 # If target architecture is not specified, use hw.machine_arch
78 if [ "x${B_ARCH}" == "x" ]; then
79         B_ARCH="${HOST_ARCH}"
80 fi
81 ARCH_FLAGS="ARCH=${B_ARCH} TARGET_ARCH=${B_ARCH}"
82
83 if [ $# -lt 2 ]; then
84         usage
85 fi
86
87 if [ $(id -u) -ne 0 ]; then
88         echo "Needs to be run as root."
89         exit 1
90 fi
91
92 set -e # Everything must succeed
93
94 case $MAKE_FLAGS in
95         *-j*)
96                 ;;
97         *)
98                 MAKE_FLAGS="$MAKE_FLAGS -j "$(sysctl -n hw.ncpu)
99                 ;;
100 esac
101
102 mkdir -p $2/usr/src
103
104 svn co ${SVNROOT:-svn://svn.freebsd.org/base}/$1 $2/usr/src $REVISION
105 svn co ${SVNROOT:-svn://svn.freebsd.org/doc}/head $2/usr/doc $DOCREVISION
106 svn co ${SVNROOT:-svn://svn.freebsd.org/ports}/head $2/usr/ports $PORTSREVISION
107
108 cd $2/usr/src
109 make $MAKE_FLAGS ${ARCH_FLAGS} buildworld
110 make $ARCH_FLAGS installworld distribution DESTDIR=$2
111 mount -t devfs devfs $2/dev
112 trap "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
115 OSVERSION=$(grep '#define __FreeBSD_version' $2/usr/include/sys/param.h | awk '{print $3}')
116 export OSVERSION
117 BRANCH=$(grep '^BRANCH=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
118 BRANCH=`echo ${BRANCH} | sed -e 's,",,g'`
119 REVISION=$(grep '^REVISION=' $2/usr/src/sys/conf/newvers.sh | awk -F\= '{print $2}')
120 REVISION=`echo ${REVISION} | sed -e 's,",,g'`
121 OSRELEASE="${REVISION}-${BRANCH}"
122
123 pkgng_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
134 build_compat9_port ()
135 {
136         chroot ${CHROOTDIR} /bin/sh -c 'make -C /usr/ports/misc/compat9x BATCH=yes install clean'
137 }
138
139 pkgadd_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
159 build_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
167 if [ -d $2/usr/doc ]; then 
168         cp /etc/resolv.conf $2/etc/resolv.conf
169
170         # Install docproj to build release documentation
171         CHROOTDIR="$2"
172         set +e
173         pkgng_install_docports "${CHROOTDIR}"
174         set -e
175 fi
176
177 chroot $2 make -C /usr/src $MAKE_FLAGS ${ARCH_FLAGS} buildworld buildkernel
178 chroot $2 make -C /usr/src/release ${ARCH_FLAGS} release
179 chroot $2 make -C /usr/src/release install DESTDIR=/R
180
181 if [ "x${OSVERSION}" == "x" ]; then
182         OSRELEASE=`chroot $2 uname -r`
183 fi
184
185 : ${RELSTRING=`chroot $2 uname -s`-${OSRELEASE}-${B_ARCH}}
186
187 cd $2/R
188 for i in release.iso bootonly.iso memstick; do
189         mv $i $RELSTRING-$i
190 done
191 sha256 $RELSTRING-* > CHECKSUM.SHA256
192 md5 $RELSTRING-* > CHECKSUM.MD5
193