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