build.sh 8.07 KB
Newer Older
rtoy's avatar
rtoy committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh 

# Build CMUCL from source.  The intent of this script is to make it a
# little easier invoke the other scripts and build CMUCL.  In the
# simplest case where your lisp is named cmulisp and no special
# bootfiles are needed, you would build CMUCL using:
#
#    src/tools/build.sh -C ""
#
# This will create a set of directories named build-2, build-3, and
# build-4 and CMUCL will be built 3 consecutive times, using the
# version of CMUCL from the previous build.
#
#
# You can control which of the builds are done by using the -1, -2, -3
# options, but it is up to you to make sure the previous builds exist.
#
# A more realistic example would be
#
#    src/tools/build.sh -v "My build" -B boot-19b.lisp -o "my-lisp -noinit"
#
# where you need to load the bootfile boot-19b.lisp and your lisp is
# not named cmulisp, but my-lisp.
#
# For more complicated builds, you will need to run create-target.sh
# manually, and adjust the bootstrap or setenv files by hand.  Once
# this is done, you can run build.sh to build everything.  Just be
# sure to leave off the -C option.
#
# Cross compiling is not supported with this script.  You will have to
# do that by hand.
#
# For more information see src/BUILDING.
rtoy's avatar
rtoy committed
34
#
35
# $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/tools/build.sh,v 1.38 2010/11/10 19:17:55 rtoy Exp $
rtoy's avatar
rtoy committed
36
#
rtoy's avatar
rtoy committed
37
38
39
40
41

ENABLE2="yes"
ENABLE3="yes"
ENABLE4="yes"

42
version=20d
rtoy's avatar
rtoy committed
43
SRCDIR=src
44
45
BINDIR=bin
TOOLDIR=$BINDIR
46
47
OLDLISPFLAGS="-noinit -nositeinit"
OLDLISP="cmulisp"
48
49
GIT_FILE_COMMENT="yes"
export GIT_FILE_COMMENT
rtoy's avatar
rtoy committed
50
51
52

SKIPUTILS=no

rtoy's avatar
rtoy committed
53
54
# If gmake exists, assume it is GNU make and use it.
if [ -z "$MAKE" ]; then
55
    MAKE="`which gmake`"
56
57
58
59
60
61
62
63
64

    # Some versions of which set an error code if it fails.  Others
    # say "no foo in <path>".  In either of these cases, just assume
    # make is GNU make.

    if [ $? -ne 0 ]; then
	MAKE="make"
    fi
    if echo "X$MAKE" | grep '^Xno' > /dev/null; then
65
66
	MAKE="make"
    fi
rtoy's avatar
rtoy committed
67
68
fi

rtoy's avatar
rtoy committed
69
70
usage ()
{
71
    echo "build.sh [-123obvuBCUG?]"
rtoy's avatar
rtoy committed
72
73
74
75
76
    echo "    -1        Skip build 1"
    echo "    -2        Skip build 2"
    echo "    -3        Skip build 3"
    echo "    -o x      Use specified Lisp to build.  Default is cmulisp"
    echo "               (only applicable for build 1)"
rtoy's avatar
rtoy committed
77
    echo '    -b d      The different build directories are named ${d}-2, ${d}-3 ${d}-4'
78
    echo '               If -b is not given, a suitable name based on the OS is used.' 
rtoy's avatar
rtoy committed
79
    echo '    -v v      Use the given string as the version.  Default is'
80
    echo "               based on git describe"
rtoy's avatar
rtoy committed
81
    echo "    -u        Don't build CLX, CLM, or Hemlock"
rtoy's avatar
rtoy committed
82
83
84
    echo '    -i n      Make build "n" interactive, so output is sent to *standard-output*'
    echo '               instead of the log file. "n" should be a string consisting of'
    echo '                the numbers 1, 2, or 3.'
85
    echo "    -B file   Use file as a boot file.  May be be specified more than once"
rtoy's avatar
rtoy committed
86
    echo "               The file is relative to the bootfiles/<version> directory"
rtoy's avatar
rtoy committed
87
88
89
    echo '    -C [l m]  Create the build directories.  The args are what'
    echo '               you would give to create-target.sh for the lisp'
    echo '               and motif variant.'
90
    echo '    -f mode   FPU mode:  x87, sse2, or auto.  Default is auto'
91
92
    echo '    -P        On the last build, do NOT generate cmucl.pot and do NOT update'
    echo '               the translations.'
rtoy's avatar
rtoy committed
93
    echo "    -?        This help message"
94
    echo "    -w        Specify a different build-world.sh script"
Raymond Toy's avatar
Raymond Toy committed
95
    echo "    -U        If translations are done, overwrite the files with the"
96
97
98
    echo "               translations instead of computing and displaying the diffs."
    echo "    -O opt    Any additional command-line flags to use when building."
    echo "               The flags always include -noinit -nositeinit"
99
100
    echo "    -R        Force recompiling the C runtime.  Normally, just runs make to "
    echo "               recompile anything that has changed."
101
    echo "    -G        Don't use git to fill file-comment information"
rtoy's avatar
rtoy committed
102
103
104
    exit 1
}

