]> git.lizzy.rs Git - rust.git/blob - configure
virtualize rustllvm construction per target triple
[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     echo "Useful environment variables:"
228     echo ""
229     printf "    %-32s %s\n" "CFG_LLVM_ROOT" "The host LLVM install"
230     printf "    %-32s %s\n" "CFG_PREFIX" "The installation prefix"
231     printf "    %-32s %s\n" "CFG_ONLY_GCC" "Prefer gcc to clang for building the runtime"
232     printf "    %-32s %s\n" "CFG_TARGET_TRIPLES" "LLVM target triples"
233     echo ""
234     exit 0
235 fi
236
237 step_msg "writing out basic parameters"
238 putvar CFG_SRC_DIR
239 putvar CFG_BUILD_DIR
240 putvar CFG_OSTYPE
241 putvar CFG_CPUTYPE
242 putvar CFG_CONFIGURE_ARGS
243
244 step_msg "looking for build programs"
245 probe_need CFG_PERL         perl
246 probe_need CFG_PYTHON       python
247 probe_need CFG_CURL         curl
248
249 probe CFG_GIT              git
250 probe CFG_CLANG            clang++
251 probe CFG_GCC              gcc
252 probe CFG_LLVM_CONFIG      llvm-config
253 probe CFG_VALGRIND         valgrind
254 probe CFG_PERF             perf
255 probe CFG_MAKEINFO         makeinfo
256 probe CFG_TEXI2PDF         texi2pdf
257 probe CFG_TEX              tex
258 probe CFG_MAKENSIS         makensis
259 probe CFG_NATURALDOCS      naturaldocs
260
261 if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
262 then
263     err "either clang or gcc is required"
264 fi
265
266 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
267 then
268     CFG_IN_TRANSITION=1
269     putvar CFG_IN_TRANSITION
270 fi
271
272 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
273 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
274 # errors.
275 if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
276 then
277     CFG_BAD_VALGRIND=1
278     putvar CFG_BAD_VALGRIND
279 fi
280
281 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
282 then
283     CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
284 fi
285
286 if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
287 then
288     CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
289     CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
290     CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
291     CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
292     CFG_LLVM_LDFLAGS=""
293     CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
294                     -name '*.lib' \
295                     -exec echo '\"{}\"' ';' \
296                     | xargs echo)
297     CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
298                        --version \
299                        | grep version \
300                        | cut -d ' ' -f 5-)
301     CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
302                       --version \
303                       | grep Host: \
304                       | cut -d ' ' -f 4-)
305 elif [ ! -z "$CFG_LLVM_CONFIG" ]
306 then
307     CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
308     CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
309     CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
310     CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
311     CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
312     CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
313     CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
314     CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
315 else
316     err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
317 \"llvm-config\" script must be present"
318 fi
319
320 case $CFG_LLVM_VERSION in
321     (3.0svn | 3.0 | 3.1svn)
322     step_msg "found ok version of LLVM: $CFG_LLVM_VERSION"
323     ;;
324     (*)
325     err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
326     ;;
327 esac
328
329 if [ ! -z "$CFG_CLANG" -a -z "$CFG_ONLY_GCC" ]
330 then
331     CFG_CLANG_VERSION=$("$CFG_CLANG" \
332                       --version \
333                       | grep version \
334                       | cut -d ' ' -f 3)
335
336     case $CFG_CLANG_VERSION in
337         (3.0svn | 3.0)
338         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
339         CFG_C_COMPILER="clang"
340         ;;
341         (*)
342         msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
343         CFG_C_COMPILER="gcc"
344         ;;
345     esac
346 else
347     CFG_C_COMPILER="gcc"
348 fi
349
350 if [ -z "$CFG_PREFIX" ]
351 then
352     CFG_PREFIX=/usr/local
353 fi
354
355 if [ ! -z "$CFG_LLVM_TRIPLE" ]
356 then
357     if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ]
358     then
359         warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from"
360         warn "detected host triple $CFG_HOST_TRIPLE"
361         warn "choosing LLVM host-triple instead"
362         msg ""
363         CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE
364     fi
365 fi
366
367 if [ -z "$CFG_TARGET_TRIPLES" ]
368 then
369     CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
370 fi
371
372 putvar CFG_HOST_TRIPLE
373 putvar CFG_TARGET_TRIPLES
374
375 putvar CFG_C_COMPILER
376 putvar CFG_PREFIX
377
378 putvar CFG_LLVM_ROOT
379 putvar CFG_LLVM_CONFIG
380 putvar CFG_LLVM_INCDIR
381 putvar CFG_LLVM_BINDIR
382 putvar CFG_LLVM_LIBDIR
383 putvar CFG_LLVM_CXXFLAGS
384 putvar CFG_LLVM_LDFLAGS
385 putvar CFG_LLVM_LIBS
386 putvar CFG_LLVM_TRIPLE
387
388 # Munge any paths that appear in config.mk back to posix-y
389 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
390                -e 's@\\@/@go;' config.mk
391 rm -f config.mk.bak
392
393 step_msg "making directories"
394 for i in \
395     doc doc/std \
396     nd nd/std \
397     dl \
398     test/run-pass test/run-fail test/compile-fail \
399     test/bench test/perf test/pretty
400 do
401     make_dir $i
402 done
403
404 make_dir rustllvm
405 for t in $CFG_TARGET_TRIPLES
406 do
407     make_dir rustllvm/$t
408 done
409
410 make_dir rt
411 for t in $CFG_TARGET_TRIPLES
412 do
413   make_dir rt/$t
414   for i in                                          \
415     isaac bigint sync test arch/i386 arch/x86_64    \
416     libuv libuv/src/ares libuv/src/eio libuv/src/ev
417   do
418     make_dir rt/$t/$i
419   done
420 done
421
422 for t in $CFG_TARGET_TRIPLES
423 do
424     for i in 0 1 2 3
425     do
426         # host bin dir
427         make_dir stage$i/bin
428
429         # host lib dir
430         make_dir stage$i/lib
431
432         # target bin dir
433         make_dir stage$i/lib/rustc/$t/bin
434
435         # target lib dir
436         make_dir stage$i/lib/rustc/$t/lib
437     done
438 done
439
440 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
441
442 step_msg "complete"