flan/vendor/raylib/build-web.sh

77 lines
2.7 KiB
Bash

#!/bin/sh
# raylib, built for the browser.
#
# The host half of this package needs no build: Fedora ships libraylib.so.550
# and `link` names it. The browser has no such thing, so the archive has to be
# made here, once, out of raylib's own sources with emscripten's clang.
#
# Pinned to the tag whose shared library the host links — 5.5 against
# libraylib.so.550 — because `raylib.flan` carries struct layouts and enum
# values that are raylib's, not ours, and a build where the two targets are
# different raylibs would disagree about them silently.
#
# The output is a plain static archive plus nothing else: no headers are
# installed, because the generated FFI shim declares the prototypes it uses
# (see docs/BUILT.md, "No raylib headers are needed").
#
# sh vendor/raylib/build-web.sh
#
# It prints the line to export. `vendor/raylib/link` points at the archive
# through ${FLAN_RAYLIB_WEB}, and a web build that names raylib with the
# variable unset is refused by name rather than met at the linker.
#
# Environment:
# FLAN_RAYLIB_TAG the raylib tag to build (default 5.5)
# FLAN_RAYLIB_WEB_DIR where to put it (default vendor/raylib/web)
# FLAN_RAYLIB_SRC an existing raylib checkout to build instead of cloning
set -eu
tag=${FLAN_RAYLIB_TAG:-5.5}
here=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
out=${FLAN_RAYLIB_WEB_DIR:-$here/web}
archive=$out/libraylib-$tag.a
command -v emcc > /dev/null 2>&1 || {
echo "build-web.sh: no emcc on PATH. Source an emsdk's emsdk_env.sh." >&2
exit 1
}
if [ -f "$archive" ]; then
echo "already built: $archive" >&2
else
mkdir -p "$out"
if [ -n "${FLAN_RAYLIB_SRC:-}" ]; then
src=$FLAN_RAYLIB_SRC
else
src=$out/raylib-$tag
[ -d "$src" ] || git clone --depth 1 --branch "$tag" \
https://github.com/raysan5/raylib "$src"
fi
objs=$out/obj-$tag
rm -rf "$objs"
mkdir -p "$objs"
# GRAPHICS_API_OPENGL_ES2 is what WebGL is. PLATFORM_WEB makes rcore.c
# include platforms/rcore_web.c, whose WindowShouldClose() is an
# emscripten_sleep that returns false — see docs/BUILT.md on why that is the whole
# reason a Flan `until` loop needs no rewriting for the browser.
#
# rglfw.c is not in the list: the web platform uses emscripten's own GLFW
# (-sUSE_GLFW=3, in `link`), not a compiled-in one.
for m in rcore rshapes rtextures rtext rmodels raudio utils; do
[ -f "$src/src/$m.c" ] || continue
echo " emcc $m.c" >&2
(cd "$src/src" && emcc -c -O2 -std=gnu99 \
-DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2 \
-I. -Iexternal/glfw/include \
"$m.c" -o "$objs/$m.o")
done
emar rcs "$archive" "$objs"/*.o
rm -rf "$objs"
fi
echo
echo "export FLAN_RAYLIB_WEB=$archive"