|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +set -e |
| 4 | + |
| 5 | +if [ ! -d "toolchains" ]; then |
| 6 | + mkdir -p toolchains |
| 7 | +fi |
| 8 | + |
| 9 | +export EMSCRIPTEN_ROOT="$(pwd)/toolchains/emsdk" |
| 10 | + |
| 11 | +if [ ! -d "$EMSCRIPTEN_ROOT" ]; then |
| 12 | + git clone https://github.com/emscripten-core/emsdk.git "$EMSCRIPTEN_ROOT" |
| 13 | +fi |
| 14 | + |
| 15 | +"$EMSCRIPTEN_ROOT/emsdk" install latest |
| 16 | +"$EMSCRIPTEN_ROOT/emsdk" activate latest |
| 17 | + |
| 18 | +EMSCRIPTEN_UPSTREAM_ROOT="$EMSCRIPTEN_ROOT/upstream/emscripten" |
| 19 | + |
| 20 | +EMSCRIPTEN_PACTH_FILE="$EMSCRIPTEN_UPSTREAM_ROOT/.patched_manually.meta" |
| 21 | + |
| 22 | +PATCH_DIR="platforms/emscripten" |
| 23 | + |
| 24 | +if ! [ -e "$EMSCRIPTEN_PACTH_FILE" ]; then |
| 25 | + ##TODO: upstream those patches |
| 26 | + # see: https://github.com/emscripten-core/emscripten/pull/18379/commits |
| 27 | + # and: https://github.com/emscripten-core/emscripten/pull/18379 |
| 28 | + |
| 29 | + git apply --unsafe-paths -p1 --directory="$EMSCRIPTEN_UPSTREAM_ROOT" "$PATCH_DIR/sdl2_image_port.diff" |
| 30 | + git apply --unsafe-paths -p1 --directory="$EMSCRIPTEN_UPSTREAM_ROOT" "$PATCH_DIR/sdl2_mixer_port.diff" |
| 31 | + git apply --unsafe-paths -p1 --directory="$EMSCRIPTEN_UPSTREAM_ROOT" "$PATCH_DIR/default_settings.diff" |
| 32 | + |
| 33 | + touch "$EMSCRIPTEN_PACTH_FILE" |
| 34 | +fi |
| 35 | + |
| 36 | +# git apply path |
| 37 | + |
| 38 | +# shellcheck disable=SC1091 |
| 39 | +EMSDK_QUIET=1 source "$EMSCRIPTEN_ROOT/emsdk_env.sh" >/dev/null |
| 40 | + |
| 41 | +## build theneeded dependencies |
| 42 | +embuilder build sdl2-mt harfbuzz-mt freetype zlib sdl2_ttf mpg123 "sdl2_mixer:formats=mp3" libpng-mt "sdl2_image:formats=png,svg:mt=1" icu-mt |
| 43 | + |
| 44 | +export EMSCRIPTEN_SYS_ROOT="$EMSCRIPTEN_UPSTREAM_ROOT/cache/sysroot" |
| 45 | + |
| 46 | +export BUILD_DIR="build-web" |
| 47 | + |
| 48 | +export CC="emcc" |
| 49 | +export CXX="em++" |
| 50 | +export AR="emar" |
| 51 | +export RANLIB="emranlib" |
| 52 | +export STRIP="emstrip" |
| 53 | +export NM="emnm" |
| 54 | + |
| 55 | +export ARCH="wasm32" |
| 56 | +export CPU_ARCH="wasm32" |
| 57 | +export ENDIANESS="little" |
| 58 | + |
| 59 | +export ROMFS="platforms/romfs" |
| 60 | + |
| 61 | +export PACKAGE_FLAGS="'--use-port=sdl2', '--use-port=harfbuzz', '--use-port=freetype', '--use-port=zlib', '--use-port=sdl2_ttf', '--use-port=mpg123', '--use-port=sdl2_mixer', '-sSDL2_MIXER_FORMATS=[\"mp3\"]','--use-port=libpng', '--use-port=sdl2_image','-sSDL2_IMAGE_FORMATS=[\"png\",\"svg\"]', '--use-port=icu'" |
| 62 | + |
| 63 | +export COMMON_FLAGS="'-fexceptions', '-pthread', '-sUSE_PTHREADS=1', '-sEXCEPTION_CATCHING_ALLOWED=[..]', $PACKAGE_FLAGS" |
| 64 | + |
| 65 | +# TODO see if ALLOW_MEMORY_GROWTH is needed, but if we load ttf's and music it likely is and we don't have to debug OOm crashes, that aren't handled by some third party library, which is painful |
| 66 | +export LINK_FLAGS="$COMMON_FLAGS, '-sEXPORT_ALL=1', '-sUSE_WEBGPU=1', '-sWASM=1', '-sALLOW_MEMORY_GROWTH=1', '-sASSERTIONS=1','-sERROR_ON_UNDEFINED_SYMBOLS=1', '-sFETCH=1', '-sEXIT_RUNTIME=1'" |
| 67 | +export COMPILE_FLAGS="$COMMON_FLAGS ,'-DAUDIO_PREFER_MP3'" |
| 68 | + |
| 69 | +export CROSS_FILE="./platforms/crossbuild-web.ini" |
| 70 | + |
| 71 | +cat <<EOF >"$CROSS_FILE" |
| 72 | +[host_machine] |
| 73 | +system = 'emscripten' |
| 74 | +cpu_family = '$ARCH' |
| 75 | +cpu = '$CPU_ARCH' |
| 76 | +endian = '$ENDIANESS' |
| 77 | +
|
| 78 | +[target_machine] |
| 79 | +system = 'emscripten' |
| 80 | +cpu_family = '$ARCH' |
| 81 | +cpu = '$CPU_ARCH' |
| 82 | +endian = '$ENDIANESS' |
| 83 | +
|
| 84 | +[constants] |
| 85 | +emscripten_root = '$(pwd)/emsdk' |
| 86 | +
|
| 87 | +[binaries] |
| 88 | +c = '$CC' |
| 89 | +cpp = '$CXX' |
| 90 | +ar = '$AR' |
| 91 | +ranlib = '$RANLIB' |
| 92 | +strip = '$STRIP' |
| 93 | +nm = '$NM' |
| 94 | +
|
| 95 | +pkg-config = ['emmake', 'pkg-config'] |
| 96 | +cmake = ['emmake', 'cmake'] |
| 97 | +sdl2-config = ['emconfigure', 'sdl2-config'] |
| 98 | +
|
| 99 | +exe_wrapper = '$EMSDK_NODE' |
| 100 | +
|
| 101 | +[built-in options] |
| 102 | +c_std = 'c11' |
| 103 | +cpp_std = 'c++23' |
| 104 | +c_args = [$COMPILE_FLAGS] |
| 105 | +cpp_args = [$COMPILE_FLAGS] |
| 106 | +c_link_args = [$LINK_FLAGS] |
| 107 | +cpp_link_args = [$LINK_FLAGS] |
| 108 | +
|
| 109 | +[properties] |
| 110 | +needs_exe_wrapper = true |
| 111 | +sys_root = '$EMSCRIPTEN_SYS_ROOT' |
| 112 | +
|
| 113 | +APP_ROMFS='$ROMFS/assets/' |
| 114 | +
|
| 115 | +EOF |
| 116 | + |
| 117 | +## options: "smart, complete_rebuild" |
| 118 | +export COMPILE_TYPE="smart" |
| 119 | + |
| 120 | +export BUILDTYPE="debug" |
| 121 | + |
| 122 | +if [ "$#" -eq 0 ]; then |
| 123 | + # nothing |
| 124 | + echo "Using compile type '$COMPILE_TYPE'" |
| 125 | +elif [ "$#" -eq 1 ]; then |
| 126 | + COMPILE_TYPE="$1" |
| 127 | +elif [ "$#" -eq 2 ]; then |
| 128 | + COMPILE_TYPE="$1" |
| 129 | + BUILDTYPE="$2" |
| 130 | +else |
| 131 | + echo "Too many arguments given, expected 1 or 2" |
| 132 | + exit 1 |
| 133 | +fi |
| 134 | + |
| 135 | +if [ "$COMPILE_TYPE" == "smart" ]; then |
| 136 | + : # noop |
| 137 | +elif [ "$COMPILE_TYPE" == "complete_rebuild" ]; then |
| 138 | + : # noop |
| 139 | +else |
| 140 | + echo "Invalid COMPILE_TYPE, expected: 'smart' or 'complete_rebuild'" |
| 141 | + exit 1 |
| 142 | +fi |
| 143 | + |
| 144 | +if [ ! -d "$ROMFS" ]; then |
| 145 | + |
| 146 | + mkdir -p "$ROMFS" |
| 147 | + |
| 148 | + cp -r assets "$ROMFS/" |
| 149 | + |
| 150 | +fi |
| 151 | + |
| 152 | +if [ "$COMPILE_TYPE" == "complete_rebuild" ] || [ ! -e "$BUILD_DIR" ]; then |
| 153 | + |
| 154 | + meson setup "$BUILD_DIR" \ |
| 155 | + "--wipe" \ |
| 156 | + --cross-file "$CROSS_FILE" \ |
| 157 | + "-Dbuildtype=$BUILDTYPE" \ |
| 158 | + -Ddefault_library=static \ |
| 159 | + -Dtests=false |
| 160 | + |
| 161 | +fi |
| 162 | + |
| 163 | +meson compile -C "$BUILD_DIR" |
0 commit comments