105
106
107
108
109
110
111
112
113
# Figure out if we need to run build-world twice
case `uname -s` in
  SunOS) BUILD_WORLD2=yes ;;
  Darwin)
      case `uname -m` in
	ppc) BUILD_WORLD2=yes ;;
      esac ;;
esac

rtoy's avatar
rtoy committed
114
115
buildit ()
{
rtoy's avatar
rtoy committed
116
117
118
119
120
121
    if echo $INTERACTIVE_BUILD | grep $BUILD > /dev/null; then
	INTERACTIVE=t
    else
	INTERACTIVE=nil
    fi

rtoy's avatar
rtoy committed
122
123
124
125
126
127
128
129
    if [ ! -d $TARGET ]; then
	if [ -n "$CREATE_DIRS" ]; then
	    $TOOLDIR/create-target.sh $TARGET $CREATE_OPT
	fi
    fi

    if [ "$ENABLE" = "yes" ]; 
    then
130
	$TOOLDIR/clean-target.sh $CLEAN_FLAGS $TARGET || { echo "Failed: $TOOLDIR/clean-target.sh"; exit 1; }
131
	time $BUILDWORLD $TARGET $OLDLISP $BOOT || { echo "Failed: $BUILDWORLD"; exit 1; }
132
	if [ "$REBUILD_LISP" = "yes" ]; then
133
	    $TOOLDIR/rebuild-lisp.sh $TARGET
134
135
136
137
138
	else
	    # Set the LANG to C.  For whatever reason, if I (rtoy) don't
	    # do this on my openSuSE system, any messages from gcc are
	    # basically garbled.  This should be harmless on other
	    # systems.
139
	    LANG=C $MAKE -C $TARGET/lisp $MAKE_TARGET || { echo "Failed: $MAKE -C $TARGET/lisp"; exit 1; }
140
141
        fi

142
143
	if [ "$BUILD_WORLD2" = "yes" ];
	then
144
	    $BUILDWORLD $TARGET $OLDLISP $BOOT || { echo "Failed: $BUILDWORLD"; exit 1; }
rtoy's avatar
rtoy committed
145
	fi
146
147
	$TOOLDIR/load-world.sh $TARGET "$VERSION" || { echo "Failed: $TOOLDIR/load-world.sh"; exit 1; }

rtoy's avatar
rtoy committed
148
	$TARGET/lisp/lisp -batch -noinit -nositeinit $FPU_MODE < /dev/null || { echo "Failed: $TARGET/lisp/lisp -batch -noinit $FPU_MODE"; exit 1; }
149
	return 0;
rtoy's avatar
rtoy committed
150
151
152
    fi
}

153
FPU_MODE=
154
BUILDWORLD="$TOOLDIR/build-world.sh"
155
BUILD_POT="yes"
rtoy's avatar
rtoy committed
156
UPDATE_TRANS=
157

158
while getopts "123PRGo:b:v:uB:C:Ui:f:w:O:?" arg
rtoy's avatar
rtoy committed
159
160
161
162
163
164
165
do
    case $arg in
	1) ENABLE2="no" ;;
	2) ENABLE3="no" ;;
	3) ENABLE4="no" ;;
	o) OLDLISP=$OPTARG ;;
	b) BASE=$OPTARG ;;
166
	v) VERSION="$OPTARG $GIT_HASH" ;;
rtoy's avatar
rtoy committed
167
168
169
170
	u) SKIPUTILS="yes" ;;
	C) CREATE_OPT="$OPTARG"
	   CREATE_DIRS=yes ;;
	B) bootfiles="$bootfiles $OPTARG" ;;
rtoy's avatar
rtoy committed
171
        i) INTERACTIVE_BUILD="$OPTARG" ;;
172
	f) FPU_MODE="-fpu $OPTARG" ;;
173
        P) BUILD_POT=no ;;
