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