]> git.lizzy.rs Git - rust.git/blob - configure
Fuzzer: stop ignoring fixed bugs
[rust.git] / configure
1 #!/bin/sh
2
3 msg() {
4     echo "configure: $1"
5 }
6
7 step_msg() {
8     msg
9     msg "$1"
10     msg
11 }
12
13 warn() {
14     echo "configure: WARNING: $1"
15 }
16
17 err() {
18     echo "configure: error: $1"
19     exit 1
20 }
21
22
23 need_cmd() {
24     if which $1 >/dev/null 2>&1
25     then msg "found $1"
26     else err "need $1"
27     fi
28 }
29
30 make_dir() {
31     if [ ! -d $1 ]
32     then
33         msg "mkdir -p $1"
34         mkdir -p $1
35     fi
36 }
37
38 copy() {
39     msg "cp $1 $2"
40     cp $1 $2
41 }
42
43 putvar() {
44     local T
45     eval T=\$$1
46     eval TLEN=\${#$1}
47     if [ $TLEN -gt 35 ]
48     then
49         printf "configure: %-20s := %.35s ...\n" $1 "$T"
50     else
51         printf "configure: %-20s := %s\n" $1 "$T"
52     fi
53     printf "%-20s := %s\n" $1 "$T" >>config.mk
54 }
55
56 probe() {
57     local V=$1
58     local P=$2
59     local T
60     T=$(which $P 2>&1)
61     if [ $? -ne 0 ]
62     then
63         T=""
64     fi
65     eval $V=\$T
66     putvar $V
67 }
68
69 probe_need() {
70     local V=$1
71     local P=$2
72     probe $V $P
73     eval VV=\$$V
74     if [ -z "$VV" ]
75     then
76         err "required program '$P' not found"
77     fi
78 }
79
80 opt() {
81     local OP=$1
82     local DEFAULT=$2
83     shift
84     shift
85     local DOC="$*"
86     local FLAG=""
87
88     if [ $DEFAULT -eq 0 ]
89     then
90         FLAG="enable"
91     else
92         FLAG="disable"
93         DOC="don't $DOC"
94     fi
95
96     if [ $HELP -eq 0 ]
97     then
98         for arg in $CFG_CONFIGURE_ARGS
99         do
100             if [ "$arg" = "--${FLAG}-${OP}" ]
101             then
102                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
103                 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
104                 local V="CFG_${FLAG}_${OP}"
105                 eval $V=1
106                 putvar $V
107             fi
108         done
109     else
110         if [ ! -z "$META" ]
111         then
112             OP="$OP=<$META>"
113         fi
114         printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
115      fi
116 }
117
118 msg "looking for configure programs"
119 need_cmd mkdir
120 need_cmd printf
121 need_cmd cut
122 need_cmd grep
123 need_cmd xargs
124 need_cmd cp
125 need_cmd find
126 need_cmd uname
127 need_cmd date
128 need_cmd tr
129 need_cmd sed
130
131 msg "inspecting environment"
132
133 CFG_OSTYPE=$(uname -s)
134 CFG_CPUTYPE=$(uname -m)
135
136 if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
137 then
138     # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
139     # instead.
140     if sysctl hw.optional.x86_64 | grep ': 1'
141     then
142         CFG_CPUTYPE=x86_64
143     fi
144 fi
145
146
147 # The goal here is to come up with the same triple as LLVM would,
148 # at least for the subset of platforms we're willing to target.
149
150 case $CFG_OSTYPE in
151
152     Linux)
153         CFG_OSTYPE=unknown-linux-gnu
154         ;;
155
156     FreeBSD)
157         CFG_OSTYPE=unknown-freebsd
158         ;;
159
160     Darwin)
161         CFG_OSTYPE=apple-darwin
162         ;;
163
164     MINGW32*)
165         CFG_OSTYPE=pc-mingw32
166         ;;
167
168     *)
169         err "unknown OS type: $CFG_OSTYPE"
170         ;;
171 esac
172
173
174 case $CFG_CPUTYPE in
175
176     i386 | i486 | i686 | i786 | x86)
177         CFG_CPUTYPE=i686
178         ;;
179
180     xscale | arm)
181         CFG_CPUTYPE=arm
182         ;;
183
184     x86_64 | x86-64 | x64)
185         CFG_CPUTYPE=x86_64
186         ;;
187
188     *)
189         err "unknown CPU type: $CFG_CPUTYPE"
190 esac
191
192 CFG_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"
193
194 CFG_SELF=$(echo $0 | tr '\\' '/')
195 CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
196 CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
197 CFG_CONFIGURE_ARGS="$@"
198
199 OPTIONS=""
200 HELP=0
201 if [ "$1" = "--help" ]
202 then
203     HELP=1
204     shift
205     echo ""
206     echo "Usage: $CFG_SELF [options]"
207     echo ""
208     echo "Options:"
209     echo ""
210 else
211     msg "recreating config.mk"
212     echo '' >config.mk
213
214     step_msg "processing $CFG_SELF args"
215 fi
216
217 opt sharedstd 1 "build libstd as a shared library"
218 opt valgrind 1 "run tests with valgrind"
219 opt docs     1 "build documentation"
220 opt optimize 1 "build optimized rust code"
221 opt mingw-cross 0 "cross-compile for win32 using mingw"
222
223
224 if [ $HELP -eq 1 ]
225 then
226     echo ""
227     exit 0
228 fi
229
230 step_msg "writing out basic parameters"
231 putvar CFG_SRC_DIR
232 putvar CFG_BUILD_DIR
233 putvar CFG_OSTYPE
234 putvar CFG_CPUTYPE
235 putvar CFG_CONFIGURE_ARGS
236
237 step_msg "looking for build programs"
238 probe_need CFG_PERL         perl
239 probe_need CFG_PYTHON       python
240 probe_need CFG_CURL         curl
241
242 probe CFG_GIT              git
243 probe CFG_CLANG            clang++
244 probe CFG_GCC              gcc
245 probe CFG_LLVM_CONFIG      llvm-config
246 probe CFG_VALGRIND         valgrind
247 probe CFG_PERF             perf
248 probe CFG_MAKEINFO         makeinfo
249 probe CFG_TEXI2PDF         texi2pdf
250 probe CFG_TEX              tex
251 probe CFG_MAKENSIS         makensis
252
253 if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
254 then
255     err "either clang or gcc is required"
256 fi
257
258 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
259 then
260     CFG_IN_TRANSITION=1
261     putvar CFG_IN_TRANSITION
262 fi
263
264 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
265 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
266 # errors.
267 if [ $CFG_OSTYPE != Linux ] && [ $CFG_OSTYPE != Darwin ]
268 then
269     CFG_BAD_VALGRIND=1
270     putvar CFG_BAD_VALGRIND
271 fi
272
273 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
274 then
275     CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
276 fi
277
278 if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
279 then
280     CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
281     CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
282     CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
283     CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
284     CFG_LLVM_LDFLAGS=""
285     CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
286                     -name '*.lib' \
287                     -exec echo '\"{}\"' ';' \
288                     | xargs echo)
289     CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
290                        --version \
291                        | grep version \
292                        | cut -d ' ' -f 5-)
293     CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
294                       --version \
295                       | grep Host: \
296                       | cut -d ' ' -f 4-)
297 elif [ ! -z "$CFG_LLVM_CONFIG" ]
298 then
299     CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
300     CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
301     CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
302     CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
303     CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
304     CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
305     CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
306     CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
307 else
308     err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
309 \"llvm-config\" script must be present"
310 fi
311
312 case $CFG_LLVM_VERSION in
313     (3.0svn | 3.0)
314     step_msg "found ok version of LLVM: $CFG_LLVM_VERSION"
315     ;;
316     (*)
317     err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
318     ;;
319 esac
320
321 if [ ! -z "$CFG_CLANG" ]
322 then
323     CFG_CLANG_VERSION=$("$CFG_CLANG" \
324                       --version \
325                       | grep version \
326                       | cut -d ' ' -f 3)
327
328     case $CFG_CLANG_VERSION in
329         (3.0svn | 3.0)
330         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
331         CFG_C_COMPILER="clang"
332         ;;
333         (*)
334         msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
335         CFG_C_COMPILER="gcc"
336         ;;
337     esac
338 else
339     CFG_C_COMPILER="gcc"
340 fi
341
342 if [ ! -z "$CFG_LLVM_TRIPLE" ]
343 then
344     if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ]
345     then
346         warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from"
347         warn "detected host triple $CFG_HOST_TRIPLE"
348         warn "choosing LLVM host-triple instead"
349         msg ""
350         CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE
351     fi
352 fi
353
354 # FIXME: add support for extending the target-triples list
355 CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
356
357 putvar CFG_HOST_TRIPLE
358 putvar CFG_TARGET_TRIPLES
359
360
361 putvar CFG_C_COMPILER
362
363 putvar CFG_LLVM_ROOT
364 putvar CFG_LLVM_INCDIR
365 putvar CFG_LLVM_BINDIR
366 putvar CFG_LLVM_LIBDIR
367 putvar CFG_LLVM_CXXFLAGS
368 putvar CFG_LLVM_LDFLAGS
369 putvar CFG_LLVM_LIBS
370 putvar CFG_LLVM_TRIPLE
371
372 # Munge any paths that appear in config.mk back to posix-y
373 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
374                -e 's@\\@/@go;' config.mk
375 rm -f config.mk.bak
376
377 step_msg "making directories"
378 for i in \
379     doc \
380     rt rt/isaac rt/bigint rt/sync rt/test rt/arch/i386 \
381     rt/libuv rt/libuv/src/ares rt/libuv/src/eio rt/libuv/src/ev \
382     rustllvm dl \
383     test/run-pass test/run-fail test/compile-fail \
384     test/bench test/perf test/pretty
385 do
386     make_dir $i
387 done
388
389 for t in $CFG_TARGET_TRIPLES
390 do
391     for i in 0 1 2 3
392     do
393         # old-style "bin" dir
394         make_dir stage$i
395
396         # new-style bin dir, not yet used
397         make_dir stage$i/bin
398
399         # old-style non-arch libs
400         make_dir stage$i/lib
401
402         # new-style arch-prefixed libs, not yet used
403         make_dir stage$i/lib/rustc/$t
404     done
405 done
406
407 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
408
409 step_msg "complete"