]>
Commit | Line | Data |
---|---|---|
275d96ed | 1 | #! /bin/sh |
2 | ||
3 | ######################################################################## | |
4 | # | |
deeaaa98 | 5 | # File: gcc_build |
275d96ed | 6 | # Author: Mark Mitchell |
a1ed82f1 | 7 | # Date: 2000-07-10 |
8 | # | |
9 | # Adapted to Subversion by Ben Elliston <bje@au.ibm.com>, 2005-07-14. | |
275d96ed | 10 | # |
11 | # Contents: | |
12 | # Script to automatically download and build GCC. | |
13 | # | |
a1ed82f1 | 14 | # Copyright (c) 2000, 2001, 2003, 2005 Free Software Foundation. |
275d96ed | 15 | # |
133482bc | 16 | # This file is part of GCC. |
275d96ed | 17 | # |
133482bc | 18 | # GCC is free software; you can redistribute it and/or modify |
275d96ed | 19 | # it under the terms of the GNU General Public License as published by |
030ffd5e | 20 | # the Free Software Foundation; either version 3, or (at your option) |
275d96ed | 21 | # any later version. |
22 | # | |
133482bc | 23 | # GCC is distributed in the hope that it will be useful, |
275d96ed | 24 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
25 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
26 | # GNU General Public License for more details. | |
27 | # | |
28 | # You should have received a copy of the GNU General Public License | |
133482bc | 29 | # along with GCC; see the file COPYING. If not, write to |
2af676bd | 30 | # the Free Software Foundation, 51 Franklin Street, Fifth Floor, |
31 | # Boston, MA 02110-1301, USA. | |
275d96ed | 32 | # |
33 | ######################################################################## | |
34 | ||
35 | ######################################################################## | |
36 | # Notes | |
37 | ######################################################################## | |
38 | ||
c0921e86 | 39 | # You can set the following variables in the environment. They |
40 | # have no corresponding command-line options because they should | |
41 | # only be needed infrequently: | |
42 | # | |
43 | # MAKE The path to `make'. | |
44 | ||
275d96ed | 45 | ######################################################################## |
46 | # Functions | |
47 | ######################################################################## | |
48 | ||
49 | # Issue the error message given by $1 and exit with a non-zero | |
50 | # exit code. | |
51 | ||
52 | error() { | |
931ced76 | 53 | echo "gcc_build: error: $1" |
275d96ed | 54 | exit 1 |
55 | } | |
56 | ||
57 | # Issue a usage message explaining how to use this script. | |
58 | ||
59 | usage() { | |
60 | cat <<EOF | |
931ced76 | 61 | gcc_build [-c configure_options] |
275d96ed | 62 | [-d destination_directory] |
60f107a4 | 63 | [-m make_boot_options] |
fd87d7ed | 64 | [-o objdir] |
1a70554b | 65 | [-b branch_name] |
275d96ed | 66 | [-u username] |
67 | [-p protocol] | |
68 | [-t tarfile] | |
c11a3f5e | 69 | [-x make_check_options] |
60f107a4 | 70 | [bootstrap] |
275d96ed | 71 | [build] |
72 | [checkout] | |
60f107a4 | 73 | [configure] |
275d96ed | 74 | [export] |
75 | [install] | |
76 | [test] | |
77 | [update] | |
78 | EOF | |
79 | exit 1 | |
80 | } | |
81 | ||
82 | # Change to the directory given by $1. | |
83 | ||
84 | changedir() { | |
85 | cd $1 || \ | |
86 | error "Could not change directory to $1" | |
87 | } | |
88 | ||
275d96ed | 89 | # Checkout a fresh copy of the GCC build tree. |
90 | ||
91 | checkout_gcc() { | |
275d96ed | 92 | # If the destination already exists, don't risk destroying it. |
93 | test -e ${DESTINATION} && \ | |
94 | error "${DESTINATION} already exists" | |
95 | ||
275d96ed | 96 | # Checkout the tree |
a1ed82f1 | 97 | test -n "${SVN_USERNAME}" && SVN_USERNAME="${SVN_USERNAME}@" |
1a70554b | 98 | SVNROOT="${SVN_PROTOCOL}://${SVN_USERNAME}${SVN_SERVER}${SVN_REPOSITORY}${SVN_BRANCH}" |
a1ed82f1 | 99 | |
100 | $GCC_SVN co $SVNROOT ${DESTINATION} || \ | |
275d96ed | 101 | error "Could not check out GCC" |
102 | } | |
103 | ||
104 | # Update GCC. | |
105 | ||
106 | update_gcc() { | |
275d96ed | 107 | # If the destination does not already exist, complain. |
108 | test -d ${DESTINATION} || \ | |
a1ed82f1 | 109 | error "${DESTINATION} does not exist" |
110 | ||
275d96ed | 111 | # Enter the destination directory. |
112 | changedir ${DESTINATION} | |
113 | ||
114 | # Update the tree | |
45837d1e | 115 | ./contrib/gcc_update || \ |
275d96ed | 116 | error "Could not update GCC" |
117 | } | |
118 | ||
60f107a4 | 119 | # Configure for a build of GCC. |
275d96ed | 120 | |
60f107a4 | 121 | configure_gcc() { |
275d96ed | 122 | # Go to the source directory. |
123 | changedir ${DESTINATION} | |
124 | ||
125 | # Remove the object directory. | |
126 | rm -rf ${OBJDIR} | |
127 | # Create it again. | |
128 | mkdir ${OBJDIR} || \ | |
129 | error "Could not create ${OBJDIR}" | |
130 | # Enter it. | |
131 | changedir ${OBJDIR} | |
132 | ||
133 | # Configure the tree. | |
d0b17e85 | 134 | echo "Configuring: ${DESTINATION}/configure ${CONFIGURE_OPTIONS}" |
e74f4b65 | 135 | eval ${DESTINATION}/configure ${CONFIGURE_OPTIONS} || \ |
60f107a4 | 136 | error "Could not configure the compiler" |
137 | } | |
138 | ||
139 | # Bootstrap GCC. Assume configuration has already occurred. | |
140 | ||
141 | bootstrap_gcc() { | |
142 | # Go to the source directory. | |
143 | changedir ${DESTINATION} | |
144 | # Go to the object directory. | |
145 | changedir ${OBJDIR} | |
275d96ed | 146 | |
147 | # Bootstrap the compiler | |
d0b17e85 | 148 | echo "Building: ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap" |
e74f4b65 | 149 | eval ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap || \ |
60f107a4 | 150 | error "Could not bootstrap the compiler" |
275d96ed | 151 | } |
152 | ||
153 | # Test GCC. | |
154 | ||
155 | test_gcc() { | |
156 | # Go to the source directory. | |
157 | changedir ${DESTINATION} | |
158 | # Go to the object directory. | |
159 | changedir ${OBJDIR} | |
160 | ||
161 | echo "Running tests... This will take a while." | |
c11a3f5e | 162 | eval \${MAKE} -k ${MAKE_CHECK_OPTIONS} check |
e74f4b65 | 163 | ${DESTINATION}/contrib/test_summary |
275d96ed | 164 | } |
165 | ||
166 | # Export the GCC source tree. | |
167 | ||
168 | export_gcc() { | |
169 | # Go to the source directory. | |
170 | changedir ${DESTINATION} | |
171 | # Go up one level. | |
172 | changedir .. | |
1409de39 | 173 | # Build a tarball of the source directory. |
275d96ed | 174 | tar czf ${TARFILE} \ |
175 | --exclude=${OBJDIR} \ | |
a1ed82f1 | 176 | --exclude=.svn \ |
275d96ed | 177 | --exclude='.#*' \ |
178 | --exclude='*~' \ | |
179 | `basename ${DESTINATION}` | |
180 | } | |
181 | ||
182 | # Install GCC. | |
183 | ||
184 | install_gcc() { | |
185 | # Go to the source directory. | |
186 | changedir ${DESTINATION} | |
187 | # Go to the object directory. | |
188 | changedir ${OBJDIR} | |
189 | ||
e74f4b65 | 190 | ${MAKE} install || error "Installation failed" |
275d96ed | 191 | } |
192 | ||
193 | ######################################################################## | |
194 | # Initialization | |
195 | ######################################################################## | |
196 | ||
a1ed82f1 | 197 | # SVN command |
198 | GCC_SVN=${GCC_SVN-${SVN-svn}} | |
199 | # The SVN server containing the GCC repository. | |
1a70554b | 200 | SVN_SERVER="gcc.gnu.org" |
275d96ed | 201 | # The path to the repository on that server. |
1a70554b | 202 | SVN_REPOSITORY="/svn/gcc/" |
203 | # The branch to check out from that server. | |
c4678f36 | 204 | # Defaults to trunk if no branch is defined with -b. |
205 | SVN_BRANCH="" | |
a1ed82f1 | 206 | # The SVN protocol to use. |
207 | SVN_PROTOCOL="svn" | |
275d96ed | 208 | # The username to use when connecting to the server. |
a1ed82f1 | 209 | # An empty string means anonymous. |
210 | SVN_USERNAME="" | |
275d96ed | 211 | |
212 | # The directory where the checked out GCC will be placed. | |
213 | DESTINATION="${HOME}/dev/gcc" | |
214 | # The relative path from the top of the source tree to the | |
215 | # object directory. | |
216 | OBJDIR="objdir" | |
217 | ||
275d96ed | 218 | # The file where the tarred up sources will be placed. |
219 | TARFILE="${HOME}/dev/gcc.tgz" | |
220 | ||
221 | # Options to pass to configure. | |
222 | CONFIGURE_OPTIONS= | |
c0921e86 | 223 | # The `make' program. |
224 | MAKE=${MAKE:-make} | |
c11a3f5e | 225 | # Options to pass to "make bootstrap". |
60f107a4 | 226 | MAKE_BOOTSTRAP_OPTIONS= |
c11a3f5e | 227 | # Options to pass to "make check". |
228 | MAKE_CHECK_OPTIONS= | |
275d96ed | 229 | |
230 | # Modes of operation | |
60f107a4 | 231 | BOOTSTRAP=0 |
275d96ed | 232 | CHECKOUT=0 |
60f107a4 | 233 | CONFIGURE=0 |
275d96ed | 234 | EXPORT=0 |
235 | INSTALL=0 | |
236 | TEST=0 | |
237 | UPDATE=0 | |
238 | ||
239 | ######################################################################## | |
240 | # Main Program | |
241 | ######################################################################## | |
242 | ||
a1ed82f1 | 243 | # Issue usage if no parameters are given. |
244 | test $# -eq 0 && usage | |
245 | ||
275d96ed | 246 | # Parse the options. |
1a70554b | 247 | while getopts "c:d:m:o:p:t:b:u:x:" ARG; do |
275d96ed | 248 | case $ARG in |
249 | c) CONFIGURE_OPTIONS="${OPTARG}";; | |
250 | d) DESTINATION="${OPTARG}";; | |
60f107a4 | 251 | m) MAKE_BOOTSTRAP_OPTIONS="${OPTARG}";; |
fd87d7ed | 252 | o) OBJDIR="${OPTARG}";; |
a1ed82f1 | 253 | p) SVN_PROTOCOL="${OPTARG}";; |
c11a3f5e | 254 | t) TARFILE="${OPTARG}";; |
255 | x) MAKE_CHECK_OPTIONS="${OPTARG}";; | |
1a70554b | 256 | b) SVN_BRANCH="${OPTARG}";; |
a1ed82f1 | 257 | u) SVN_USERNAME="${OPTARG}";; |
275d96ed | 258 | \?) usage;; |
259 | esac | |
260 | done | |
261 | shift `expr ${OPTIND} - 1` | |
262 | ||
263 | # Handle the major modes. | |
264 | while [ $# -ne 0 ]; do | |
265 | case $1 in | |
60f107a4 | 266 | bootstrap) BOOTSTRAP=1;; |
267 | build) CONFIGURE=1; BOOTSTRAP=1;; | |
275d96ed | 268 | checkout) CHECKOUT=1;; |
60f107a4 | 269 | configure) CONFIGURE=1;; |
275d96ed | 270 | export) EXPORT=1;; |
271 | install) INSTALL=1;; | |
272 | test) TEST=1;; | |
273 | update) UPDATE=1;; | |
274 | *) usage;; | |
275 | esac | |
276 | shift | |
277 | done | |
278 | ||
279 | # Check the arguments for sanity. | |
280 | if [ ${CHECKOUT} -ne 0 ] && [ ${UPDATE} -ne 0 ]; then | |
281 | error "Cannot checkout and update simultaneously" | |
282 | fi | |
283 | ||
1a70554b | 284 | if [ ${CHECKOUT} -eq 0 ] && test -n "${SVN_BRANCH}"; then |
285 | error "Branch argument only makes sense when doing a checkout" | |
286 | fi | |
287 | ||
288 | # Validate the branch name. | |
c4678f36 | 289 | if test -n "${SVN_BRANCH}"; then |
1a70554b | 290 | SVN_BRANCH="branches/${SVN_BRANCH}"; |
9824ce48 | 291 | else |
292 | SVN_BRANCH="trunk"; | |
1a70554b | 293 | fi |
294 | ||
275d96ed | 295 | # Checkout the tree. |
296 | if [ ${CHECKOUT} -ne 0 ]; then | |
297 | checkout_gcc | |
298 | elif [ ${UPDATE} -ne 0 ]; then | |
299 | update_gcc | |
300 | fi | |
301 | ||
60f107a4 | 302 | # Configure to build the tree. |
303 | if [ ${CONFIGURE} -ne 0 ]; then | |
304 | configure_gcc | |
305 | fi | |
306 | ||
307 | # Bootstrap the compiler. | |
308 | if [ ${BOOTSTRAP} -ne 0 ]; then | |
309 | bootstrap_gcc | |
275d96ed | 310 | fi |
311 | ||
312 | # Test the compiler | |
313 | if [ ${TEST} -ne 0 ]; then | |
314 | test_gcc | |
315 | fi | |
316 | ||
317 | # Install the compiler. | |
318 | if [ ${INSTALL} -ne 0 ]; then | |
319 | install_gcc | |
320 | fi | |
321 | ||
322 | # Export the sources | |
323 | if [ ${EXPORT} -ne 0 ]; then | |
324 | export_gcc | |
325 | fi |