From 805826c160cb3099bfda84d6a24255f50496a206 Mon Sep 17 00:00:00 2001 From: yulya3102 Date: Sat, 1 Feb 2025 05:35:59 +0100 Subject: [PATCH] Set up packaging for web build --- libs/sdl2/CMakeLists.txt | 3 +++ package/CMakeLists.txt | 20 ++++++++++++++++++-- package/bin/psemek-package | 2 ++ package/web/Dockerfile | 16 ++++++++++++++++ package/web/build.sh | 7 +++++++ package/web/env-helper.sh | 6 ++++++ package/web/package.sh | 25 +++++++++++++++++++++++++ package/web/toolchain-host.cmake | 26 ++++++++++++++++++++++++++ 8 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 package/web/Dockerfile create mode 100755 package/web/build.sh create mode 100755 package/web/env-helper.sh create mode 100755 package/web/package.sh create mode 100644 package/web/toolchain-host.cmake diff --git a/libs/sdl2/CMakeLists.txt b/libs/sdl2/CMakeLists.txt index 730860ff..a5a1fef5 100644 --- a/libs/sdl2/CMakeLists.txt +++ b/libs/sdl2/CMakeLists.txt @@ -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") diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt index 24105ba7..2b46dd88 100644 --- a/package/CMakeLists.txt +++ b/package/CMakeLists.txt @@ -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 $ ${PSEMEK_PACKAGE_COPY_FILES}) + set(_TARGET_FILE $) + + set(_TARGET_RUNTIME) + if(CMAKE_SYSTEM_NAME STREQUAL Emscripten) + set(_TARGET_PARENT $) + set(_TARGET_STEM $) + 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}) diff --git a/package/bin/psemek-package b/package/bin/psemek-package index 296993a9..e5956654 100755 --- a/package/bin/psemek-package +++ b/package/bin/psemek-package @@ -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 diff --git a/package/web/Dockerfile b/package/web/Dockerfile new file mode 100644 index 00000000..2a941924 --- /dev/null +++ b/package/web/Dockerfile @@ -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 . diff --git a/package/web/build.sh b/package/web/build.sh new file mode 100755 index 00000000..2bb8a43d --- /dev/null +++ b/package/web/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +cd "$(dirname "$0")" + +docker build -t lisyarus/psemek:package-web . diff --git a/package/web/env-helper.sh b/package/web/env-helper.sh new file mode 100755 index 00000000..d99df790 --- /dev/null +++ b/package/web/env-helper.sh @@ -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 "$@" diff --git a/package/web/package.sh b/package/web/package.sh new file mode 100755 index 00000000..ce5a5a85 --- /dev/null +++ b/package/web/package.sh @@ -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 diff --git a/package/web/toolchain-host.cmake b/package/web/toolchain-host.cmake new file mode 100644 index 00000000..b7ffd05c --- /dev/null +++ b/package/web/toolchain-host.cmake @@ -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" +)