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