diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 85915cc..306c740 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -1,38 +1,225 @@ -name: Github Pages +name: Build + on: [push] + permissions: contents: write + jobs: - deploy: + wasm: runs-on: ubuntu-latest + permissions: pages: write id-token: write + steps: - - uses: actions/checkout@v2 # repo checkout + - name: Checkout + uses: actions/checkout@v4 - - uses: mymindstorm/setup-emsdk@v11 # setup emscripten toolchain + - name: Setup Emscripten SDK + uses: mymindstorm/setup-emsdk@v14 with: - version: 1.39.20 + version: 3.1.43 - - uses: actions-rs/toolchain@v1 # get rust toolchain for wasm + - name: Setup Rust (WASM32 Emscripten) + uses: dtolnay/rust-toolchain@stable with: - toolchain: stable target: wasm32-unknown-emscripten - override: true - # TODO: Update to v2 - - name: Rust Cache # cache the rust build artefacts - uses: Swatinem/rust-cache@v1 + - name: Rust Cache + uses: Swatinem/rust-cache@v2 - - name: Build # build - run: ./scripts/build-wasm.sh + - name: Install pnpm + uses: pnpm/action-setup@v3 + with: + version: 8 + run_install: true + + - name: Build + run: ./scripts/build.sh -er # release mode, skip emsdk - name: Upload Artifact - uses: actions/upload-pages-artifact@v2 + uses: actions/upload-pages-artifact@v3 with: - path: './dist/' + path: "./dist/" retention-days: 7 - name: Deploy - uses: actions/deploy-pages@v2 \ No newline at end of file + uses: actions/deploy-pages@v4 + + linux: + runs-on: ubuntu-latest + env: + TARGET: x86_64-unknown-linux-gnu + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install SDL2 Packages + run: sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-gfx-dev + + - name: Setup Rust Toolchain (Linux) + uses: dtolnay/rust-toolchain@stable + with: + target: ${{ env.TARGET }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + + - name: Build + run: cargo build --release + + - name: Assemble Archive + run: | + mkdir /tmp/example/ + cp ./target/release/pacman /tmp/example/ + chmod a+x /tmp/example/pacman + mkdir /tmp/example/assets + cp ./assets/TerminalVector.ttf ./assets/fruit.png /tmp/example/assets + + - name: Install Cargo Binstall + uses: cargo-bins/cargo-binstall@main + + - name: Acquire Package Version + run: | + cargo binstall toml-cli -y + PACKAGE_VERSION=$(toml get ./Cargo.toml package.version --raw) + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: "pacman-${{ env.PACKAGE_VERSION }}-${{ env.TARGET }}" + path: /tmp/example/ + retention-days: 7 + if-no-files-found: error + + macos: + runs-on: macos-13 + env: + TARGET: x86_64-apple-darwin + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install SDL2 Packages + run: brew install sdl2 sdl2_image sdl2_mixer sdl2_ttf sdl2_gfx + + - name: Setup Rust Toolchain (MacOS) + uses: dtolnay/rust-toolchain@stable + with: + target: ${{ env.TARGET }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + + - name: Build + run: cargo build --release + + - name: Assemble Archive + run: | + mkdir /tmp/example/ + cp ./target/release/pacman /tmp/example/ + mkdir /tmp/example/assets + cp ./assets/TerminalVector.ttf ./assets/fruit.png /tmp/example/assets + + - name: Install Cargo Binstall + uses: cargo-bins/cargo-binstall@main + + - name: Acquire Package Version + run: | + cargo binstall toml-cli -y + PACKAGE_VERSION=$(toml get ./Cargo.toml package.version --raw) + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $GITHUB_ENV + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: "pacman-${{ env.PACKAGE_VERSION }}-${{ env.TARGET }}" + path: /tmp/example/ + retention-days: 7 + if-no-files-found: error + + windows: + env: + TARGET: x86_64-pc-windows-gnu + SDL2: 2.30.2 + SDL2_TTF: 2.22.0 + SDL2_MIXER: 2.8.0 + SDL2_IMAGE: 2.8.2 + # SDL2_GFX: 1.0.4 + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download SDL2 Libraries + run: | + curl -L "https://github.com/libsdl-org/SDL/releases/download/release-${{ env.SDL2 }}/SDL2-devel-${{ env.SDL2 }}-VC.zip" -o "sdl2_devel.zip" + curl -L "https://github.com/libsdl-org/SDL_mixer/releases/download/release-${{ env.SDL2_MIXER }}/SDL2_mixer-devel-${{ env.SDL2_MIXER }}-VC.zip" -o "sdl2_mixer_devel.zip" + curl -L "https://github.com/libsdl-org/SDL_ttf/releases/download/release-${{ env.SDL2_TTF }}/SDL2_ttf-devel-${{ env.SDL2_TTF }}-VC.zip" -o "sdl2_ttf_devel.zip" + curl -L "https://github.com/libsdl-org/SDL_image/releases/download/release-${{ env.SDL2_IMAGE }}/SDL2_image-devel-${{ env.SDL2_IMAGE }}-VC.zip" -o "sdl2_image_devel.zip" + + - name: Extract SDL2 DLLs + run: | + 7z x ./sdl2_devel.zip -o"./tmp/" + mv ./tmp/SDL2-${{ env.SDL2 }}/lib/x64/SDL2.dll ./ + mv ./tmp/SDL2-${{ env.SDL2 }}/lib/x64/SDL2.lib ./ + + 7z x ./sdl2_mixer_devel.zip -o"./tmp/" + mv ./tmp/SDL2_mixer-${{ env.SDL2_MIXER }}/lib/x64/SDL2_mixer.dll ./ + mv ./tmp/SDL2_mixer-${{ env.SDL2_MIXER }}/lib/x64/SDL2_mixer.lib ./ + + 7z x ./sdl2_ttf_devel.zip -o"./tmp/" + mv ./tmp/SDL2_ttf-${{ env.SDL2_TTF }}/lib/x64/SDL2_ttf.dll ./ + mv ./tmp/SDL2_ttf-${{ env.SDL2_TTF }}/lib/x64/SDL2_ttf.lib ./ + + 7z x ./sdl2_image_devel.zip -o"./tmp/" + mv ./tmp/SDL2_image-${{ env.SDL2_IMAGE }}/lib/x64/SDL2_image.dll ./ + mv ./tmp/SDL2_image-${{ env.SDL2_IMAGE }}/lib/x64/SDL2_image.lib ./ + + - name: Install SDL2_gfx + run: | + C:\vcpkg\vcpkg.exe install sdl2-gfx:x64-windows-release + cp C:\vcpkg\packages\sdl2-gfx_x64-windows-release\bin\SDL2_gfx.dll ./ + cp C:\vcpkg\packages\sdl2-gfx_x64-windows-release\lib\SDL2_gfx.lib ./ + + - name: Setup Rust (Windows) + uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ env.TARGET }} + + - name: Rust Cache + uses: Swatinem/rust-cache@v2 + + - name: Build + run: cargo build --release + + - name: Prepare Archive + run: | + New-Item -Type Directory ./release/ + Move-Item -Path ./target/release/pacman.exe -Destination ./release/ + Move-Item -Path ./SDL2.dll, ./SDL2_image.dll, ./SDL2_ttf.dll, ./SDL2_mixer.dll, ./SDL2_gfx.dll -Destination ./release/ + New-Item -Type Directory ./release/assets/ + Move-Item -Path ./assets/TerminalVector.ttf, ./assets/fruit.png -Destination ./release/assets/ + + - name: Install Cargo Binstall + uses: cargo-bins/cargo-binstall@main + + - name: Acquire Package Version + run: | + cargo binstall toml-cli -y + PACKAGE_VERSION=$(toml get ./Cargo.toml package.version --raw) + echo "PACKAGE_VERSION=${PACKAGE_VERSION}" >> $env:GITHUB_ENV + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: "pacman-${{ env.PACKAGE_VERSION }}-${{ env.TARGET }}" + path: ./release/ + retention-days: 7 + if-no-files-found: error diff --git a/scripts/build-wasm.sh b/scripts/build-wasm.sh deleted file mode 100755 index f0b95e2..0000000 --- a/scripts/build-wasm.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# set -eu - -echo "Building WASM with Emscripten" -cargo build --target=wasm32-unknown-emscripten --release - -echo "Copying release files to dist/" -mkdir -p dist -output_folder="target/wasm32-unknown-emscripten/release" -cp $output_folder/pacman.wasm dist -cp $output_folder/pacman.js dist -cp $output_folder/deps/pacman.data dist -cp assets/index.html dist \ No newline at end of file diff --git a/scripts/build-windows.sh b/scripts/build-windows.sh deleted file mode 100755 index 430b925..0000000 --- a/scripts/build-windows.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash -set -eu - -SDL_VERSION="2.28.3" -SDL_IMAGE_VERSION="2.6.3" -SDL_MIXER_VERSION="2.6.3" -SDL_TTF_VERSION="2.20.2" - -SDL="https://github.com/libsdl-org/SDL/releases/download/release-${SDL_VERSION}/SDL2-devel-${SDL_VERSION}-mingw.tar.gz" -SLD_IMAGE="https://github.com/libsdl-org/SDL_image/releases/download/release-${SDL_IMAGE_VERSION}/SDL2_image-devel-${SDL_IMAGE_VERSION}-mingw.tar.gz" -SDL_MIXER="https://github.com/libsdl-org/SDL_mixer/releases/download/release-${SDL_MIXER_VERSION}/SDL2_mixer-devel-${SDL_MIXER_VERSION}-mingw.tar.gz" -SDL_TTF="https://github.com/libsdl-org/SDL_ttf/releases/download/release-${SDL_TTF_VERSION}/SDL2_ttf-devel-${SDL_TTF_VERSION}-mingw.tar.gz" - -EXTRACT_DIR="./target/x86_64-pc-windows-gnu/release/deps" - -if [ ! -f $EXTRACT_DIR/libSDL2.a ]; then - if [ ! -f ./sdl2.tar.gz ]; then - echo "Downloading SDL2@$SDL_VERSION..." - curl -L -o ./sdl2.tar.gz $SDL - fi - echo "Extracting SDL2..." - tar -xzf ./sdl2.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2-$SDL_VERSION/x86_64-w64-mingw32/lib/libSDL2.a" - rm -f ./sdl2.tar.gz -fi - -if [ ! -f $EXTRACT_DIR/libSDL2_image.a ]; then - if [ ! -f ./sdl2_image.tar.gz ]; then - echo "Downloading SDL2_image@$SDL_IMAGE_VERSION..." - curl -L -o ./sdl2_image.tar.gz $SLD_IMAGE - fi - echo "Extracting SDL2_image..." - tar -xzf ./sdl2_image.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_image-$SDL_IMAGE_VERSION/x86_64-w64-mingw32/lib/libSDL2_image.a" -fi -rm -f ./sdl2_image.tar.gz - -if [ ! -f $EXTRACT_DIR/libSDL2_mixer.a ]; then - if [ ! -f ./sdl2_mixer.tar.gz ]; then - echo "Downloading SDL2_mixer@$SDL_MIXER_VERSION..." - curl -L -o ./sdl2_mixer.tar.gz $SDL_MIXER - fi - echo "Extracting SDL2_mixer..." - tar -xzf ./sdl2_mixer.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_mixer-$SDL_MIXER_VERSION/x86_64-w64-mingw32/lib/libSDL2_mixer.a" - rm -f ./sdl2_mixer.tar.gz -fi - -if [ ! -f $EXTRACT_DIR/libSDL2_ttf.a ]; then - - if [ ! -f ./sdl2_ttf.tar.gz ]; then - echo "Downloading SDL2_ttf@$SDL_TTF_VERSION..." - curl -L -o ./sdl2_ttf.tar.gz $SDL_TTF - fi - echo "Extracting SDL2_ttf..." - tar -xzf ./sdl2_ttf.tar.gz -C $EXTRACT_DIR --strip-components=3 "SDL2_ttf-$SDL_TTF_VERSION/x86_64-w64-mingw32/lib/libSDL2_ttf.a" - rm -f ./sdl2_ttf.tar.gz -fi - -echo "Building..." -cargo zigbuild --release --target x86_64-pc-windows-gnu \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 0000000..848b689 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,76 @@ +#!/bin/bash +set -eu + +release='false' +serve='false' +skip_emsdk='false' +clean='false' + +print_usage() { + printf "Usage: -erdsc\n" + printf " -e: Skip EMSDK setup (GitHub workflow only)\n" + printf " -r: Build in release mode\n" + printf " -d: Build in debug mode\n" + printf " -s: Serve the WASM files once built\n" + printf " -c: Clean the target/dist directory\n" +} + +while getopts 'erdsc' flag; do + case "${flag}" in + e) skip_emsdk='true' ;; + r) release='true' ;; + d) release='false' ;; # doesn't actually do anything, but last flag wins + s) serve='true' ;; + c) clean='true' ;; + *) + print_usage + exit 1 + ;; + esac +done + +if [ "$clean" = 'true' ]; then + echo "Cleaning target directory" + cargo clean + rm -rf ./dist/ +fi + +if [ "$skip_emsdk" = 'false' ]; then + echo "Activating Emscripten" + # SDL2-TTF requires 3.1.43, fails to build on latest + ./../emsdk/emsdk activate 3.1.43 + source ../emsdk/emsdk_env.sh +fi + +echo "Building WASM with Emscripten" +build_type='debug' +if [ "$release" = 'true' ]; then + cargo build --target=wasm32-unknown-emscripten --release + build_type='release' +else + cargo build --target=wasm32-unknown-emscripten +fi + +echo "Generating CSS" +pnpx postcss-cli ./assets/styles.scss -o ./assets/build.css + +echo "Copying WASM files" +mkdir -p dist +output_folder="target/wasm32-unknown-emscripten/$build_type" +cp assets/index.html dist + +cp assets/*.woff* dist +cp assets/build.css dist +cp assets/favicon.ico dist +cp $output_folder/spiritus.wasm dist +cp $output_folder/spiritus.js dist +# only if .data file exists +cp $output_folder/deps/spiritus.data dist +if [ -f $output_folder/spiritus.wasm.map ]; then + cp $output_folder/spiritus.wasm.map dist +fi + +if [ "$serve" = 'true' ]; then + echo "Serving WASM with Emscripten" + python3 -m http.server -d ./dist/ 8080 +fi diff --git a/scripts/clean-windows.sh b/scripts/clean-windows.sh deleted file mode 100755 index 8390b0f..0000000 --- a/scripts/clean-windows.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -eux - -echo "Cleaning library files from ./target/x86_64-pc-windows-gnu/release/deps" -rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2.a -rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_image.a -rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_mixer.a -rm -f ./target/x86_64-pc-windows-gnu/release/deps/libSDL2_ttf.a -echo "Done." \ No newline at end of file