77 lines
2.7 KiB
Bash
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"
|