configure 9.1 KB
Newer Older
1 2
#!/bin/sh

3 4 5
msg() {
    echo "configure: $1"
}
6

7 8 9 10 11 12
step_msg() {
    msg
    msg "$1"
    msg
}

13 14 15 16
warn() {
    echo "configure: WARNING: $1"
}

17 18 19 20 21
err() {
    echo "configure: error: $1"
    exit 1
}

22 23 24 25 26 27 28 29

need_cmd() {
    if which $1 >/dev/null 2>&1
    then msg "found $1"
    else err "need $1"
    fi
}

30 31 32 33 34 35 36 37 38
make_dir() {
    if [ ! -d $1 ]
    then
        msg "mkdir -p $1"
        mkdir -p $1
    fi
}

copy() {
39
    msg "cp $1 $2"
40 41
    cp $1 $2
}
42

43 44 45
putvar() {
    local T
    eval T=\$$1
46 47 48 49 50 51 52
    eval TLEN=\${#$1}
    if [ $TLEN -gt 35 ]
    then
        printf "configure: %-20s := %.35s ...\n" $1 "$T"
    else
        printf "configure: %-20s := %s\n" $1 "$T"
    fi
53
    printf "%-20s := %s\n" $1 "$T" >>config.mk
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
}

probe() {
    local V=$1
    local P=$2
    local T
    T=$(which $P 2>&1)
    if [ $? -ne 0 ]
    then
        T=""
    fi
    eval $V=\$T
    putvar $V
}

69 70 71
probe_need() {
    local V=$1
    local P=$2
G
Graydon Hoare 已提交
72
    probe $V $P
73 74 75 76 77 78 79
    eval VV=\$$V
    if [ -z "$VV" ]
    then
        err "required program '$P' not found"
    fi
}

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
opt() {
    local OP=$1
    local DEFAULT=$2
    shift
    shift
    local DOC="$*"
    local FLAG=""

    if [ $DEFAULT -eq 0 ]
    then
        FLAG="enable"
    else
        FLAG="disable"
        DOC="don't $DOC"
    fi

    if [ $HELP -eq 0 ]
    then
        for arg in $CFG_CONFIGURE_ARGS
        do
            if [ "$arg" = "--${FLAG}-${OP}" ]
            then
102
                OP=$(echo $OP | tr 'a-z-' 'A-Z_')
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
                FLAG=$(echo $FLAG | tr 'a-z' 'A-Z')
                local V="CFG_${FLAG}_${OP}"
                eval $V=1
                putvar $V
            fi
        done
    else
        if [ ! -z "$META" ]
        then
            OP="$OP=<$META>"
        fi
        printf "    --%-30s %s\n" "$FLAG-$OP" "$DOC"
     fi
}

118 119 120
msg "looking for configure programs"
need_cmd mkdir
need_cmd printf
121 122 123 124 125
need_cmd cut
need_cmd grep
need_cmd xargs
need_cmd cp
need_cmd find
126 127
need_cmd uname
need_cmd date
G
Graydon Hoare 已提交
128
need_cmd tr
P
Patrick Walton 已提交
129
need_cmd sed
130 131 132 133 134

msg "inspecting environment"

CFG_OSTYPE=$(uname -s)
CFG_CPUTYPE=$(uname -m)
135

136 137 138 139 140 141 142 143 144
if [ $CFG_OSTYPE = Darwin -a $CFG_CPUTYPE = i386 ]
then
    # Darwin's `uname -s` lies and always returns i386. We have to use sysctl
    # instead.
    if sysctl hw.optional.x86_64 | grep ': 1'
    then
        CFG_CPUTYPE=x86_64
    fi
fi
145

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193

# The goal here is to come up with the same triple as LLVM would,
# at least for the subset of platforms we're willing to target.

case $CFG_OSTYPE in

    Linux)
        CFG_OSTYPE=unknown-linux-gnu
        ;;

    FreeBSD)
        CFG_OSTYPE=unknown-freebsd
        ;;

    Darwin)
        CFG_OSTYPE=apple-darwin
        ;;

    MINGW32*)
        CFG_OSTYPE=pc-mingw32
        ;;

    *)
        err "unknown OS type: $CFG_OSTYPE"
        ;;
esac


case $CFG_CPUTYPE in

    i386 | i486 | i686 | i786 | x86)
        CFG_CPUTYPE=i686
        ;;

    xscale | arm)
        CFG_CPUTYPE=arm
        ;;

    x86_64 | x86-64 | x64)
        CFG_CPUTYPE=x86_64
        ;;

    *)
        err "unknown CPU type: $CFG_CPUTYPE"
esac

CFG_HOST_TRIPLE="${CFG_CPUTYPE}-${CFG_OSTYPE}"

