]> git.lizzy.rs Git - rust.git/blob - configure
Add another testcase for #910
[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 err() {
14     echo "configure: error: $1"
15     exit 1
16 }
17
18
19 need_cmd() {
20     if which $1 >/dev/null 2>&1
21     then msg "found $1"
22     else err "need $1"
23     fi
24 }
25
26 make_dir() {
27     if [ ! -d $1 ]
28     then
29         msg "mkdir -p $1"
30         mkdir -p $1
31     fi
32 }
33
34 copy() {
35     msg "cp $1 $2"
36     cp $1 $2
37 }
38
39 putvar() {
40     local T
41     eval T=\$$1
42     eval TLEN=\${#$1}
43     if [ $TLEN -gt 35 ]
44     then
45         printf "configure: %-20s := %.35s ...\n" $1 "$T"
46     else
47         printf "configure: %-20s := %s\n" $1 "$T"
48     fi
49     printf "%-20s := %s\n" $1 "$T" >>config.mk
50 }
51
52 probe() {
53     local V=$1
54     local P=$2
55     local T
56     T=$(which $P 2>&1)
57     if [ $? -ne 0 ]
58     then
59         T=""
60     fi
61     eval $V=\$T
62     putvar $V
63 }
64
65 probe_need() {
66     local V=$1
67     local P=$2
68     probe $V $P
69     eval VV=\$$V
70     if [ -z "$VV" ]
71     then
72         err "required program '$P' not found"
73     fi
74 }
75
76 opt() {
77     local OP=$1
78     local DEFAULT=$2
79     shift
80     shift
81     local DOC="$*"
82     local FLAG=""
83
84     if [ $DEFAULT -eq 0 ]
85     then
86         FLAG="enable"
87     else
88         FLAG="disable"
89         DOC="don't $DOC"
90     fi
91
92     if [ $HELP -eq 0 ]
93     then
94         for arg in $CFG_CONFIGURE_ARGS
95         do
96             if [ "$arg" = "--${FLAG}-${OP}" ]
97             then
98                 OP=$(echo $OP | tr 'a-z-' 'A-Z_')
99                 FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
100                 local V="CFG_${FLAG}_${OP}"
101                 eval $V=1
102                 putvar $V
103             fi
104         done
105     else
106         if [ ! -z "$META" ]
107         then
108             OP="$OP=<$META>"
109         fi
110         printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
111      fi
112 }
113
114 msg "looking for configure programs"
115 need_cmd mkdir
116 need_cmd printf
117 need_cmd cut
118 need_cmd grep
119 need_cmd xargs
120 need_cmd cp
121 need_cmd find
122 need_cmd uname
123 need_cmd date
124 need_cmd tr
125 need_cmd sed
126
127 msg "inspecting environment"
128
129 CFG_OSTYPE=$(uname -s)
130
131 CFG_CPUTYPE=$(uname -m)
132 if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
133 then
134     # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
135     # instead.
136     if sysctl hw.optional.x86_64 | grep ': 1'
137     then
138         CFG_CPUTYPE=x86_64
139     fi
140 fi
141
142 CFG_SELF=$(echo $0 | tr '\\' '/')
143 CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
144 CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
145 CFG_CONFIGURE_ARGS="$@"
146
147 OPTIONS=""
148 HELP=0
149 if [ "$1" = "--help" ]
150 then
151     HELP=1
152     shift
153     echo ""
154     echo "Usage: $CFG_SELF [options]"
155     echo ""
156     echo "Options:"
157     echo ""
158 else
159     msg "recreating config.mk"
160     echo '' >config.mk
161
162     step_msg "processing $CFG_SELF args"
163 fi
164
165 opt sharedstd 1 "build libstd as a shared library"
166 opt valgrind 1 "run tests with valgrind"
167 opt docs     1 "build documentation"
168 opt optimize 1 "build optimized rust code"
169 opt mingw-cross 0 "cross-compile for win32 using mingw"
170
171
172 if [ $HELP -eq 1 ]
173 then
174     echo ""
175     exit 0
176 fi
177
178 step_msg "making directories"
179 for i in \
180     doc \
181     rt rt/isaac rt/bigint rt/sync rt/test rt/arch/i386 \
182     rt/libuv rt/libuv/src/ares rt/libuv/src/eio rt/libuv/src/ev \
183     rustllvm \
184     dl stage0 stage1 stage2 stage3 \
185     stage0/lib stage1/lib stage2/lib stage3/lib \
186     test/run-pass test/run-fail test/compile-fail \
187     test/bench test/perf test/pretty
188 do
189     make_dir $i
190 done
191
192 step_msg "writing out basic parameters"
193 putvar CFG_SRC_DIR
194 putvar CFG_BUILD_DIR
195 putvar CFG_OSTYPE
196 putvar CFG_CPUTYPE
197 putvar CFG_CONFIGURE_ARGS
198
199 step_msg "looking for build programs"
200 probe_need CFG_PERL         perl
201 probe_need CFG_PYTHON       python
202 probe_need CFG_CURL         curl
203
204 probe CFG_GIT              git
205 probe CFG_CLANG            clang++
206 probe CFG_GCC              gcc
207 probe CFG_LLVM_CONFIG      llvm-config
208 probe CFG_VALGRIND         valgrind
209 probe CFG_PERF             perf
210 probe CFG_MAKEINFO         makeinfo
211 probe CFG_TEXI2PDF         texi2pdf
212 probe CFG_TEX              tex
213 probe CFG_MAKENSIS         makensis
214
215 if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
216 then
217     err "either clang or gcc is required"
218 fi
219
220 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
221 then
222     CFG_IN_TRANSITION=1
223     putvar CFG_IN_TRANSITION
224 fi
225
226 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
227 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
228 # errors.
229 if [ $CFG_OSTYPE != Linux ] && [ $CFG_OSTYPE != Darwin ]
230 then
231     CFG_BAD_VALGRIND=1
232     putvar CFG_BAD_VALGRIND
233 fi
234
235 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
236 then
237     CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
238 fi
239
240 if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
241 then
242     CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
243     CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
244     CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
245     CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
246     CFG_LLVM_LDFLAGS=""
247     CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
248                     -name '*.lib' \
249                     -exec echo '\"{}\"' ';' \
250                     | xargs echo)
251     CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
252                        --version \
253                        | grep version \
254                        | cut -d ' ' -f 5-)
255     CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
256                       --version \
257                       | grep Host: \
258                       | cut -d ' ' -f 4-)
259 elif [ ! -z "$CFG_LLVM_CONFIG" ]
260 then
261     CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
262     CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
263     CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
264     CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
265     CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
266     CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
267     CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
268     CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
269 else
270     err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
271 \"llvm-config\" script must be present"
272 fi
273
274 case $CFG_LLVM_VERSION in
275     (3.0svn | 3.0)
276     step_msg "found ok version of LLVM: $CFG_LLVM_VERSION"
277     ;;
278     (*)
279     err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
280     ;;
281 esac
282
283 if [ ! -z "$CFG_CLANG" ]
284 then
285     CFG_CLANG_VERSION=$("$CFG_CLANG" \
286                       --version \
287                       | grep version \
288                       | cut -d ' ' -f 3)
289
290     case $CFG_CLANG_VERSION in
291         (3.0svn | 3.0)
292         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
293         CFG_C_COMPILER="clang"
294         ;;
295         (*)
296         msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
297         CFG_C_COMPILER="gcc"
298         ;;
299     esac
300 else
301     CFG_C_COMPILER="gcc"
302 fi
303 putvar CFG_C_COMPILER
304
305 putvar CFG_LLVM_ROOT
306 putvar CFG_LLVM_INCDIR
307 putvar CFG_LLVM_BINDIR
308 putvar CFG_LLVM_LIBDIR
309 putvar CFG_LLVM_CXXFLAGS
310 putvar CFG_LLVM_LDFLAGS
311 putvar CFG_LLVM_LIBS
312 putvar CFG_LLVM_TRIPLE
313
314 # Munge any paths that appear in config.mk back to posix-y
315 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
316                -e 's@\\@/@go;' config.mk
317 rm -f config.mk.bak
318
319 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
320
321 copy ${CFG_SRC_DIR}src/rt/libuv/Makefile rt/libuv/Makefile
322 copy ${CFG_SRC_DIR}src/rt/libuv/config-unix.mk rt/libuv/config-unix.mk
323 copy ${CFG_SRC_DIR}src/rt/libuv/config-mingw.mk rt/libuv/config-mingw.mk
324
325 step_msg "complete"