aboutsummaryrefslogtreecommitdiff
path: root/scripts/setup.sh
blob: ba6058b88ba62acbc5e763def4e1c1b52ace4017 (plain) (blame)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env bash
set -e

C_BOLD="\e[1;1m"
C_GREEN="\e[32m"
C_RED="\e[31m"
C_BLUE="\e[34m"
C_RESET="\e[0m"

has_exec() {
  which "$1" >/dev/null 2>&1 || return 1
}
fail() {
  printf "${C_RED}setup error${C_RESET}: %s\n" "$@"
  exit 1
}

LLVM_VERSION=16

# this compiler detection could be better
# it is copy pasted from ./env.sh
CC=${CC:-$(which clang-16 || which clang || which cc)}
CXX=${CXX:-$(which clang++-16 || which clang++ || which c++)}

test -n "$CC" || fail "missing LLVM $LLVM_VERSION (could not find clang)"
test -n "$CXX" || fail "missing LLVM $LLVM_VERSION (could not find clang++)"

for type in CC CXX; do
  compiler="${!type}"
  $(
    "$compiler" --version | grep "clang version ${LLVM_VERSION}." >/dev/null 2>&1
  ) || fail "LLVM ${LLVM_VERSION} is required. Detected $type as '$compiler'"
done

has_exec "bun" || fail "you need an existing copy of 'bun' in your path to build bun"
has_exec "cmake" || fail "'cmake' is missing"
has_exec "ninja" || fail "'ninja' is missing"
$(
  has_exec "rustc" \
  && (test $(cargo --version | awk '{print $2}' | cut -d. -f2) -gt 57) \
  && has_exec "cargo"
) || fail "Rust and Cargo version must be installed (minimum version 1.57)"
has_exec "go" || fail "'go' is missing"

has_exec "pkg-config" || fail "'pkg-config' is missing"
has_exec "automake" || fail "'automake' is missing"
has_exec "perl" || fail "'perl' is missing"
has_exec "ruby" || fail "'ruby' is missing"

rm -f .vscode/clang++
ln -s "$CXX" .vscode/clang++

printf "All system dependencies OK\n"
printf "C Compiler for dependencies: ${CC}\n"
printf "C++ Compiler for dependencies: ${CXX}\n"

cd "$(dirname "${BASH_SOURCE[0]}")"
bash ./update-submodules.sh
bash ./all-dependencies.sh

cd ../

bun i

# TODO(@paperdave): do not use the Makefile please
make runtime_js fallback_decoder bun_error node-fallbacks

mkdir -p build
rm -f build/CMakeCache.txt
cmake -B build -S . -DCMAKE_BUILD_TYPE=Debug -G Ninja -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX"
ninja -C build

printf "Checking if built bun functions\n"
BUN_VERSION=$(BUN_DEBUG_QUIET_LOGS=1 ./build/bun-debug --version)

printf "\n"
printf "🎉 ${C_GREEN}${C_BOLD}Development environment setup complete!${C_RESET}\n"
printf "${C_BLUE}bun v${BUN_VERSION} is located at ./build/bun-debug${C_RESET}\n"

if has_exec bun-debug; then
  bun_is_at=$(which bun-debug)
  if [ "$(realpath "$bun_is_at")" != "$(realpath "./build/bun-debug")" ]; then
    printf "\n"
    printf "${C_RED}"'Your $PATH is not configured correctly!\n'"${C_RESET}"
    printf "\n"
    printf "which bun-debug --> %s\n" "${bun_is_at}"
    printf "\n"
    printf "You should remove this binary and switch it to ./build:\n"
    printf '  export PATH="$PATH:%s"\n' $(realpath "$PWD/build")
  fi
else
  printf "\n"
  printf "You should add ./build to your path:\n"
  printf '  export PATH="$PATH:%s"\n' $(realpath "$PWD/build")
fi
printf "\n"
printf "To rebuild bun, run '${C_GREEN}bun run build${C_RESET}'\n\n"