xref: /freebsd/contrib/jemalloc/scripts/windows/before_install.sh (revision c43cad87172039ccf38172129c79755ea79e6102)
1*c43cad87SWarner Losh#!/bin/bash
2*c43cad87SWarner Losh
3*c43cad87SWarner Loshset -e
4*c43cad87SWarner Losh
5*c43cad87SWarner Losh# The purpose of this script is to install build dependencies and set
6*c43cad87SWarner Losh# $build_env to a function that sets appropriate environment variables,
7*c43cad87SWarner Losh# to enable (mingw32|mingw64) environment if we want to compile with gcc, or
8*c43cad87SWarner Losh# (mingw32|mingw64) + vcvarsall.bat if we want to compile with cl.exe
9*c43cad87SWarner Losh
10*c43cad87SWarner Loshif [[ "$TRAVIS_OS_NAME" != "windows" ]]; then
11*c43cad87SWarner Losh    echo "Incorrect \$TRAVIS_OS_NAME: expected windows, got $TRAVIS_OS_NAME"
12*c43cad87SWarner Losh    exit 1
13*c43cad87SWarner Loshfi
14*c43cad87SWarner Losh
15*c43cad87SWarner Losh[[ ! -f C:/tools/msys64/msys2_shell.cmd ]] && rm -rf C:/tools/msys64
16*c43cad87SWarner Loshchoco uninstall -y mingw
17*c43cad87SWarner Loshchoco upgrade --no-progress -y msys2
18*c43cad87SWarner Losh
19*c43cad87SWarner Loshmsys_shell_cmd="cmd //C RefreshEnv.cmd && set MSYS=winsymlinks:nativestrict && C:\\tools\\msys64\\msys2_shell.cmd"
20*c43cad87SWarner Losh
21*c43cad87SWarner Loshmsys2() { $msys_shell_cmd -defterm -no-start -msys2 -c "$*"; }
22*c43cad87SWarner Loshmingw32() { $msys_shell_cmd -defterm -no-start -mingw32 -c "$*"; }
23*c43cad87SWarner Loshmingw64() { $msys_shell_cmd -defterm -no-start -mingw64 -c "$*"; }
24*c43cad87SWarner Losh
25*c43cad87SWarner Loshif [[ "$CROSS_COMPILE_32BIT" == "yes" ]]; then
26*c43cad87SWarner Losh    mingw=mingw32
27*c43cad87SWarner Losh    mingw_gcc_package_arch=i686
28*c43cad87SWarner Loshelse
29*c43cad87SWarner Losh    mingw=mingw64
30*c43cad87SWarner Losh    mingw_gcc_package_arch=x86_64
31*c43cad87SWarner Loshfi
32*c43cad87SWarner Losh
33*c43cad87SWarner Loshif [[ "$CC" == *"gcc"* ]]; then
34*c43cad87SWarner Losh    $mingw pacman -S --noconfirm --needed \
35*c43cad87SWarner Losh        autotools \
36*c43cad87SWarner Losh        git \
37*c43cad87SWarner Losh        mingw-w64-${mingw_gcc_package_arch}-make \
38*c43cad87SWarner Losh	    mingw-w64-${mingw_gcc_package_arch}-gcc \
39*c43cad87SWarner Losh	    mingw-w64-${mingw_gcc_package_arch}-binutils
40*c43cad87SWarner Losh    build_env=$mingw
41*c43cad87SWarner Loshelif [[ "$CC" == *"cl"* ]]; then
42*c43cad87SWarner Losh    $mingw pacman -S --noconfirm --needed \
43*c43cad87SWarner Losh        autotools \
44*c43cad87SWarner Losh	    git \
45*c43cad87SWarner Losh	    mingw-w64-${mingw_gcc_package_arch}-make \
46*c43cad87SWarner Losh	    mingw-w64-${mingw_gcc_package_arch}-binutils
47*c43cad87SWarner Losh
48*c43cad87SWarner Losh    # In order to use MSVC compiler (cl.exe), we need to correctly set some environment
49*c43cad87SWarner Losh    # variables, namely PATH, INCLUDE, LIB and LIBPATH. The correct values of these
50*c43cad87SWarner Losh    # variables are set by a batch script "vcvarsall.bat". The code below generates
51*c43cad87SWarner Losh    # a batch script that calls "vcvarsall.bat" and prints the environment variables.
52*c43cad87SWarner Losh    #
53*c43cad87SWarner Losh    # Then, those environment variables are transformed from cmd to bash format and put
54*c43cad87SWarner Losh    # into a script $apply_vsenv. If cl.exe needs to be used from bash, one can
55*c43cad87SWarner Losh    # 'source $apply_vsenv' and it will apply the environment variables needed for cl.exe
56*c43cad87SWarner Losh    # to be located and function correctly.
57*c43cad87SWarner Losh    #
58*c43cad87SWarner Losh    # At last, a function "mingw_with_msvc_vars" is generated which forwards user input
59*c43cad87SWarner Losh    # into a correct mingw (32 or 64) subshell that automatically performs 'source $apply_vsenv',
60*c43cad87SWarner Losh    # making it possible for autotools to discover and use cl.exe.
61*c43cad87SWarner Losh    vcvarsall="vcvarsall.tmp.bat"
62*c43cad87SWarner Losh    echo "@echo off" > $vcvarsall
63*c43cad87SWarner Losh    echo "call \"c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\\\vcvarsall.bat\" $USE_MSVC" >> $vcvarsall
64*c43cad87SWarner Losh    echo "set" >> $vcvarsall
65*c43cad87SWarner Losh
66*c43cad87SWarner Losh    apply_vsenv="./apply_vsenv.sh"
67*c43cad87SWarner Losh    cmd //C $vcvarsall | grep -E "^PATH=" | sed -n -e 's/\(.*\)=\(.*\)/export \1=$PATH:"\2"/g' \
68*c43cad87SWarner Losh        -e 's/\([a-zA-Z]\):[\\\/]/\/\1\//g' \
69*c43cad87SWarner Losh        -e 's/\\/\//g' \
70*c43cad87SWarner Losh        -e 's/;\//:\//gp' > $apply_vsenv
71*c43cad87SWarner Losh    cmd //C $vcvarsall | grep -E "^(INCLUDE|LIB|LIBPATH)=" | sed -n -e 's/\(.*\)=\(.*\)/export \1="\2"/gp' >> $apply_vsenv
72*c43cad87SWarner Losh
73*c43cad87SWarner Losh    cat $apply_vsenv
74*c43cad87SWarner Losh    mingw_with_msvc_vars() { $msys_shell_cmd -defterm -no-start -$mingw -c "source $apply_vsenv && ""$*"; }
75*c43cad87SWarner Losh    build_env=mingw_with_msvc_vars
76*c43cad87SWarner Losh
77*c43cad87SWarner Losh    rm -f $vcvarsall
78*c43cad87SWarner Loshelse
79*c43cad87SWarner Losh    echo "Unknown C compiler: $CC"
80*c43cad87SWarner Losh    exit 1
81*c43cad87SWarner Loshfi
82*c43cad87SWarner Losh
83*c43cad87SWarner Loshecho "Build environment function: $build_env"
84