174
        w) BUILDWORLD="$OPTARG" ;;
rtoy's avatar
rtoy committed
175
        U) UPDATE_TRANS="yes";;
176
	O) OLDLISPFLAGS="$OLDLISPFLAGS $OPTARG" ;;
177
        R) REBUILD_LISP="yes";;
178
	G) GIT_FILE_COMMENT="no";;
rtoy's avatar
rtoy committed
179
	\?) usage
rtoy's avatar
rtoy committed
180
181
182
183
	    ;;
    esac
done

184
185
186
# If -b not given, try to derive one instead of just using "build".
if [ -z "$BASE" ]; then
    case `uname -s` in
187
188
189
190
191
      Darwin)
          case `uname -p` in
            powerpc) BASE=ppc ;;
            i386) BASE=darwin ;;
          esac ;;
192
193
194
195
196
197
198
199
200
201
202
203
204
      SunOS)
	  case `uname -m` in
	    sun4u) BASE=sparc ;;
	    i86pc) BASE=sol-x86 ;;
	  esac ;;
      Linux) BASE=linux ;;
      # Add support for FreeBSD and NetBSD?  Otherwise default to just build.
      *) BASE=build ;;
    esac
fi

echo base = $BASE

rtoy's avatar
rtoy committed
205
206
207
208
209
210
211
bootfiles_dir=$SRCDIR/bootfiles/$version
if [ -n "$bootfiles" ]; then
    for file in $bootfiles; do
	BOOT="$BOOT -load $bootfiles_dir/$file"
    done
fi

212
213
214
build_started=`date`
echo "//starting build: $build_started"

rtoy's avatar
rtoy committed
215
216
TARGET=$BASE-2
ENABLE=$ENABLE2
217
MAKE_TARGET=all
rtoy's avatar
rtoy committed
218
export INTERACTIVE
rtoy's avatar
rtoy committed
219

rtoy's avatar
rtoy committed
220
BUILD=1
221
OLDLISP="$OLDLISP $OLDLISPFLAGS $FPU_MODE"
rtoy's avatar
rtoy committed
222
223
224
225
226
buildit

bootfiles=

TARGET=$BASE-3
227
OLDLISP="${BASE}-2/lisp/lisp $OLDLISPFLAGS $FPU_MODE"
rtoy's avatar
rtoy committed
228
229
ENABLE=$ENABLE3

rtoy's avatar
rtoy committed
230
BUILD=2
rtoy's avatar
rtoy committed
231
232
233
# We shouldn't have to run build-world again because nothing should
# have changed in the C code after the first build.
BUILD_WORLD2=
rtoy's avatar
rtoy committed
234
235
236
buildit

TARGET=$BASE-4
237
CLEAN_FLAGS="-K all"
238
OLDLISP="${BASE}-3/lisp/lisp $OLDLISPFLAGS $FPU_MODE"
rtoy's avatar
rtoy committed
239
240
ENABLE=$ENABLE4

241
242
if [ "${BUILD_POT}" = "yes" ]; then
   MAKE_POT=yes
rtoy's avatar
rtoy committed
243
244
245
246
247
   if [ "${UPDATE_TRANS}" = "yes" ]; then
       MAKE_TARGET="all translations-update"
   else
       MAKE_TARGET="all translations"
   fi
248
249
250
   export MAKE_POT
fi

rtoy's avatar
rtoy committed
251
BUILD=3
rtoy's avatar
rtoy committed
252
253
buildit

254
255
256
257
258
259
260
261
262
263
264
265
266
267
# Asdf and friends are part of the base install, so we need to build
# them now.
$TARGET/lisp/lisp $FPU_MODE -noinit -nositeinit -batch "$@" << EOF || exit 3
(in-package :cl-user)
(setf (ext:search-list "target:")
      '("$TARGET/" "src/"))
(setf (ext:search-list "modules:")
      '("target:contrib/"))

(compile-file "modules:asdf/asdf")
(compile-file "modules:defsystem/defsystem")
EOF


rtoy's avatar
rtoy committed
268
269
if [ "$SKIPUTILS" = "no" ];
then
270
    OLDLISP="${BASE}-4/lisp/lisp $OLDLISPFLAGS $FPU_MODE"
rtoy's avatar
rtoy committed
271
    time $TOOLDIR/build-utils.sh $TARGET $FPU_MODE
rtoy's avatar
rtoy committed
272
fi
273
274
275
276
277

build_finished=`date`
echo
echo "//build started:  $build_started"
echo "//build finished: $build_finished"