From 05ff59cff263f70a4a0829ffab3c4940defc03aa Mon Sep 17 00:00:00 2001 From: Adrian Graber Date: Thu, 27 Oct 2022 21:56:45 +0200 Subject: [PATCH] Add Nintendo Switch support - Bundle resources folder through romfs - Added Switch-exclusive romfs init/exit code - Add icon for NRO - Add Switch-exclusive CMake code for NACP/NRO generation - Add GitHub Actions Switch workflow --- .github/workflows/switch.yml | 27 +++++++++++++++++++++++++++ src/CMakeLists.txt | 16 ++++++++++++++++ src/sdlmain.cpp | 10 ++++++++++ switch/icon.jpg | Bin 0 -> 24120 bytes 4 files changed, 53 insertions(+) create mode 100644 .github/workflows/switch.yml create mode 100644 switch/icon.jpg diff --git a/.github/workflows/switch.yml b/.github/workflows/switch.yml new file mode 100644 index 0000000..abf3293 --- /dev/null +++ b/.github/workflows/switch.yml @@ -0,0 +1,27 @@ +name: Nintendo Switch Build +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + container: devkitpro/devkita64:latest + + steps: + - uses: actions/checkout@v2 + with: + submodules: true + + - name: Build + run: | + mkdir -p out/switch + cd out/switch + /opt/devkitpro/portlibs/switch/bin/aarch64-none-elf-cmake -DCMAKE_BUILD_TYPE=Release ../../src/ + make + mkdir system3 + mv system3.* system3/ + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: system3-switch + path: out/switch/system3 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 53bf2b3..d104677 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -178,6 +178,22 @@ target_sources(system3 PRIVATE sys/nact_sys3.cpp ) +if(NINTENDO_SWITCH) + set(RESOURCE_PATH romfs:/) + + nx_generate_nacp(system3.nacp + NAME "system3" + AUTHOR "kichikuou" + VERSION "0.8.0" + ) + + nx_create_nro(system3 + NACP system3.nacp + ICON "../switch/icon.jpg" + ROMFS "../resources" + ) +endif() + target_compile_definitions(system3 PRIVATE $<$:_DEBUG_CONSOLE> RESOURCE_PATH="${RESOURCE_PATH}") diff --git a/src/sdlmain.cpp b/src/sdlmain.cpp index 912fc13..1ae4498 100644 --- a/src/sdlmain.cpp +++ b/src/sdlmain.cpp @@ -13,6 +13,9 @@ #include #include #endif +#ifdef __SWITCH__ +#include +#endif SDL_Window* g_window; SDL_Renderer* g_renderer; @@ -20,6 +23,9 @@ NACT* g_nact; int main(int argc, char *argv[]) { +#ifdef __SWITCH__ + romfsInit(); +#endif Config config(argc, argv); if (!config.timidity_cfg.empty()) { @@ -94,6 +100,10 @@ int main(int argc, char *argv[]) SDL_DestroyWindow(g_window); SDL_Quit(); +#ifdef __SWITCH__ + romfsExit(); +#endif + return 0; } diff --git a/switch/icon.jpg b/switch/icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..09a4cd8724bfc46632137b0d3880970e520ea2ae GIT binary patch literal 24120 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 b|9M#PF97lDxA1r3?q5aQ-)OP;pJV?8>B3|x literal 0 HcmV?d00001