diff --git a/Ports/AvailablePorts.md b/Ports/AvailablePorts.md index a7860bf065..e133ccff8d 100644 --- a/Ports/AvailablePorts.md +++ b/Ports/AvailablePorts.md @@ -75,6 +75,7 @@ This list is also available at [ports.serenityos.net](https://ports.serenityos.n | [`gawk`](gawk/) | GNU awk | 5.2.1 | https://www.gnu.org/software/gawk/ | | [`gcc`](gcc/) | GNU Compiler Collection | 12.2.0 | https://gcc.gnu.org/ | | [`gdb`](gdb/) | GNU Project Debugger | 11.2 | https://sourceware.org/gdb | +| [`gemrb`](gemrb/) | GemRB | 0.9.1 | https://gemrb.org/ | | [`genemu`](genemu/) | Genesis / MegaDrive Emulator | e39f690 | https://github.com/rasky/genemu | | [`genext2fs`](genext2fs/) | genext2fs | 1.5.0 | https://github.com/bestouff/genext2fs | | [`gettext`](gettext/) | GNU gettext | 0.21 | https://www.gnu.org/software/gettext/ | diff --git a/Ports/gemrb/package.sh b/Ports/gemrb/package.sh new file mode 100755 index 0000000000..ca00b25b17 --- /dev/null +++ b/Ports/gemrb/package.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env -S bash ../.port_include.sh +port='gemrb' +version='0.9.1' +useconfigure='true' +files="https://github.com/gemrb/gemrb/archive/refs/tags/v${version}.tar.gz gemrb-${version}.tar.gz 6e5dbcf7398d5566751f434b0d4647196bfbe9a813e3b65ad6a4ee2f1bbfb9ba" +auth_type='sha256' +depends=( + 'freetype' + 'libiconv' + 'python3' + 'SDL2' + 'SDL2_mixer' + 'zlib' +) +configopts=( + "-DCMAKE_TOOLCHAIN_FILE=${SERENITY_BUILD_DIR}/CMakeToolchain.txt" + "-DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local/" + '-DCMAKE_BUILD_TYPE=Release' + '-DDISABLE_WERROR=1' + '-DSTATIC_LINK=ON' + '-DSDL_BACKEND=SDL2' +) +icon_file='artwork/gemrb-logo.ico' +launcher_name='GemRB' +launcher_category='Games' +launcher_command='/usr/local/bin/gemrb' + +configure() { + mkdir -p "${PORT_BUILD_DIR}/gemrb-${version}-build" + cd "${PORT_BUILD_DIR}/gemrb-${version}-build" + cmake -G Ninja "${configopts[@]}" "${PORT_BUILD_DIR}/gemrb-${version}" +} + +build() { + ninja -C "${PORT_BUILD_DIR}/gemrb-${version}-build" +} + +install() { + ninja -C "${PORT_BUILD_DIR}/gemrb-${version}-build" install +} diff --git a/Ports/gemrb/patches/0001-Hard-code-some-paths-for-runtime-purposes.patch b/Ports/gemrb/patches/0001-Hard-code-some-paths-for-runtime-purposes.patch new file mode 100644 index 0000000000..dd704695c1 --- /dev/null +++ b/Ports/gemrb/patches/0001-Hard-code-some-paths-for-runtime-purposes.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= +Date: Sat, 11 Feb 2023 00:05:55 +0100 +Subject: [PATCH] Hard-code some paths for runtime purposes + +GemRB uses the paths where its libraries and data are copied to during +installation at runtime by generating a header. This does not work for +us, as our paths change from compilation to runtime. The easiest fix for +this is to hard-code these paths in the header file. +--- + cmake/cmake_config.h.in | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/cmake/cmake_config.h.in b/cmake/cmake_config.h.in +index 17584b33da6e9cc610d8be7d1a4f28b8b587844a..02a6214f4215723eb4c90b65f67aea6d508be193 100644 +--- a/cmake/cmake_config.h.in ++++ b/cmake/cmake_config.h.in +@@ -10,9 +10,9 @@ + #cmakedefine HAVE_MEMALIGN 1 + #cmakedefine HAVE_ALIGNED_MALLOC 1 + #cmakedefine HAVE_POSIX_MEMALIGN 1 +-#cmakedefine PLUGIN_DIR "${PLUGIN_DIR}" +-#cmakedefine DATA_DIR "${DATA_DIR}" +-#cmakedefine SYSCONF_DIR "${SYSCONF_DIR}" ++#cmakedefine PLUGIN_DIR "/usr/local/lib/gemrb/plugins/" ++#cmakedefine DATA_DIR "/usr/local/share/gemrb/" ++#cmakedefine SYSCONF_DIR "/usr/local/etc/gemrb/" + #cmakedefine NO_COLOR ${NOCOLOR} + #cmakedefine OPENGL_BACKEND ${OPENGL_BACKEND} + #cmakedefine NOFPSLIMIT ${NOFPSLIMIT} diff --git a/Ports/gemrb/patches/0002-Create-SDL2-renderer-as-unaccelerated.patch b/Ports/gemrb/patches/0002-Create-SDL2-renderer-as-unaccelerated.patch new file mode 100644 index 0000000000..bf97a04f71 --- /dev/null +++ b/Ports/gemrb/patches/0002-Create-SDL2-renderer-as-unaccelerated.patch @@ -0,0 +1,22 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= +Date: Sat, 11 Feb 2023 00:34:13 +0100 +Subject: [PATCH] Create SDL2 renderer as unaccelerated + +--- + gemrb/plugins/SDLVideo/SDL20Video.cpp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gemrb/plugins/SDLVideo/SDL20Video.cpp b/gemrb/plugins/SDLVideo/SDL20Video.cpp +index 36dc17caffc89bed2610d26d19e97290905bcf20..158ee2fe5eb1b396c1a63b1e7bc898bd1ae224fc 100644 +--- a/gemrb/plugins/SDLVideo/SDL20Video.cpp ++++ b/gemrb/plugins/SDLVideo/SDL20Video.cpp +@@ -139,7 +139,7 @@ int SDL20VideoDriver::CreateSDLDisplay(const char* title) + SetWindowIcon(window); + #endif + +- renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_ACCELERATED); ++ renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE); + SDL_RendererInfo info; + SDL_GetRendererInfo(renderer, &info); + Log(DEBUG, "SDL20Video", "Renderer: {}", info.name); diff --git a/Ports/gemrb/patches/0003-Get-rid-of-swscanf-usage.patch b/Ports/gemrb/patches/0003-Get-rid-of-swscanf-usage.patch new file mode 100644 index 0000000000..c4bb2cc91b --- /dev/null +++ b/Ports/gemrb/patches/0003-Get-rid-of-swscanf-usage.patch @@ -0,0 +1,35 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= +Date: Sat, 11 Feb 2023 00:52:51 +0100 +Subject: [PATCH] Get rid of swscanf() usage + +This function is currently not implemented in our LibC. +--- + gemrb/core/GUI/TextSystem/GemMarkup.cpp | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/gemrb/core/GUI/TextSystem/GemMarkup.cpp b/gemrb/core/GUI/TextSystem/GemMarkup.cpp +index f0f604ccb0c3d37098976f0e05371fb4a1988a67..2741aa6cd6b27961ac9bcd11992cb6cef4fa2a9f 100644 +--- a/gemrb/core/GUI/TextSystem/GemMarkup.cpp ++++ b/gemrb/core/GUI/TextSystem/GemMarkup.cpp +@@ -25,7 +25,19 @@ namespace GemRB { + static Color ParseColor(const String& colorString) + { + Color color = ColorWhite; +- swscanf(colorString.c_str(), L"%02hhx%02hhx%02hhx%02hhx", &color.r, &color.g, &color.b, &color.a); ++ ++ auto h2i = [](wchar_t c) -> int { ++ if (c >= '0' && c <= '9') return c - '0'; ++ else if (c >= 'a' && c <='f') return c - 'a' + 10; ++ else if (c >= 'A' && c <='F') return c - 'A' + 10; ++ return 0; ++ }; ++ ++ color.r = (h2i(colorString[0]) << 4) | h2i(colorString[1]); ++ color.g = (h2i(colorString[2]) << 4) | h2i(colorString[3]); ++ color.b = (h2i(colorString[4]) << 4) | h2i(colorString[5]); ++ color.a = (h2i(colorString[6]) << 4) | h2i(colorString[7]); ++ + return color; + } + diff --git a/Ports/gemrb/patches/0004-Be-a-bit-more-lenient-with-matching-savegame-directo.patch b/Ports/gemrb/patches/0004-Be-a-bit-more-lenient-with-matching-savegame-directo.patch new file mode 100644 index 0000000000..2e2281ff49 --- /dev/null +++ b/Ports/gemrb/patches/0004-Be-a-bit-more-lenient-with-matching-savegame-directo.patch @@ -0,0 +1,25 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Julian=20Offenh=C3=A4user?= +Date: Sat, 11 Feb 2023 02:30:10 +0100 +Subject: [PATCH] Be a bit more lenient with matching savegame directories + +Our sscanf() implementation failed to match this case. Making it more +inclusive should be fine, since invalid savegame directories probably +won't contain the right files anyway. +--- + gemrb/core/SaveGameIterator.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gemrb/core/SaveGameIterator.h b/gemrb/core/SaveGameIterator.h +index 4d1550eddcd2f656205170131a04f570570430f9..e93b171123c68e41e607518e6c4ffc93e455f92d 100644 +--- a/gemrb/core/SaveGameIterator.h ++++ b/gemrb/core/SaveGameIterator.h +@@ -29,7 +29,7 @@ + + namespace GemRB { + +-#define SAVEGAME_DIRECTORY_MATCHER "%d - %[A-Za-z0-9- _+*#%&|()=!?':;]" ++#define SAVEGAME_DIRECTORY_MATCHER "%d - %s" + + class GEM_EXPORT SaveGameIterator { + private: diff --git a/Ports/gemrb/patches/ReadMe.md b/Ports/gemrb/patches/ReadMe.md new file mode 100644 index 0000000000..6a00608ef1 --- /dev/null +++ b/Ports/gemrb/patches/ReadMe.md @@ -0,0 +1,30 @@ +# Patches for gemrb on SerenityOS + +## `0001-Hard-code-some-paths-for-runtime-purposes.patch` + +Hard-code some paths for runtime purposes + +GemRB uses the paths where its libraries and data are copied to during +installation at runtime by generating a header. This does not work for +us, as our paths change from compilation to runtime. The easiest fix for +this is to hard-code these paths in the header file. + +## `0002-Create-SDL2-renderer-as-unaccelerated.patch` + +Create SDL2 renderer as unaccelerated + + +## `0003-Get-rid-of-swscanf-usage.patch` + +Get rid of swscanf() usage + +This function is currently not implemented in our LibC. + +## `0004-Be-a-bit-more-lenient-with-matching-savegame-directo.patch` + +Be a bit more lenient with matching savegame directories + +Our sscanf() implementation failed to match this case. Making it more +inclusive should be fine, since invalid savegame directories probably +won't contain the right files anyway. +