joeylib2/make/web.mk
2026-10-13 14:01:46 -05:00

56 lines
2.5 KiB
Makefile

# Part of JoeyLib, Copyright (c) 2026 Scott Duensing, under the MIT License.
# See LICENSE.md for license information.
# SPDX-License-Identifier: MIT
#
# Web build rules: JoeyLib programs as web pages, through the hosted core and
# the same SDL3 backend the native SDL3 port uses (src/hosted,
# src/hosted/sdl3), compiled to WebAssembly with Emscripten. The rules are
# make/hosted.mk's; this file says what is the web's. A project reaches it
# through make/project.mk.
#
# A program is a folder of its own, bin/NAME/: NAME.html (the page, from
# make/support/web/shell.html), NAME.js and NAME.wasm, and NAME.data, its
# DATA folder packed in (Emscripten's --preload-file: the program finds it
# at /DATA, its current directory being /). Serve the folder over HTTP and
# open NAME.html; joey-run --port web does both.
#
# A JoeyLib program owns its loop and blocks in jlWaitVBL, which a browser
# does not allow, so programs are built with ASYNCIFY: the backend's waits
# hand the browser its turn (emscripten_sleep) and the program carries on
# where it was, unmodified.
PLATFORM := web
include $(dir $(lastword $(MAKEFILE_LIST)))/common.mk
$(call requireTool,$(EMCC),toolchain:web)
SDL3_WEB_LIB := $(SDL3_WEB_DIR)/lib/libSDL3.a
$(call requireTool,$(SDL3_WEB_LIB),toolchain:web)
$(call requireTool,$(LIBXMP_DIR)/include/libxmp-lite/xmp.h,toolchain:web)
# Emscripten's own environment (where its config and cache are), for every
# recipe.
export EM_CONFIG
export EM_CACHE
WEB_SHELL := $(REPO_DIR)/make/support/web/shell.html
# The asyncify unwind stack: deep enough for a wait inside a program's
# own call chain several levels down.
WEB_ASYNCIFY_STACK := 65536
HOSTED_CC := $(EMCC)
HOSTED_AR := $(dir $(EMCC))emar
HOSTED_BACKEND := sdl3
HOSTED_DEFINES := -DJOEYLIB_PLATFORM_HOSTED -DJOEYLIB_HOSTED_SDL3
HOSTED_SDK_CFLAGS := -I$(SDL3_WEB_DIR)/include
HOSTED_LINK := $(SDL3_WEB_LIB) -sASYNCIFY -sASYNCIFY_STACK_SIZE=$(WEB_ASYNCIFY_STACK) -sALLOW_MEMORY_GROWTH=1 -lidbfs.js -sEXPORTED_RUNTIME_METHODS=FS,ENV --shell-file $(WEB_SHELL)
PROGRAM_EXT := .html
# A program's page is rebuilt when the shell or SDL changes.
HOSTED_PROGRAM_DEPS := $(WEB_SHELL) $(SDL3_WEB_LIB)
# Every program in a folder of its own, with only its own DATA beside it:
# the DATA folder is packed into the program.
programDir = $(or $(call programVar,$(1),BINDIR),$(BINDIR))/$(call programName,$(1))
HOSTED_LINK_DATA = $(if $(call programVar,$(1),DATA),--preload-file $(call programDataDir,$(1))@/DATA)
include $(REPO_DIR)/make/hosted.mk