Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions .github/workflows/webassembly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Build Web

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
build-web:
name: Build (Web)
runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v4

- name: Get commit info
id: commit-info
run: |
echo "hash=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "date=$(git log -1 --format=%cd --date=short)" >> $GITHUB_OUTPUT

- name: Setup Emscripten SDK
uses: mymindstorm/setup-emsdk@v14
with:
version: latest

- name: Configure
run: |
emcmake cmake \
-B build \
-DWERROR=ON \
-DPLATFORM=web \
-DCMAKE_BUILD_TYPE=Release \
"-DBUTTERSCOTCH_COMMIT_HASH=${{ steps.commit-info.outputs.hash }}" \
"-DBUTTERSCOTCH_COMMIT_DATE=${{ steps.commit-info.outputs.date }}"

- name: Build
run: cmake --build build -j$(nproc)

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: butterscotch-web
path: build/butterscotch.*
38 changes: 18 additions & 20 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -321,10 +321,13 @@ if(PLATFORM STREQUAL "desktop")
${CMAKE_SOURCE_DIR}/vendor/gamecontrollerdb.txt
$<TARGET_FILE_DIR:butterscotch>/gamecontrollerdb.txt
)
elseif(PLATFORM STREQUAL "web")
if (NOT ENABLE_MODERN_GL)
elseif(PLATFORM STREQUAL "web")
if (NOT ENABLE_MODERN_GL)
message(FATAL_ERROR "Web requires modern gl!")
endif()

file(GLOB GL_SOURCES src/gl/*.c src/gl_common/*.c src/image/*.c)
target_sources(butterscotch PRIVATE ${GL_SOURCES})
target_include_directories(butterscotch PRIVATE ${CMAKE_SOURCE_DIR}/src/gl)
Expand All @@ -337,29 +340,24 @@ elseif(PLATFORM STREQUAL "web")
# bzip2
target_link_libraries(butterscotch PRIVATE bzip2 stb_ds sha1 stb_vorbis)

set_target_properties(butterscotch PROPERTIES SUFFIX ".mjs")
# Build as classic JS instead of ES module
set_target_properties(butterscotch PROPERTIES SUFFIX ".js")

target_link_options(
butterscotch
PRIVATE
"-sMODULARIZE=1"
"-sEXPORT_ES6=1"
"-sENVIRONMENT=worker"
"-sWASMFS=1"
"-sEXPORTED_RUNTIME_METHODS=['HEAP8', 'HEAPU8', 'HEAPF32', 'ccall', 'cwrap', 'specialHTMLTargets', 'UTF8ToString']"
"-sEXPORTED_FUNCTIONS=['_main', '_mountOpfs', '_startRunner', '_stopRunner', '_malloc', '_free', '_getKeyDownPtr', '_getKeyUpPtr', '_getKeyCount', '_setAudioSampleRate', '_pullAudioFrames']"
"-sOFFSCREENCANVAS_SUPPORT=1"
"-sOFFSCREEN_FRAMEBUFFER=1"
"-sMIN_WEBGL_VERSION=2"
"-sMAX_WEBGL_VERSION=2"
"-sFULL_ES3=1"
"-sALLOW_MEMORY_GROWTH"
"-sSHARED_MEMORY=1"
"-sPTHREAD_POOL_SIZE=4"
"-pthread"
butterscotch
PRIVATE
"-sMODULARIZE=0"
"-sEXPORT_ES6=0"
"-sENVIRONMENT=web"
"-sWASMFS=1"
"-sEXPORTED_RUNTIME_METHODS=['FS','HEAP8','HEAPU8','HEAPF32','ccall','cwrap','UTF8ToString']"
"-sEXPORTED_FUNCTIONS=['_main','_mountOpfs','_startRunner','_stopRunner','_malloc','_free','_getKeyDownPtr','_getKeyUpPtr','_getKeyCount','_setAudioSampleRate','_pullAudioFrames']"
"-sMIN_WEBGL_VERSION=2"
"-sMAX_WEBGL_VERSION=2"
"-sFULL_ES3=1"
"-sALLOW_MEMORY_GROWTH=1"
)

target_compile_options(butterscotch PRIVATE "-pthread")

elseif(PLATFORM STREQUAL "web-meta")
set_target_properties(butterscotch PROPERTIES
SUFFIX ".mjs"
Expand Down
Loading