Set up packaging for web build

This commit is contained in:
yulya3102 2025-02-01 05:35:59 +01:00
parent 4204022390
commit 805826c160
8 changed files with 103 additions and 2 deletions

View file

@ -1,4 +1,7 @@
# On web SDL is provided by emsdk itself
if(NOT CMAKE_SYSTEM_NAME STREQUAL Emscripten)
find_package(SDL2 REQUIRED)
endif()
file(GLOB_RECURSE PSEMEK_SDL2_HEADERS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "include/*.hpp")
file(GLOB_RECURSE PSEMEK_SDL2_SOURCES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "source/*.cpp")

View file

@ -10,7 +10,11 @@ if(PSEMEK_PACKAGE_MODE)
elseif(ANDROID)
set(PSEMEK_PACKAGE_SUFFIX_RAW android)
elseif(UNIX)
set(PSEMEK_PACKAGE_SUFFIX_RAW linux)
if (CMAKE_SYSTEM_NAME STREQUAL Emscripten)
set(PSEMEK_PACKAGE_SUFFIX_RAW web)
else()
set(PSEMEK_PACKAGE_SUFFIX_RAW linux)
endif()
else()
message(FATAL "Uknown system for packaging")
endif()
@ -84,7 +88,19 @@ function(psemek_add_executable_impl target is_application)
if(NOT ANDROID)
get_filename_component(_OUTPUT_DIRECTORY "${_OUTPUT_PATH}" DIRECTORY)
set(_COPY_FILES $<TARGET_FILE:${target}> ${PSEMEK_PACKAGE_COPY_FILES})
set(_TARGET_FILE $<TARGET_FILE:${target}>)
set(_TARGET_RUNTIME)
if(CMAKE_SYSTEM_NAME STREQUAL Emscripten)
set(_TARGET_PARENT $<PATH:GET_PARENT_PATH,${_TARGET_FILE}>)
set(_TARGET_STEM $<PATH:GET_STEM,${_TARGET_FILE}>)
set(_TARGET_NOEXT "${_TARGET_PARENT}/${_TARGET_STEM}")
list(APPEND _TARGET_RUNTIME ${_TARGET_NOEXT}.js)
list(APPEND _TARGET_RUNTIME ${_TARGET_NOEXT}.wasm)
endif()
set(_COPY_FILES ${_TARGET_FILE} ${_TARGET_RUNTIME} ${PSEMEK_PACKAGE_COPY_FILES})
if(PSEMEK_GRAPHICS_API STREQUAL WEBGPU)
list(APPEND _COPY_FILES ${PSEMEK_PACKAGE_COPY_FILES_WEBGPU})

View file

@ -8,6 +8,7 @@ if [ "$#" -ne 2 ]; then
echo " linux"
echo " windows"
echo " android"
echo " web"
exit 0
fi
@ -15,6 +16,7 @@ case ${1} in
linux) ;;
windows) ;;
android) ;;
web) ;;
*)
echo "Unknown platform: ${1}"
exit -1

16
package/web/Dockerfile Normal file
View file

@ -0,0 +1,16 @@
FROM lisyarus/psemek:package-linux
# Install emsdk - the version the build was tested at
WORKDIR /home
RUN git clone --branch 3.1.46 https://github.com/emscripten-core/emsdk.git
WORKDIR /home/emsdk
RUN ./emsdk install 3.1.46
RUN ./emsdk activate 3.1.46
WORKDIR /home
COPY env-helper.sh .
# Source emsdk env variables when running the container
ENTRYPOINT ["/home/env-helper.sh"]
# Install toolchain file & main packaging script
COPY toolchain-host.cmake .
COPY package.sh .

7
package/web/build.sh Executable file
View file

@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -e
cd "$(dirname "$0")"
docker build -t lisyarus/psemek:package-web .

6
package/web/env-helper.sh Executable file
View file

@ -0,0 +1,6 @@
#!/bin/bash
# emsdk provides some environment variables that need to be sourced from a file
source /home/emsdk/emsdk_env.sh
exec "$@"

25
package/web/package.sh Executable file
View file

@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -e
mkdir -p /home/build-host
cd /home/build-host
cmake ../source -DCMAKE_TOOLCHAIN_FILE=/home/toolchain-host.cmake -DCMAKE_INSTALL_PREFIX=/home/tools
cmake --build . -t install -j
mkdir -p /home/build-target
cd /home/build-target
rm -rf ./*
# Use emsdk wrapper for cmake - it sets some env variables to select the
# right toolchain.
emcmake cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DPSEMEK_PACKAGE_MODE=ON \
-DPSEMEK_PACKAGE_HOST=OFF \
-DPSEMEK_PACKAGE_TARGET=ON \
-DPSEMEK_STACKTRACE=OFF \
-DPSEMEK_PACKAGE_TOOLS_PATH=/home/tools \
-DPSEMEK_PACKAGE_COPY_FILES= \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH \
../source
cmake --build . -j

View file

@ -0,0 +1,26 @@
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_BUILD_TYPE Release)
set(PSEMEK_PACKAGE_MODE ON)
set(PSEMEK_PACKAGE_ROOT "${CMAKE_CURRENT_LIST_DIR}")
set(PSEMEK_PACKAGE_HOST ON)
set(PSEMEK_PACKAGE_TARGET OFF)
set(PSEMEK_PACKAGE_TOOLS_PATH "${PSEMEK_PACKAGE_ROOT}/tools")
set(PSEMEK_STACKTRACE OFF)
set(PSEMEK_PACKAGE_COPY_FILES
${PSEMEK_PACKAGE_ROOT}/sdl2/install/lib/libSDL2-2.0.so.0
)
set(PSEMEK_PACKAGE_COPY_FILES_FREETYPE
${PSEMEK_PACKAGE_ROOT}/libfreetype.so.6
)
list(APPEND CMAKE_PREFIX_PATH
"${PSEMEK_PACKAGE_ROOT}/sdl2/install"
)
set(WGPU_NATIVE_ROOT
"${PSEMEK_PACKAGE_ROOT}/wgpu-native/install"
)