194
CFG_SELF=$(echo $0 | tr '\\' '/')
G
Graydon Hoare 已提交
195
CFG_SRC_DIR=${CFG_SELF%${CFG_SELF##*/}}
196
CFG_BUILD_DIR=$(echo $PWD | tr '\\' '/')
197 198
CFG_CONFIGURE_ARGS="$@"

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
OPTIONS=""
HELP=0
if [ "$1" = "--help" ]
then
    HELP=1
    shift
    echo ""
    echo "Usage: $CFG_SELF [options]"
    echo ""
    echo "Options:"
    echo ""
else
    msg "recreating config.mk"
    echo '' >config.mk

    step_msg "processing $CFG_SELF args"
fi
216

217
opt sharedstd 1 "build libstd as a shared library"
218 219
opt valgrind 1 "run tests with valgrind"
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 225


if [ $HELP -eq 1 ]
then
226 227 228 229 230
    echo ""
    echo "Useful environment variables:"
    echo ""
    printf "    %-32s %s\n" "CFG_LLVM_ROOT" "The host LLVM install"
    printf "    %-32s %s\n" "CFG_PREFIX" "The installation prefix"
B
Brian Anderson 已提交
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 234 235
    echo ""
    exit 0
fi
236

237
step_msg "writing out basic parameters"
238 239 240 241
putvar CFG_SRC_DIR
putvar CFG_BUILD_DIR
putvar CFG_OSTYPE
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 256
probe CFG_MAKEINFO         makeinfo
probe CFG_TEXI2PDF         texi2pdf
257
probe CFG_TEX              tex
258
probe CFG_MAKENSIS         makensis
B
Brian Anderson 已提交
259
probe CFG_NATURALDOCS      naturaldocs
260

261 262 263 264 265
if [ -z "$CFG_CLANG" -a -z "$CFG_GCC" ]
then
    err "either clang or gcc is required"
fi

266 267 268 269 270 271
if head -n 1 ${CFG_SRC_DIR}src/snapshots.txt | grep -q '^T'
then
    CFG_IN_TRANSITION=1
    putvar CFG_IN_TRANSITION
fi

272 273 274
# Valgrind is only reliable on Linux. On Windows it doesn't work at all, and
# on the Mac the dynamic linker causes Valgrind to emit a huge stream of
# errors.
275
if [ $CFG_OSTYPE != unknown-linux-gnu ] && [ $CFG_OSTYPE != apple-darwin ]
276 277 278 279 280
then
    CFG_BAD_VALGRIND=1
    putvar CFG_BAD_VALGRIND
fi

281 282 283 284 285 286
if [ ! -z "$CFG_LLVM_ROOT" -a -e "$CFG_LLVM_ROOT/bin/llvm-config" ]
then
    CFG_LLVM_CONFIG="$CFG_LLVM_ROOT/bin/llvm-config"
fi

if [ ! -z "$CFG_LLVM_ROOT" -a -z "$CFG_LLVM_CONFIG" ]
287 288 289 290 291 292
then
    CFG_LLVM_INCDIR="$CFG_LLVM_ROOT/include"
    CFG_LLVM_BINDIR="$CFG_LLVM_ROOT/bin"
    CFG_LLVM_LIBDIR="$CFG_LLVM_ROOT/lib"
    CFG_LLVM_CXXFLAGS="-I$CFG_LLVM_INCDIR"
    CFG_LLVM_LDFLAGS=""
293 294 295 296 297 298 299 300
    CFG_LLVM_LIBS=$(find "$CFG_LLVM_LIBDIR" \
                    -name '*.lib' \
                    -exec echo '\"{}\"' ';' \
                    | xargs echo)
    CFG_LLVM_VERSION=$("$CFG_LLVM_BINDIR/llc" \
                       --version \
                       | grep version \
                       | cut -d ' ' -f 5-)
P
Patrick Walton 已提交
301
    CFG_LLVM_TRIPLE=$("$CFG_LLVM_BINDIR/llc" \
302 303 304
                      --version \
                      | grep Host: \
                      | cut -d ' ' -f 4-)
305
elif [ ! -z "$CFG_LLVM_CONFIG" ]
306
then
307 308 309 310 311 312 313 314
    CFG_LLVM_VERSION=$($CFG_LLVM_CONFIG --version)
    CFG_LLVM_INCDIR=$($CFG_LLVM_CONFIG --includedir)
    CFG_LLVM_BINDIR=$($CFG_LLVM_CONFIG --bindir)
    CFG_LLVM_LIBDIR=$($CFG_LLVM_CONFIG --libdir)
    CFG_LLVM_CXXFLAGS=$($CFG_LLVM_CONFIG --cxxflags)
    CFG_LLVM_LDFLAGS=$($CFG_LLVM_CONFIG --ldflags)
    CFG_LLVM_LIBS=$($CFG_LLVM_CONFIG --libs)
    CFG_LLVM_TRIPLE=$($CFG_LLVM_CONFIG --host-target)
315 316
else
    err "either the \"CFG_LLVM_ROOT\" environment variable must be set, or a \
317
\"llvm-config\" script must be present"
318 319
fi

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 326 327 328
    ;;
    (*)
    err "bad LLVM version: $CFG_LLVM_VERSION, need >=3.0svn"
    ;;
esac

329
if [ ! -z "$CFG_CLANG" -a -z "$CFG_ONLY_GCC" ]
330 331 332 333 334 335 336 337 338
then
    CFG_CLANG_VERSION=$("$CFG_CLANG" \
                      --version \
                      | grep version \
                      | cut -d ' ' -f 3)

    case $CFG_CLANG_VERSION in
        (3.0svn | 3.0)
        step_msg "found ok version of CLANG: $CFG_CLANG_VERSION"
339
        CFG_C_COMPILER="clang"
340 341
        ;;
        (*)
342 343
        msg "bad CLANG version: $CFG_CLANG_VERSION, need >=3.0svn; disabling"
        CFG_C_COMPILER="gcc"
344 345
        ;;
    esac
346 347
else
    CFG_C_COMPILER="gcc"
348
fi
349

350 351 352 353 354
if [ -z "$CFG_PREFIX" ]
then
    CFG_PREFIX=/usr/local
fi

355 356 357 358 359 360 361 362 363 364 365 366
if [ ! -z "$CFG_LLVM_TRIPLE" ]
then
    if [ $CFG_HOST_TRIPLE != $CFG_LLVM_TRIPLE ]
    then
        warn "LLVM host-triple $CFG_LLVM_TRIPLE differs from"
        warn "detected host triple $CFG_HOST_TRIPLE"
        warn "choosing LLVM host-triple instead"
        msg ""
        CFG_HOST_TRIPLE=$CFG_LLVM_TRIPLE
    fi
fi

367 368 369 370
if [ -z "$CFG_TARGET_TRIPLES" ]
then
    CFG_TARGET_TRIPLES="${CFG_HOST_TRIPLE}"
fi
371 372 373 374

putvar CFG_HOST_TRIPLE
putvar CFG_TARGET_TRIPLES

375
putvar CFG_C_COMPILER
376
putvar CFG_PREFIX
377

378
putvar CFG_LLVM_ROOT
379
putvar CFG_LLVM_CONFIG
380 381
putvar CFG_LLVM_INCDIR
putvar CFG_LLVM_BINDIR
G
Graydon Hoare 已提交
382
putvar CFG_LLVM_LIBDIR
383 384 385
putvar CFG_LLVM_CXXFLAGS
putvar CFG_LLVM_LDFLAGS
putvar CFG_LLVM_LIBS
P
Patrick Walton 已提交
386
putvar CFG_LLVM_TRIPLE
387

388
# Munge any paths that appear in config.mk back to posix-y
G
Graydon Hoare 已提交
389
perl -i.bak -p -e 's@ ([a-zA-Z]):[/\\]@ /\1/@go;' \
390 391 392
               -e 's@\\@/@go;' config.mk
rm -f config.mk.bak

393 394
step_msg "making directories"
for i in \
395 396
    doc doc/std \
    nd nd/std \
397
    dl \
398 399 400 401 402 403
    test/run-pass test/run-fail test/compile-fail \
    test/bench test/perf test/pretty
do
    make_dir $i
done

404 405 406 407 408 409
make_dir rustllvm
for t in $CFG_TARGET_TRIPLES
do
    make_dir rustllvm/$t
done

410 411 412 413 414 415 416 417 418 419 420 421
make_dir rt
for t in $CFG_TARGET_TRIPLES
do
  make_dir rt/$t
  for i in                                          \
    isaac bigint sync test arch/i386 arch/x86_64    \
    libuv libuv/src/ares libuv/src/eio libuv/src/ev
  do
    make_dir rt/$t/$i
  done
done

422 423 424 425
for t in $CFG_TARGET_TRIPLES
do
    for i in 0 1 2 3
    do
426
        # host bin dir
427 428
        make_dir stage$i/bin

429
        # host lib dir
430 431
        make_dir stage$i/lib

432 433 434 435 436
        # target bin dir
        make_dir stage$i/lib/rustc/$t/bin

        # target lib dir
        make_dir stage$i/lib/rustc/$t/lib
437 438 439
    done
done

440
copy ${CFG_SRC_DIR}Makefile.in ./Makefile
441

442
step_msg "complete"