summaryrefslogtreecommitdiffhomepage
path: root/scripts/vcvars.sh
blob: eb91d520a5a2c867cf21e80b2ce7cca276d61827 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# shellcheck shell=bash
#
# Sourcing this file should set up the appropriate environment for Visual Studio using vcvarsall.bat
#
# Currently, this script runs vcvarsall.bat and exports the following (after appropriate
# conversions):
# * PATH
# * INCLUDE

SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# shellcheck source=/dev/null
source "$SCRIPT_DIR/utils/host"

case $HOST in
    x86_64-pc-windows-msvc) HOST_TARGET=x64;;
    aarch64-pc-windows-msvc) HOST_TARGET=arm64;;
    *)
        log_error "Unexpected architecture: $HOST"
        exit 1
        ;;
esac

# Target architecture. Use the host architecture if unspecified.
TARGET=${TARGET:-"$HOST_TARGET"}

# Path to vcvarsall. This assumes that VS 2022 Community is available
VCVARSPATH="C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat"

if [[ ! -f "$VCVARSPATH" ]]; then
    echo -e "vcvarsall.bat not found. Please update the path in the script (${BASH_SOURCE[0]})"
    exit 1
fi

VCVARSENV=$(MSYS_NO_PATHCONV=1 MSYS2_ARG_CONV_EXCL='*' cmd.exe /c "$VCVARSPATH" "$TARGET" \>nul \& set)

declare -A vcenvmap

function populate_vcenvmap {
    while IFS='=' read -r key value; do
        vcenvmap[$key]=$value
    done <<< "$VCVARSENV"
}

function to_unix_path {
    # Converts a Windows-style PATH to a UNIX-style PATH
    # eg from "C:\1\2\3;C:\4\5\6" to "/c/1/2/3:/c/4/5/6"
    echo "$1" | sed -e 's|\([a-zA-Z]\):|\/\1|g' -e 's|\\|/|g' -e 's|;|:|g'
}

populate_vcenvmap

export INCLUDE="${vcenvmap["INCLUDE"]}"
PATH="$(to_unix_path "${vcenvmap["PATH"]}")"
export PATH

echo "Initialized VS environment for $TARGET"