]> git.lizzy.rs Git - rust.git/blob - configure
Fuzzer: first steps of making steal_exprs more generic
[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 test/bench test/pretty
187 do
188     make_dir $i
189 done
190
191 step_msg "writing out basic parameters"
192 putvar CFG_SRC_DIR
193 putvar CFG_BUILD_DIR
194 putvar CFG_OSTYPE
195 putvar CFG_CPUTYPE
196 putvar CFG_CONFIGURE_ARGS
197
198 step_msg "looking for build programs"
199 probe_need CFG_PERL         perl
200 probe_need CFG_PYTHON       python
201 probe_need CFG_CURL         curl
202
203 probe CFG_GIT              git
204 probe CFG_CLANG            clang++
205 probe CFG_GCC              gcc
206 probe CFG_LLVM_CONFIG      llvm-config
207 probe CFG_VALGRIND         valgrind
208 probe CFG_MAKEINFO         makeinfo
209 probe CFG_TEXI2PDF         texi2pdf
210 probe CFG_TEX              tex
211 probe CFG_MAKENSIS         makensis
212
213 if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
214 then
215     err "either clang or gcc is required"
216 fi
217
218 if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
219 then
220     CFG_IN_TRANSITION=1
221     putvar CFG_IN_TRANSITION
222 fi
223
224 # Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
225 # on the Mac the dynamic linker causes Valgrind to emit a huge stream of
226 # errors.
227 if [ $CFG_OSTYPE != Linux ] && [ $CFG_OSTYPE != Darwin ]
228 then
229     CFG_BAD_VALGRIND=1
230     putvar CFG_BAD_VALGRIND
231 fi
232
233 if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
234 then
235     CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
236 fi
237
238 if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
239 then
240     CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
241     CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
242     CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
243     CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
244     CFG_LLVM_LDFLAGS=""
245     CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
246                     -name '*.lib' \
247                     -exec echo '\"{}\"' ';' \
248                     | xargs echo)
249     CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
250                        --version \
251                        | grep version \
252                        | cut -d ' ' -f 5-)
253     CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
254                       --version \
255                       | grep Host: \
256                       | cut -d ' ' -f 4-)
257 elif [ ! -z "$CFG_LLVM_CONFIG" ]
258 then
259     CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
260     CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
261     CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
262     CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
263     CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
264     CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
265     CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
266     CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
267 else
268     err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
269 \"llvm-config\" script must be present"
270 fi
271
272 case $CFG_LLVM_VERSION in
273     (3.0svn | 3.0)
274     step_msg "found ok version of LLVM: $CFG_LLVM_VERSION"
275     ;;
276     (*)
277     err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
278     ;;
279 esac
280
281 if [ ! -z "$CFG_CLANG" ]
282 then
283     CFG_CLANG_VERSION=$("$CFG_CLANG" \
284                       --version \
285                       | grep version \
286                       | cut -d ' ' -f 3)
287
288     case $CFG_CLANG_VERSION in
289         (3.0svn | 3.0)
290         step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
291         CFG_C_COMPILER="clang"
292         ;;
293         (*)
294         msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
295         CFG_C_COMPILER="gcc"
296         ;;
297     esac
298 else
299     CFG_C_COMPILER="gcc"
300 fi
301 putvar CFG_C_COMPILER
302
303 putvar CFG_LLVM_ROOT
304 putvar CFG_LLVM_INCDIR
305 putvar CFG_LLVM_BINDIR
306 putvar CFG_LLVM_LIBDIR
307 putvar CFG_LLVM_CXXFLAGS
308 putvar CFG_LLVM_LDFLAGS
309 putvar CFG_LLVM_LIBS
310 putvar CFG_LLVM_TRIPLE
311
312 # Munge any paths that appear in config.mk back to posix-y
313 perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
314                -e 's@\\@/@go;' config.mk
315 rm -f config.mk.bak
316
317 copy ${CFG_SRC_DIR}Makefile.in ./Makefile
318
319 copy ${CFG_SRC_DIR}src/rt/libuv/Makefile rt/libuv/Makefile
320 copy ${CFG_SRC_DIR}src/rt/libuv/config-unix.mk rt/libuv/config-unix.mk
321 copy ${CFG_SRC_DIR}src/rt/libuv/config-mingw.mk rt/libuv/config-mingw.mk
322
323 step_msg "complete"