From 1d7f20c9ec61666697a1438675669ef30e043c53 Mon Sep 17 00:00:00 2001 From: Brocky Date: Fri, 22 Jul 2022 20:48:57 +0200 Subject: [PATCH] Added build steps for new platform Miyoo Mini (#5057) --- .github/workflows/miyoo_mini_release.yml | 50 ++++++++ CMake/Platforms.cmake | 4 +- CMake/platforms/miyoo_mini.cmake | 30 +++++ Packaging/miyoo_mini/build.sh | 109 ++++++++++++++++++ Packaging/miyoo_mini/setup_toolchain.sh | 49 ++++++++ .../skeleton_MiniUI/Diablo/Diablo.m3u | 1 + .../skeleton_MiniUI/Diablo/launch.sh | 12 ++ .../skeleton_MiniUI/Diablo/readme.txt | 37 ++++++ .../Emu/PORTS/Binaries/Diablo.port/launch.sh | 23 ++++ .../Emu/PORTS/PORTS/Diablo.port | 0 .../Emu/PORTS/PORTS/Imgs/Diablo.png | Bin 0 -> 32709 bytes .../miyoo_mini/skeleton_OnionOS/readme.txt | 38 ++++++ Packaging/miyoo_mini/toolchain_env.sh | 6 + docs/building.md | 7 ++ docs/installing.md | 9 ++ 15 files changed, 374 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/miyoo_mini_release.yml create mode 100644 CMake/platforms/miyoo_mini.cmake create mode 100755 Packaging/miyoo_mini/build.sh create mode 100755 Packaging/miyoo_mini/setup_toolchain.sh create mode 100644 Packaging/miyoo_mini/skeleton_MiniUI/Diablo/Diablo.m3u create mode 100644 Packaging/miyoo_mini/skeleton_MiniUI/Diablo/launch.sh create mode 100644 Packaging/miyoo_mini/skeleton_MiniUI/Diablo/readme.txt create mode 100644 Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/Binaries/Diablo.port/launch.sh create mode 100644 Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Diablo.port create mode 100644 Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Imgs/Diablo.png create mode 100644 Packaging/miyoo_mini/skeleton_OnionOS/readme.txt create mode 100755 Packaging/miyoo_mini/toolchain_env.sh diff --git a/.github/workflows/miyoo_mini_release.yml b/.github/workflows/miyoo_mini_release.yml new file mode 100644 index 000000000..ced4d4dcf --- /dev/null +++ b/.github/workflows/miyoo_mini_release.yml @@ -0,0 +1,50 @@ +name: Miyoo Mini Release Build + +on: + release: + types: [created] + workflow_dispatch: + +jobs: + miyoo-mini: + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Install toolchain + working-directory: ${{github.workspace}} + run: sudo Packaging/miyoo_mini/setup_toolchain.sh + + - name: Build + working-directory: ${{github.workspace}} + run: > + source Packaging/miyoo_mini/toolchain_env.sh && + Packaging/miyoo_mini/build.sh + + - name: Upload-OnionOS-Package + if: ${{ !env.ACT }} + uses: actions/upload-artifact@v2 + with: + name: devilutionx-onion-os.zip + path: build-miyoo-mini/devilutionx-onion-os.zip + + - name: Upload-miniUI-Package + if: ${{ !env.ACT }} + uses: actions/upload-artifact@v2 + with: + name: devilutionx-miniui.zip + path: build-miyoo-mini/devilutionx-miniui.zip + + - name: Update Release + if: ${{ github.event_name == 'release' && github.event.action == 'created' && !env.ACT }} + uses: ncipollo/release-action@v1 + with: + artifacts: "build-miyoo-mini/devilutionx-onion-os.zip,build-miyoo-mini/devilutionx-miniui.zip" + allowUpdates: true + omitBody: true + omitName: true + omitPrereleaseDuringUpdate: true + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/CMake/Platforms.cmake b/CMake/Platforms.cmake index b7ce46950..56e138f1b 100644 --- a/CMake/Platforms.cmake +++ b/CMake/Platforms.cmake @@ -18,7 +18,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD|OpenBSD|DragonFly|NetBSD") endif() set(TARGET_PLATFORM host CACHE STRING "Target platform") -set_property(CACHE TARGET_PLATFORM PROPERTY STRINGS host retrofw rg99 rg350 gkd350h cpigamesh) +set_property(CACHE TARGET_PLATFORM PROPERTY STRINGS host retrofw rg99 rg350 gkd350h cpigamesh miyoo_mini) if(TARGET_PLATFORM STREQUAL "retrofw") include(platforms/retrofw) elseif(TARGET_PLATFORM STREQUAL "rg99") @@ -31,6 +31,8 @@ elseif(TARGET_PLATFORM STREQUAL "cpigamesh") include(platforms/cpigamesh) elseif(TARGET_PLATFORM STREQUAL "lepus") include(platforms/lepus) +elseif(TARGET_PLATFORM STREQUAL "miyoo_mini") + include(platforms/miyoo_mini) endif() if(NINTENDO_SWITCH) diff --git a/CMake/platforms/miyoo_mini.cmake b/CMake/platforms/miyoo_mini.cmake new file mode 100644 index 000000000..e3e31addc --- /dev/null +++ b/CMake/platforms/miyoo_mini.cmake @@ -0,0 +1,30 @@ +set(BUILD_ASSETS_MPQ OFF) +set(USE_SDL1 ON) +set(NONET ON) +set(DEVILUTIONX_SYSTEM_LIBSODIUM OFF) +set(DEVILUTIONX_SYSTEM_BZIP2 OFF) + +set(SDL1_VIDEO_MODE_BPP 32) +set(SDL1_VIDEO_MODE_FLAGS SDL_HWSURFACE) +set(SDL1_FORCE_SVID_VIDEO_MODE ON) + +set(PREFILL_PLAYER_NAME ON) +set(DEFAULT_AUDIO_SAMPLE_RATE 44100) + +# The mini's buttons are connected via GPIO and are mapped to keyboard inputs +set(HAS_KBCTRL 1) +set(KBCTRL_BUTTON_DPAD_LEFT SDLK_LEFT) +set(KBCTRL_BUTTON_DPAD_RIGHT SDLK_RIGHT) +set(KBCTRL_BUTTON_DPAD_UP SDLK_UP) +set(KBCTRL_BUTTON_DPAD_DOWN SDLK_DOWN) +set(KBCTRL_BUTTON_B SDLK_SPACE) # Select spell +set(KBCTRL_BUTTON_A SDLK_LCTRL) # Attack +set(KBCTRL_BUTTON_Y SDLK_LSHIFT) # cast spell +set(KBCTRL_BUTTON_X SDLK_LALT) # pickup item +set(KBCTRL_BUTTON_RIGHTSHOULDER SDLK_t) # use mana potion +set(KBCTRL_BUTTON_LEFTSHOULDER SDLK_e) # use health potion +set(KBCTRL_BUTTON_START SDLK_TAB) # Use L2 for panel hotkeys +set(KBCTRL_BUTTON_BACK SDLK_BACKSPACE) # Use R2 for spell hotkeys + +# Map start to menu and select to automap. +set(REMAP_KEYBOARD_KEYS "{SDLK_RETURN,SDLK_ESCAPE},{SDLK_RCTRL,SDLK_TAB}") diff --git a/Packaging/miyoo_mini/build.sh b/Packaging/miyoo_mini/build.sh new file mode 100755 index 000000000..bbe3e6a4b --- /dev/null +++ b/Packaging/miyoo_mini/build.sh @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +set -euo pipefail + +declare -r PACKAGING_DIR=`cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P` +declare -r CFLAGS="-O3 -marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -march=armv7ve -Wall" +declare -r LDFLAGS="-lSDL -lmi_sys -lmi_gfx -s -lSDL -lSDL_image" +declare -r BUILD_DIR="build-miyoo-mini" +declare -r MIYOO_CUSTOM_SDL_REPO="https://github.com/Brocky/SDL-1.2-miyoo-mini.git" +declare -r MIYOO_CUSTOM_SDL_BRANCH="miniui-miyoomini" + +main() { + # ensure we are in devilutionx root + cd "$PACKAGING_DIR/../.." + + rm -f "$BUILD_DIR/CMakeCache.txt" + cmake_configure -DCMAKE_BUILD_TYPE=Release + cmake_build + package_onion + package_miniui +} + +cmake_configure() { + cmake -S. -B"$BUILD_DIR" \ + "-DTARGET_PLATFORM=miyoo_mini" \ + -DCMAKE_C_COMPILER=arm-linux-gnueabihf-gcc \ + -DCMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ \ + -DBUILD_TESTING=OFF \ + -DCMAKE_FIND_ROOT_PATH="/opt/miyoomini-toolchain/arm-linux-gnueabihf/sysroot" \ + "$@" +} + +cmake_build() { + cmake --build "$BUILD_DIR" +} + +build_custom_sdl() { + # make clean folder for custom SDL build + rm -rf $BUILD_DIR/CustomSDL + mkdir $BUILD_DIR/CustomSDL + + # clone the repo and build the lib + cd $BUILD_DIR/CustomSDL + git clone $MIYOO_CUSTOM_SDL_REPO --branch $MIYOO_CUSTOM_SDL_BRANCH --single-branch . + ./make.sh + + # change back to devilutionx root + cd "$PACKAGING_DIR/../.." + cp -rfL "$BUILD_DIR/CustomSDL/build/.libs/libSDL-1.2.so.0" "$BUILD_DIR/OnionOS/Emu/PORTS/Binaries/Diablo.port/lib/libSDL-1.2.so.0" +} + +prepare_onion_skeleton() { + mkdir -p $BUILD_DIR/OnionOS + + # Copy basic skeleton + cp -rf Packaging/miyoo_mini/skeleton_OnionOS/* $BUILD_DIR/OnionOS + + # ensure devilutionx asset dir + mkdir -p $BUILD_DIR/OnionOS/Emu/PORTS/Binaries/Diablo.port/assets + + # ensure lib dir for custom SDL + mkdir -p $BUILD_DIR/OnionOS/Emu/PORTS/Binaries/Diablo.port/lib + + # ensure config dir + mkdir -p $BUILD_DIR/OnionOS/Saves/CurrentProfile/config/DevilutionX + + # ensure save dir + mkdir -p $BUILD_DIR/OnionOS/Saves/CurrentProfile/saves/DevilutionX +} + +package_onion() { + prepare_onion_skeleton + build_custom_sdl + # copy assets + cp -rf $BUILD_DIR/assets/* $BUILD_DIR/OnionOS/Emu/PORTS/Binaries/Diablo.port/assets + # copy executable + cp -f $BUILD_DIR/devilutionx $BUILD_DIR/OnionOS/Emu/PORTS/Binaries/Diablo.port/devilutionx + + rm -f $BUILD_DIR/onion.zip + + cd $BUILD_DIR/OnionOS + zip -r ../devilutionx-onion-os.zip . + cd "$PACKAGING_DIR/../.." +} + +prepare_miniui_skeleton() { + mkdir -p $BUILD_DIR/MiniUI + + # copy basic skeleton + cp -rf Packaging/miyoo_mini/skeleton_MiniUI/* $BUILD_DIR/MiniUI + + # ensure devilutionx asset dir + mkdir -p $BUILD_DIR/MiniUI/Diablo/assets +} + +package_miniui() { + prepare_miniui_skeleton + # copy assets + cp -rf $BUILD_DIR/assets/* $BUILD_DIR/MiniUI/Diablo/assets + # copy executable + cp -f $BUILD_DIR/devilutionx $BUILD_DIR/MiniUI/Diablo/devilutionx + + rm -f $BUILD_DIR/miniui.zip + + cd $BUILD_DIR/MiniUI + zip -r ../devilutionx-miniui.zip . + cd "$PACKAGING_DIR/../.." +} + +main diff --git a/Packaging/miyoo_mini/setup_toolchain.sh b/Packaging/miyoo_mini/setup_toolchain.sh new file mode 100755 index 000000000..40905d404 --- /dev/null +++ b/Packaging/miyoo_mini/setup_toolchain.sh @@ -0,0 +1,49 @@ +#!/bin/sh + +main() { + install_dependencies + install_toolchain +} + +install_toolchain() { + TOOLCHAIN_VERSION=v0.0.2 + TOOLCHAIN_TAR="miyoomini-toolchain.tar.xz" + + TOOLCHAIN_ARCH=`uname -m` + if [ "$TOOLCHAIN_ARCH" = "aarch64" ]; then + TOOLCHAIN_REPO=miyoomini-toolchain-buildroot-aarch64 + else + TOOLCHAIN_REPO=miyoomini-toolchain-buildroot + fi + + TOOLCHAIN_URL="https://github.com/shauninman/$TOOLCHAIN_REPO/releases/download/$TOOLCHAIN_VERSION/$TOOLCHAIN_TAR" + + cd /opt + wget "$TOOLCHAIN_URL" + echo "extracting remote toolchain $TOOLCHAIN_VERSION ($TOOLCHAIN_ARCH)" + + tar xf "./$TOOLCHAIN_TAR" + rm -rf "./$TOOLCHAIN_TAR" +} + +install_dependencies() { + apt-get -y update && apt-get -y install \ + bc \ + build-essential \ + bzip2 \ + bzr \ + cmake \ + cmake-curses-gui \ + cpio \ + git \ + libncurses5-dev \ + make \ + rsync \ + scons \ + tree \ + unzip \ + wget \ + zip +} + +main diff --git a/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/Diablo.m3u b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/Diablo.m3u new file mode 100644 index 000000000..81669ea1c --- /dev/null +++ b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/Diablo.m3u @@ -0,0 +1 @@ +launch.sh \ No newline at end of file diff --git a/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/launch.sh b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/launch.sh new file mode 100644 index 000000000..a65e21faa --- /dev/null +++ b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/launch.sh @@ -0,0 +1,12 @@ +#!/bin/sh + +cd "$(dirname "$0")" +HOME="$USERDATA_PATH" + +if [ -f "DIABDAT.MPQ" ] || [ -f "spawn.mpq" ]; then + ./devilutionx +else + show "okay.png" + say "Missing DIABDAT.MPQ!"$'\n\n'"Please see readme.txt"$'\n'"in the Diablo folder"$'\n'"on your SD card."$'\n' + confirm only +fi diff --git a/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/readme.txt b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/readme.txt new file mode 100644 index 000000000..64a2e8a28 --- /dev/null +++ b/Packaging/miyoo_mini/skeleton_MiniUI/Diablo/readme.txt @@ -0,0 +1,37 @@ +devilutionx(Diablo port) for MiniUI +==================================== + +Installation +-------- +- Copy this folder onto your SD card in the location /Roms/Native Games (SH)/ + +For the full game: + - Get the DIABDAT.MPQ from either the CD or GOG release (https://github.com/diasurgical/devilutionX/wiki/Extracting-the-.MPQs-from-the-GoG-installer) + - Copy the DIABDAT.MPQ into this folder + - Optional: If you want to also play the Hellfire expansion, copy hellfire.mpq, hfmonk.mpq, hfmusic.mpq, hfvoice.mpq into this fodler aswell + +For the free shareware version: + - Get the spawn.mpq (https://github.com/diasurgical/devilutionx-assets/releases/download/v2/spawn.mpq) + - Copy the spawn.mpq into this folder + +Controls +-------- +- D-Pad: move +- A: Attack nearest enemy, talk to NPC, pickup/place in inventory, OK in menus +- B: select spell, back in menus +- X: pickup items, open chests and doors, use item in inventory +- Y: cast spell, delete character in main menu +- L: use health item from belt +- R: use mana potion from belt +- Start: game menu (alt: L2 + Up) +- Select: toggle automap (alt: Start + Down) + +- L2 show quick acess overlay +- L2 + Up: game menu +- L2 + Down: toggle automap +- L2 + Left: character sheet +- L2 + Right: inventory +- L2 + Y: quest log +- L2 + B: spell book +- R2 + D-Pad: simulate mouse +- R2 + A;B;X;Y: spell hotkeys diff --git a/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/Binaries/Diablo.port/launch.sh b/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/Binaries/Diablo.port/launch.sh new file mode 100644 index 000000000..9741b1d69 --- /dev/null +++ b/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/Binaries/Diablo.port/launch.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +progdir=`cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P` +savedir="/mnt/SDCARD/Saves/CurrentProfile/saves/DevilutionX" +configdir="/mnt/SDCARD/Saves/CurrentProfile/config/DevilutionX" + +cd $progdir + +if [ -f "./FILES_HERE/DIABDAT.MPQ" ] || [ -f "./FILES_HERE/spawn.mpq" ]; then + # Timer initialisation + cd /mnt/SDCARD/App/PlayActivity + ./playActivity "init" + + export LD_LIBRARY_PATH="$progdir/lib:$LD_LIBRARY_PATH" + SDL_HIDE_BATTERY=1 $progdir/devilutionx --data-dir $progdir/FILES_HERE --save-dir $savedir --config-dir $configdir + + # Timer registration + cd /mnt/SDCARD/App/PlayActivity + ./playActivity "Diablo" +else + cd "/mnt/SDCARD/Emu/PORTS/Binaries/missingFile" + ./infoPanel +fi diff --git a/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Diablo.port b/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Diablo.port new file mode 100644 index 000000000..e69de29bb diff --git a/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Imgs/Diablo.png b/Packaging/miyoo_mini/skeleton_OnionOS/Emu/PORTS/PORTS/Imgs/Diablo.png new file mode 100644 index 0000000000000000000000000000000000000000..027f298b3c9ad1909dbcc41798342111cc9eb64d GIT binary patch literal 32709 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 Q!2kdN07*qoM6N<$f`(KZ%>V!Z literal 0 HcmV?d00001 diff --git a/Packaging/miyoo_mini/skeleton_OnionOS/readme.txt b/Packaging/miyoo_mini/skeleton_OnionOS/readme.txt new file mode 100644 index 000000000..d3a65c85f --- /dev/null +++ b/Packaging/miyoo_mini/skeleton_OnionOS/readme.txt @@ -0,0 +1,38 @@ +devilutionx(Diablo port) for OnionOS +==================================== + +Installation +-------- +- Activate the Ports Collection inside the Onion Installer on your device +- Copy everything from this archive to the root of your sd card + +For the full game: + - Get the DIABDAT.MPQ from either the CD or GOG release (https://github.com/diasurgical/devilutionX/wiki/Extracting-the-.MPQs-from-the-GoG-installer) + - Copy the DIABDAT.MPQ into Emu/PORTS/Binaries/Diablo.port/FILES_HERE + - Optional: If you want to also play the Hellfire expansion, copy hellfire.mpq, hfmonk.mpq, hfmusic.mpq, hfvoice.mpq into the same folder + +For the free shareware version: + - Get the spawn.mpq (https://github.com/diasurgical/devilutionx-assets/releases/download/v2/spawn.mpq) + - Copy the spawn.mpq into Emu/PORTS/Binaries/Diablo.port/FILES_HERE + +Controls +-------- +- D-Pad: move +- A: Attack nearest enemy, talk to NPC, pickup/place in inventory, OK in menus +- B: select spell, back in menus +- X: pickup items, open chests and doors, use item in inventory +- Y: cast spell, delete character in main menu +- L: use health item from belt +- R: use mana potion from belt +- Start: game menu (alt: L2 + Up) +- Select: toggle automap (alt: Start + Down) + +- L2 show quick acess overlay +- L2 + Up: game menu +- L2 + Down: toggle automap +- L2 + Left: character sheet +- L2 + Right: inventory +- L2 + Y: quest log +- L2 + B: spell book +- R2 + D-Pad: simulate mouse +- R2 + A;B;X;Y: spell hotkeys diff --git a/Packaging/miyoo_mini/toolchain_env.sh b/Packaging/miyoo_mini/toolchain_env.sh new file mode 100755 index 000000000..4f9a9a82a --- /dev/null +++ b/Packaging/miyoo_mini/toolchain_env.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +export PATH="/opt/miyoomini-toolchain/usr/bin:${PATH}:/opt/miyoomini-toolchain/usr/arm-linux-gnueabihf/sysroot/bin" +export CROSS_COMPILE=/opt/miyoomini-toolchain/usr/bin/arm-linux-gnueabihf- +export PREFIX=/opt/miyoomini-toolchain/usr/arm-linux-gnueabihf/sysroot/usr +export UNION_PLATFORM=miyoomini diff --git a/docs/building.md b/docs/building.md index 3998fddde..675b39e57 100644 --- a/docs/building.md +++ b/docs/building.md @@ -476,6 +476,13 @@ Packaging/xbox-one/build.bat [Xbox One/Series manual](manual/platforms/xbox-one.md) +

Miyoo Mini + +Building for Miyoo Mini must be run from inside the [Toolchain Docker image](https://github.com/MiyooMini/union-toolchain). +Executing `Packaging/miyoo_mini/build.sh` will create the folder `build-miyoo-mini/SDROOT` which has the correct structure to be used with +OnionOS Port Collection. +
+
CMake build options ### General diff --git a/docs/installing.md b/docs/installing.md index 1a9c9dc7a..f6aad9e83 100644 --- a/docs/installing.md +++ b/docs/installing.md @@ -202,3 +202,12 @@ If you'd like to use this option, scan the QR code below. ~~~
+ +
Miyoo Mini + +**Requires OnionOS to be installed** + +- Activate the ports collection by using the onion installer on the device +- Copy the contents of the released .zip-file onto the root of your SD card +- Copy the MPQ files to `/Emu/PORTS/Binaries/Diablo.port/FILES_HERE/` +