From 51315c0b1d92985aa90acb42ead6e504a1ae3d03 Mon Sep 17 00:00:00 2001 From: Grigoris Pavlakis Date: Thu, 9 Jun 2022 01:48:13 +0300 Subject: [PATCH] Ports: Add VVVVVV port Co-Authored-By: Tim Schumacher (thanks for the line ending and assert() troubleshooting) --- Ports/AvailablePorts.md | 1 + Ports/VVVVVV/package.sh | 30 +++++++++ .../0001-Change-C-standard-to-C99.patch | 25 ++++++++ ...enityOS-in-platform-specific-defines.patch | 54 ++++++++++++++++ ...und-system-initialization-until-main.patch | 62 +++++++++++++++++++ Ports/VVVVVV/patches/ReadMe.md | 32 ++++++++++ 6 files changed, 204 insertions(+) create mode 100755 Ports/VVVVVV/package.sh create mode 100644 Ports/VVVVVV/patches/0001-Change-C-standard-to-C99.patch create mode 100644 Ports/VVVVVV/patches/0002-Add-SerenityOS-in-platform-specific-defines.patch create mode 100644 Ports/VVVVVV/patches/0003-Defer-sound-system-initialization-until-main.patch create mode 100644 Ports/VVVVVV/patches/ReadMe.md diff --git a/Ports/AvailablePorts.md b/Ports/AvailablePorts.md index 78e468db764..f7dbfdafa64 100644 --- a/Ports/AvailablePorts.md +++ b/Ports/AvailablePorts.md @@ -229,6 +229,7 @@ This list is also available at [ports.serenityos.net](https://ports.serenityos.n | [`vitetris`](vitetris/) | vitetris | 0.59.1 | https://github.com/vicgeralds/vitetris | | [`vlang`](vlang/) | V programming language | weekly.2021.31 | https://github.com/vlang/v | | [`vttest`](vttest/) | vttest | 20220215 | https://invisible-island.net/vttest/ | +| [`VVVVVV`](VVVVVV/) | Terry Cavanagh's VVVVVV | 2.3.6 | https://github.com/TerryCavanagh/VVVVVV/ | | [`wget`](wget/) | GNU Wget | 1.21.3 | https://www.gnu.org/software/wget/ | | [`wireguard-tools`](wireguard-tools/) | WireGuard Tools | 1.0.20210914 | https://www.wireguard.com/ | | [`x264`](x264/) | x264 | baee400 | https://www.videolan.org/developers/x264.html | diff --git a/Ports/VVVVVV/package.sh b/Ports/VVVVVV/package.sh new file mode 100755 index 00000000000..8e5004f6845 --- /dev/null +++ b/Ports/VVVVVV/package.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env -S bash ../.port_include.sh +port='VVVVVV' +version='2.3.6' +useconfigure='true' +auth_type='sha256' +files="https://github.com/TerryCavanagh/VVVVVV/archive/refs/tags/${version}.tar.gz VVVVVV-${version}.tar.gz a3366aab9e8462d330044ab1ec63927e9f5c3801c0ed96b24f08c553dcb911e9" +configopts=( + "-DCMAKE_TOOLCHAIN_FILE=${SERENITY_BUILD_DIR}/CMakeToolchain.txt" + "-DCMAKE_BUILD_TYPE=Release" + "-Sdesktop_version" +) +depends=("SDL2" "SDL2_mixer") +icon_file='desktop_version/icon.ico' +launcher_name='VVVVVV' +launcher_category='Games' +launcher_command='/opt/VVVVVV/VVVVVV' + +configure() { + run cmake "${configopts[@]}" +} + +install() { + run mkdir -p "${SERENITY_INSTALL_ROOT}/opt/VVVVVV" + run cp VVVVVV "${SERENITY_INSTALL_ROOT}/opt/VVVVVV" + echo -e "\033[0;34m=====================================================================\033[0m" + echo -e "\033[1;31mNOTE: \033[0mVVVVVV needs the assets from the original game to work." + echo -e "Place the \033[1;33mdata.zip\033[0m file from the Make and Play edition AS IS" + echo -e "under \033[1;32m${SERENITY_INSTALL_ROOT}/opt/VVVVVV\033[0m." + echo -e "\033[0;34m=====================================================================\033[0m" +} diff --git a/Ports/VVVVVV/patches/0001-Change-C-standard-to-C99.patch b/Ports/VVVVVV/patches/0001-Change-C-standard-to-C99.patch new file mode 100644 index 00000000000..4a933b6b5c7 --- /dev/null +++ b/Ports/VVVVVV/patches/0001-Change-C-standard-to-C99.patch @@ -0,0 +1,25 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Grigoris Pavlakis +Date: Thu, 9 Jun 2022 00:19:08 +0300 +Subject: [PATCH] Change C standard to C99 + +The originally-set C90 doesn't support the `inline` keyword, causing +weird compile errors because isalnum() and other functions under +ctype.h are actually #define'd as inline. +--- + desktop_version/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/desktop_version/CMakeLists.txt b/desktop_version/CMakeLists.txt +index 7405c12..49d44bb 100644 +--- a/desktop_version/CMakeLists.txt ++++ b/desktop_version/CMakeLists.txt +@@ -27,7 +27,7 @@ endif() + if(${CMAKE_VERSION} VERSION_LESS "3.1.3") + message(WARNING "Your CMake version is too old; set -std=c90 -std=c++98 yourself!") + else() +- set(CMAKE_C_STANDARD 90) ++ set(CMAKE_C_STANDARD 99) + set(CMAKE_C_EXTENSIONS OFF) + + set(CMAKE_CXX_STANDARD 98) diff --git a/Ports/VVVVVV/patches/0002-Add-SerenityOS-in-platform-specific-defines.patch b/Ports/VVVVVV/patches/0002-Add-SerenityOS-in-platform-specific-defines.patch new file mode 100644 index 00000000000..acb93eec7d5 --- /dev/null +++ b/Ports/VVVVVV/patches/0002-Add-SerenityOS-in-platform-specific-defines.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Grigoris Pavlakis +Date: Fri, 17 Jun 2022 19:26:30 +0300 +Subject: [PATCH] Add SerenityOS in platform-specific defines + +--- + desktop_version/src/FileSystemUtils.cpp | 6 +++--- + third_party/tinyxml2/tinyxml2.cpp | 2 +- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/desktop_version/src/FileSystemUtils.cpp b/desktop_version/src/FileSystemUtils.cpp +index 833a3de..22372f2 100644 +--- a/desktop_version/src/FileSystemUtils.cpp ++++ b/desktop_version/src/FileSystemUtils.cpp +@@ -26,7 +26,7 @@ int mkdir(char* path, int mode) + return CreateDirectoryW(utf16_path, NULL); + } + #define VNEEDS_MIGRATION (mkdirResult != 0) +-#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) ++#elif defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) || defined (__serenity__) + #include + #include + #include +@@ -1005,7 +1005,7 @@ static void PLATFORM_migrateSaveData(char* output) + char oldLocation[MAX_PATH]; + char newLocation[MAX_PATH]; + char oldDirectory[MAX_PATH]; +-#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) ++#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) || defined (__serenity__) + DIR *dir = NULL; + struct dirent *de = NULL; + DIR *subDir = NULL; +@@ -1018,7 +1018,7 @@ static void PLATFORM_migrateSaveData(char* output) + return; + } + const char oldPath[] = +- #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) ++ #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__HAIKU__) || defined(__DragonFly__) || defined (__serenity__) + "/.vvvvvv/"; + #elif defined(__APPLE__) + "/Documents/VVVVVV/"; +diff --git a/third_party/tinyxml2/tinyxml2.cpp b/third_party/tinyxml2/tinyxml2.cpp +index 1606ce0..d78c6ba 100644 +--- a/third_party/tinyxml2/tinyxml2.cpp ++++ b/third_party/tinyxml2/tinyxml2.cpp +@@ -103,7 +103,7 @@ distribution. + #if defined(_WIN64) + #define TIXML_FSEEK _fseeki64 + #define TIXML_FTELL _ftelli64 +-#elif defined(__APPLE__) || (__FreeBSD__) || (__OpenBSD__) ++#elif defined(__APPLE__) || (__FreeBSD__) || (__OpenBSD__) || (__serenity__) + #define TIXML_FSEEK fseeko + #define TIXML_FTELL ftello + #elif defined(__unix__) && defined(__x86_64__) diff --git a/Ports/VVVVVV/patches/0003-Defer-sound-system-initialization-until-main.patch b/Ports/VVVVVV/patches/0003-Defer-sound-system-initialization-until-main.patch new file mode 100644 index 00000000000..26560ea8b74 --- /dev/null +++ b/Ports/VVVVVV/patches/0003-Defer-sound-system-initialization-until-main.patch @@ -0,0 +1,62 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Grigoris Pavlakis +Date: Fri, 17 Jun 2022 19:29:00 +0300 +Subject: [PATCH] Defer sound system initialization until main() + +The original VVVVVV source code initializes the sound subsystem +during global variable initialization. Technically speaking, the +order of initialization of global variables is unspecified. This +results in SerenityOS's dynamic linker to call Mix_OpenAudio() +(which uses EventLoop under the hood) before all global variable +initializers finish executing, resulting in an inconsistent state +that causes assertion failure. + +This patch moves initialization of the culprit sound system to +a separate method, which is called first thing inside main(), thus +preventing the setup from happening during musicclass's initialization +in the global scope, which causes the aforementioned crash. +--- + desktop_version/src/SoundSystem.cpp | 4 ++++ + desktop_version/src/SoundSystem.h | 1 + + desktop_version/src/main.cpp | 1 + + 3 files changed, 6 insertions(+) + +diff --git a/desktop_version/src/SoundSystem.cpp b/desktop_version/src/SoundSystem.cpp +index 8c5f962..056d946 100644 +--- a/desktop_version/src/SoundSystem.cpp ++++ b/desktop_version/src/SoundSystem.cpp +@@ -52,6 +52,10 @@ SoundTrack::SoundTrack(const char* fileName) + } + + SoundSystem::SoundSystem(void) ++{ ++} ++ ++void SoundSystem::initialize(void) + { + int audio_rate = 44100; + Uint16 audio_format = AUDIO_S16SYS; +diff --git a/desktop_version/src/SoundSystem.h b/desktop_version/src/SoundSystem.h +index 0cf3b84..f88e15b 100644 +--- a/desktop_version/src/SoundSystem.h ++++ b/desktop_version/src/SoundSystem.h +@@ -23,6 +23,7 @@ class SoundSystem + { + public: + SoundSystem(void); ++ void initialize(void); + }; + + #endif /* SOUNDSYSTEM_H */ +diff --git a/desktop_version/src/main.cpp b/desktop_version/src/main.cpp +index b97270f..49bd853 100644 +--- a/desktop_version/src/main.cpp ++++ b/desktop_version/src/main.cpp +@@ -341,6 +341,7 @@ static void cleanup(void); + + int main(int argc, char *argv[]) + { ++ music.soundSystem.initialize(); + char* baseDir = NULL; + char* assetsPath = NULL; + diff --git a/Ports/VVVVVV/patches/ReadMe.md b/Ports/VVVVVV/patches/ReadMe.md new file mode 100644 index 00000000000..9375fb14da4 --- /dev/null +++ b/Ports/VVVVVV/patches/ReadMe.md @@ -0,0 +1,32 @@ +# Patches for VVVVVV on SerenityOS + +## `0001-Change-C-standard-to-C99.patch` + +Change C standard to C99 + +The originally-set C90 doesn't support the `inline` keyword, causing +weird compile errors because isalnum() and other functions under +ctype.h are actually #define'd as inline. + +## `0002-Add-SerenityOS-in-platform-specific-defines.patch` + +Add SerenityOS in platform-specific defines + + +## `0003-Defer-sound-system-initialization-until-main.patch` + +Defer sound system initialization until main() + +The original VVVVVV source code initializes the sound subsystem +during global variable initialization. Technically speaking, the +order of initialization of global variables is unspecified. This +results in SerenityOS's dynamic linker to call Mix_OpenAudio() +(which uses EventLoop under the hood) before all global variable +initializers finish executing, resulting in an inconsistent state +that causes assertion failure. + +This patch moves initialization of the culprit sound system to +a separate method, which is called first thing inside main(), thus +preventing the setup from happening during musicclass's initialization +in the global scope, which causes the aforementioned crash. +