Skip to content

Commit

Permalink
Fix emscripten support
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanaobrien committed Dec 31, 2024
1 parent 752f169 commit 63b0106
Show file tree
Hide file tree
Showing 28 changed files with 769 additions and 25 deletions.
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -310,3 +310,17 @@ discord-rpc

# CMake
cmake-build-*/

# Emscripten
src/thirdparty/nlohmann/
emscripten/ext/
emscripten/www/
emscripten/temp/
emscripten/Makefile
emscripten/CMake*
emscripten/cmake*
emscripten/*.a
emscripten/*.js
emscripten/*.wasm
emscripten/static/assets*
emscripten-output/
40 changes: 40 additions & 0 deletions cmake/FindSpeexDSP.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#
# - Find speexdsp libraries
#
# SPEEXDSP_INCLUDE_DIRS - where to find speexdsp headers.
# SPEEXDSP_LIBRARIES - List of libraries when using speexdsp.
# SPEEXDSP_FOUND - True if speexdsp is found.

find_package(PkgConfig QUIET)
pkg_search_module(PC_SPEEXDSP QUIET speexdsp)

find_path(SPEEXDSP_INCLUDE_DIR
NAMES
speex/speex_resampler.h
HINTS
${PC_SPEEXDSP_INCLUDE_DIRS}
)

find_library(SPEEXDSP_LIBRARY
NAMES
speexdsp
HINTS
${PC_SPEEXDSP_LIBRARY_DIRS}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(SpeexDSP
REQUIRED_VARS SPEEXDSP_LIBRARY SPEEXDSP_INCLUDE_DIR
VERSION_VAR PC_SPEEXDSP_VERSION)

if(SPEEXDSP_FOUND)
set(SPEEXDSP_LIBRARIES ${SPEEXDSP_LIBRARY})
set(SPEEXDSP_INCLUDE_DIRS ${SPEEXDSP_INCLUDE_DIR})
set(SPEEX_INCLUDE_DIRS ${SPEEXDSP_INCLUDE_DIR})
else()
set(SPEEXDSP_LIBRARIES)
set(SPEEXDSP_INCLUDE_DIRS)
set(SPEEX_INCLUDE_DIRS)
endif()

mark_as_advanced(SPEEXDSP_LIBRARIES SPEEXDSP_INCLUDE_DIRS SPEEX_INCLUDE_DIRS)
2 changes: 2 additions & 0 deletions data/language/en-GB.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3787,3 +3787,5 @@ STR_6709 :Enter Smooth Strength between {COMMA16} and {COMMA16}
STR_6710 :Stable sort
STR_6711 :Filename:
STR_6712 :Save
STR_6713 :Export emscripten data
STR_6714 :Import emscripten data
27 changes: 27 additions & 0 deletions emscripten/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
FROM docker.io/library/fedora:41 AS builder

RUN dnf update -y && dnf install -y git cmake make gcc g++ nlohmann-json-devel autoreconf libtool openssl-devel libcurl-devel fontconfig-devel libzip-devel SDL2-devel flac-devel libvorbis-devel zip speexdsp-devel

WORKDIR /

RUN git clone https://github.com/emscripten-core/emsdk.git

WORKDIR /emsdk/

# Pin version - to prevent sudden breakage of the CI
RUN ./emsdk install 3.1.74
RUN ./emsdk activate 3.1.74

WORKDIR /openrct2/

COPY ./ ./

RUN rm -rf emscripten/temp/ emscripten/www/ emscripten/ext/

WORKDIR /emsdk/

RUN . ./emsdk_env.sh && cd /openrct2/emscripten/ && ./build_emscripten.sh

FROM scratch AS export

COPY --from=builder /openrct2/emscripten/www/* .
162 changes: 162 additions & 0 deletions emscripten/build_emscripten.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@

cd "$(dirname "$0")"

START_DIR=$(pwd)
ICU_ROOT=$(pwd)/ext/icu/icu4c/source
JSON_DIR=/usr/include/nlohmann/

build_ext() {
mkdir -p ext/
cd ext/
# Pin versions - to prevent sudden breakage
if [ ! -d "speexdsp" ]; then
git clone https://gitlab.xiph.org/xiph/speexdsp.git --depth 1
cd speexdsp
git fetch --depth=1 origin dbd421d149a9c362ea16150694b75b63d757a521
git checkout dbd421d149a9c362ea16150694b75b63d757a521
cd ..
fi
if [ ! -d "icu" ]; then
git clone https://github.com/unicode-org/icu.git --depth 1
cd icu
git fetch --depth=1 origin ba012a74a11405a502b6890e710bfb58cef7a2c7
git checkout ba012a74a11405a502b6890e710bfb58cef7a2c7
cd ..
fi
if [ ! -d "libzip" ]; then
git clone https://github.com/nih-at/libzip.git --depth 1
cd libzip
git fetch --depth=1 origin 8352d224d458d86949fd9148dd33332f50a25c7f
git checkout 8352d224d458d86949fd9148dd33332f50a25c7f
cd ..
fi
if [ ! -d "zlib" ]; then
git clone https://github.com/madler/zlib.git --depth 1
cd zlib
git fetch --depth=1 origin ef24c4c7502169f016dcd2a26923dbaf3216748c
git checkout ef24c4c7502169f016dcd2a26923dbaf3216748c
cd ..
fi
if [ ! -d "vorbis" ]; then
git clone https://gitlab.xiph.org/xiph/vorbis.git --depth 1
cd vorbis
git fetch --depth=1 origin bb4047de4c05712bf1fd49b9584c360b8e4e0adf
git checkout bb4047de4c05712bf1fd49b9584c360b8e4e0adf
cd ..
fi
if [ ! -d "ogg" ]; then
git clone https://gitlab.xiph.org/xiph/ogg.git --depth 1
cd ogg
git fetch --depth=1 origin 7cf42ea17aef7bc1b7b21af70724840a96c2e7d0
git checkout 7cf42ea17aef7bc1b7b21af70724840a96c2e7d0
cd ..
fi
if [ ! -d "$JSON_DIR" ]; then
echo "$JSON_DIR does not exist. Set in build_emscripten.sh or install the nlohmann-json headers!"
exit 1
fi
rm -rf ../../src/thirdparty/nlohmann
cp -r $JSON_DIR ../../src/thirdparty/nlohmann

cd speexdsp
emmake ./autogen.sh
emmake ./configure --enable-shared --disable-neon
emmake make -j$(nproc)
cd $START_DIR/ext/

cd icu/icu4c/source
ac_cv_namespace_ok=yes icu_cv_host_frag=mh-linux emmake ./configure \
--enable-release \
--enable-shared \
--disable-icu-config \
--disable-extras \
--disable-icuio \
--disable-layoutex \
--disable-tools \
--disable-tests \
--disable-samples
emmake make -j$(nproc)
cd $START_DIR/ext/

cd zlib
emcmake cmake ./
emmake make zlib -j$(nproc)
emmake make install
ZLIB_ROOT=$(pwd)
cd $START_DIR/ext/

cd libzip
mkdir -p build/
cd build/
emcmake cmake ../ -DZLIB_INCLUDE_DIR="$ZLIB_ROOT" -DZLIB_LIBRARY="$ZLIB_ROOT/libz.a"
emmake make zip -j$(nproc)
emmake make install
cd $START_DIR/ext/

cd ogg
mkdir -p build/
cd build/
emcmake cmake ../
emmake make -j$(nproc)
emmake make install
cd $START_DIR/ext/

cd vorbis
mkdir -p build/
cd build/
emcmake cmake ../
emmake make -j$(nproc)
emmake make install

cd $START_DIR
}

build_assets() {
mkdir temp/
cd temp/
cmake ../../ -DMACOS_BUNDLE=off -DDISABLE_NETWORK=on -DDISABLE_GUI=off
make openrct2-cli -j$(nproc)
make g2 -j$(nproc)
DESTDIR=. make install
mkdir -p ../static/assets/
cp -r usr/local/share/openrct2/* ../static/assets/
cd ../static/assets
zip -r ../assets.zip *
cd ../
rm -rf assets/

cd $START_DIR
}

if [ "$1" != "skip" ] ; then
build_ext
build_assets
fi

emcmake cmake ../ \
-DDISABLE_NETWORK=ON \
-DDISABLE_HTTP=ON \
-DDISABLE_TTF=ON \
-DDISABLE_FLAC=ON \
-DDISABLE_DISCORD_RPC=ON \
-DCMAKE_SYSTEM_NAME=Emscripten \
-DCMAKE_BUILD_TYPE=Release \
-DSPEEXDSP_INCLUDE_DIR="$(pwd)/ext/speexdsp/include/" \
-DSPEEXDSP_LIBRARY="$(pwd)/ext/speexdsp/libspeexdsp/.libs/libspeexdsp.a" \
-DICU_INCLUDE_DIR="$ICU_ROOT/common" \
-DICU_DATA_LIBRARIES=$ICU_ROOT/lib/libicuuc.so \
-DICU_DT_LIBRARY_RELEASE="$ICU_ROOT/stubdata/libicudata.so" \
-DLIBZIP_LIBRARIES="$(pwd)/ext/libzip/build/lib/libzip.a" \
-DEMSCRIPTEN_FLAGS="-s USE_SDL=2 -s USE_BZIP2=1 -s USE_LIBPNG=1 -pthread -O3" \
-DEMSCRIPTEN_LDFLAGS="-Wno-pthreads-mem-growth -s ASYNCIFY -s FULL_ES3 -s SAFE_HEAP=0 -s ALLOW_MEMORY_GROWTH=1 -s MAXIMUM_MEMORY=4GB -s INITIAL_MEMORY=2GB -s MAX_WEBGL_VERSION=2 -s PTHREAD_POOL_SIZE=120 -pthread -sEXPORTED_RUNTIME_METHODS=FS,callMain,UTF8ToString,stringToNewUTF8 -lidbfs.js --use-preload-plugins -s MODULARIZE=1 -s 'EXPORT_NAME=\"OPENRCT2_WEB\"'"

emmake make -j$(nproc)

rm -rf www/
mkdir -p www/
cd www/
cp -r ../openrct2.* ./
cp -r ../static/* ./
cp -r ../static/.* ./

echo "finished!"
30 changes: 30 additions & 0 deletions emscripten/static/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!DOCTYPE html>
<html>
<head>
<title>OpenRCT2</title>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js" crossorigin=anonymous></script>
<script src="openrct2.js"></script>
<style>
* { padding: 0; margin: 0; }
canvas {
display: block;
margin: 0 auto;
position: fixed;
left: 0;
right: 0;
width: 100%;
height: 100%;
}
</style>
<script src="index.js"></script>
</head>
<body>
<p id="loadingWebassembly">Please wait... Loading webassembly</p>
<div id="beforeLoad" style="display:none;">
<p id="statusMsg">Please select your RCT2 assets (zip file):</p>
<input type="file" id="selectFile"></input>
</div>
<canvas id="canvas" style="display:none;"></canvas>
</body>
</html>

Loading

0 comments on commit 63b0106

Please sign in to comment.