Ports: Add quake3 port :^)

This commit is contained in:
Jesse Buhagiar 2022-03-25 22:37:46 +11:00 committed by Andreas Kling
parent c08dfe063a
commit e2f1da8cec
11 changed files with 571 additions and 0 deletions

View file

@ -178,6 +178,7 @@ Please make sure to keep this list up to date when adding and updating ports. :^
| [`qt6-serenity`](qt6-serenity/) | QSerenityPlatform | | https://github.com/SerenityPorts/QSerenityPlatform |
| [`quake`](quake/) | Quake | 0.65 | https://github.com/SerenityOS/SerenityQuake |
| [`quake2`](quake2/) | QuakeII | 0.1 | https://github.com/SerenityOS/SerenityQuakeII |
| [`quake3`](quake3/) | QuakeIII | 1.34 | https://github.com/ioquake/ioq3 |
| [`r0`](r0/) | r0 (minimalistic commandline hexadecimal editor) | 0.8 | https://github.com/radareorg/r0 |
| [`vlang`](vlang/) | V programming language | weekly.2021.31 | https://github.com/vlang/v |
| [`radare2`](radare2/) | radare2 reverse engineering framework | 5.4.0-git | https://github.com/radareorg/radare2 |

34
Ports/quake3/package.sh Executable file
View file

@ -0,0 +1,34 @@
#!/usr/bin/env -S bash ../.port_include.sh
port=quake3
version=1.34
commit_hash=6d74896557d8c193a9f19bc6845a47e9d0f77db2
archive_hash=1db91cfd05170ed5b37c1ab56cdf7bbe6b3c86fc6baee8b68e8e539fddfd88c1
files="https://github.com/ioquake/ioq3/archive/$commit_hash.tar.gz ioq3.tar.gz $archive_hash"
auth_type=sha256
workdir="ioq3-${commit_hash}"
depends=("SDL2")
launcher_name="QuakeIII: Arena"
launcher_category="Games"
launcher_command=/usr/local/games/quake3/ioquake3
icon_file="misc/quake3.png"
install() {
run make COPYDIR=${SERENITY_INSTALL_ROOT}/usr/local/games/quake3/ copyfiles
}
post_install() {
# Let's create a more Serenity friendly `autoexec.cfg` file :^)
cat <<- 'EOF' > ${SERENITY_INSTALL_ROOT}/usr/local/games/quake3/baseq3/autoexec.cfg
set cl_renderer "opengl1"
set r_fullscreen "0"
set cg_drawfps "1"
EOF
echo ""
echo ""
echo "==== Post installation instructions ===="
echo "Please remember to install baseq3 from your Quake3 install"
echo "into /usr/local/games/quake3/"
echo "Don't forget to add the following to Base/etc/fstab/:"
echo "/usr/local/games/quake3 /usr/local/games/quake3 bind bind,nodev,nosuid,wxallowed"
}

View file

@ -0,0 +1,125 @@
From 7658f60b1a064ca08da8e71c4f44c4505df6f571 Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 09:39:21 +1100
Subject: [PATCH 1/8] Meta: Refactor Makefile to support Serenity
---
Makefile | 36 ++++++++++++++++--------------------
1 file changed, 16 insertions(+), 20 deletions(-)
diff --git a/Makefile b/Makefile
index 9e535559..b26ceb7f 100644
--- a/Makefile
+++ b/Makefile
@@ -3,8 +3,8 @@
#
# GNU Make required
#
-COMPILE_PLATFORM=$(shell uname | sed -e 's/_.*//' | tr '[:upper:]' '[:lower:]' | sed -e 's/\//_/g')
-COMPILE_ARCH=$(shell uname -m | sed -e 's/i.86/x86/' | sed -e 's/^arm.*/arm/')
+COMPILE_PLATFORM=serenity
+COMPILE_ARCH=${SERENITY_ARCH}
#arm64 hack!
ifeq ($(shell uname -m), arm64)
@@ -35,13 +35,13 @@ ifndef BUILD_GAME_QVM
BUILD_GAME_QVM =
endif
ifndef BUILD_BASEGAME
- BUILD_BASEGAME =
+ BUILD_BASEGAME =1
endif
ifndef BUILD_MISSIONPACK
- BUILD_MISSIONPACK=
+ BUILD_MISSIONPACK=0
endif
ifndef BUILD_RENDERER_OPENGL2
- BUILD_RENDERER_OPENGL2=
+ BUILD_RENDERER_OPENGL2=0
endif
ifndef BUILD_AUTOUPDATER # DON'T build unless you mean to!
BUILD_AUTOUPDATER=0
@@ -164,39 +164,39 @@ GENERATE_DEPENDENCIES=1
endif
ifndef USE_OPENAL
-USE_OPENAL=1
+USE_OPENAL=0
endif
ifndef USE_OPENAL_DLOPEN
-USE_OPENAL_DLOPEN=1
+USE_OPENAL_DLOPEN=0
endif
ifndef USE_CURL
-USE_CURL=1
+USE_CURL=0
endif
ifndef USE_CURL_DLOPEN
ifdef MINGW
USE_CURL_DLOPEN=0
else
- USE_CURL_DLOPEN=1
+ USE_CURL_DLOPEN=0
endif
endif
ifndef USE_CODEC_VORBIS
-USE_CODEC_VORBIS=1
+USE_CODEC_VORBIS=0
endif
ifndef USE_CODEC_OPUS
-USE_CODEC_OPUS=1
+USE_CODEC_OPUS=0
endif
ifndef USE_MUMBLE
-USE_MUMBLE=1
+USE_MUMBLE=0
endif
ifndef USE_VOIP
-USE_VOIP=1
+USE_VOIP=0
endif
ifndef USE_FREETYPE
@@ -505,10 +505,6 @@ ifeq ($(PLATFORM),darwin)
ifeq ($(CROSS_COMPILING),1)
# If CC is already set to something generic, we probably want to use
# something more specific
- ifneq ($(findstring $(strip $(CC)),cc gcc),)
- CC=
- endif
-
ifndef CC
ifndef DARWIN
# macOS 10.9 SDK
@@ -817,11 +813,10 @@ ifeq ($(PLATFORM),freebsd)
else # ifeq freebsd
#############################################################################
-# SETUP AND BUILD -- OPENBSD
+# SETUP AND BUILD -- SERENITY
#############################################################################
-ifeq ($(PLATFORM),openbsd)
-
+ifeq ($(PLATFORM),serenity)
BASE_CFLAGS = -Wall -fno-strict-aliasing -Wimplicit -Wstrict-prototypes \
-pipe -DUSE_ICON -DMAP_ANONYMOUS=MAP_ANON
CLIENT_CFLAGS += $(SDL_CFLAGS)
@@ -1000,6 +995,7 @@ ifeq ($(PLATFORM),sunos)
else # ifeq sunos
+
#############################################################################
# SETUP AND BUILD -- GENERIC
#############################################################################
--
2.35.1

View file

@ -0,0 +1,52 @@
From a5f5bd1db818a315cf7da0211a20718f7879791e Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 09:39:42 +1100
Subject: [PATCH 2/8] Engine: Add Serenity so `q_platform.h`
---
code/qcommon/q_platform.h | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/code/qcommon/q_platform.h b/code/qcommon/q_platform.h
index 72dbfe1d..3bd829d4 100644
--- a/code/qcommon/q_platform.h
+++ b/code/qcommon/q_platform.h
@@ -290,6 +290,35 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#endif
+//=================================================================== SERENITY ===
+
+#if defined(__serenity__)
+
+#include <sys/types.h>
+
+#ifndef __serenity__
+ #define __serenity__
+#endif
+
+#define Q3_LITTLE_ENDIAN
+
+#define OS_STRING "serenity"
+
+#define ID_INLINE inline
+#define PATH_SEP '/'
+
+#ifdef __i386__
+#define ARCH_STRING "x86"
+#elif defined __amd64__
+#undef idx64
+#define idx64 1
+#define ARCH_STRING "x86_64"
+#endif
+
+#define DLL_EXT ".so"
+
+#endif
+
//================================================================== Q3VM ===
#ifdef Q3_VM
--
2.35.1

View file

@ -0,0 +1,79 @@
From c7106223c30a896a576c44ce735d4772c283afac Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 09:40:41 +1100
Subject: [PATCH 3/8] Engine: Add `<sys/select.h>` include for Serenity
QuakeIII makes extensive use of the `select()` syscall for its' netcode.
It seems that Linux has this in a header that isn't `<sys/select.h>`
like us, which results in an implicit declaration error.
---
code/qcommon/net_ip.c | 7 +++++++
code/sys/con_tty.c | 4 ++++
code/sys/sys_unix.c | 4 ++++
3 files changed, 15 insertions(+)
diff --git a/code/qcommon/net_ip.c b/code/qcommon/net_ip.c
index bcccda20..ea940f59 100644
--- a/code/qcommon/net_ip.c
+++ b/code/qcommon/net_ip.c
@@ -81,6 +81,10 @@ static qboolean winsockInitialized = qfalse;
# include <sys/filio.h>
# endif
+#ifdef __serenity__
+#include <sys/select.h>
+#endif
+
typedef int SOCKET;
# define INVALID_SOCKET -1
# define SOCKET_ERROR -1
@@ -996,6 +1000,7 @@ NET_JoinMulticast
Join an ipv6 multicast group
====================
*/
+#ifndef __serenity__
void NET_JoinMulticast6(void)
{
int err;
@@ -1059,6 +1064,8 @@ void NET_LeaveMulticast6()
}
}
+#endif
+
/*
====================
NET_OpenSocks
diff --git a/code/sys/con_tty.c b/code/sys/con_tty.c
index 58f178ad..74e1c60d 100644
--- a/code/sys/con_tty.c
+++ b/code/sys/con_tty.c
@@ -34,6 +34,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <fcntl.h>
#include <sys/time.h>
+#ifdef __serenity__
+#include <sys/select.h>
+#endif
+
/*
=============================================================
tty console routines
diff --git a/code/sys/sys_unix.c b/code/sys/sys_unix.c
index e0c63238..05f311bb 100644
--- a/code/sys/sys_unix.c
+++ b/code/sys/sys_unix.c
@@ -39,6 +39,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include <fenv.h>
#include <sys/wait.h>
+#ifdef __serenity__
+#include <sys/select.h>
+#endif
+
qboolean stdinIsATTY;
// Used to determine where to store user-specific files
--
2.35.1

View file

@ -0,0 +1,25 @@
From 5efef55d7dc570bcef21533a952267e6b107d495 Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 09:45:12 +1100
Subject: [PATCH 4/8] Meta: Add `-ldl` library for Serenity target
---
Makefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index b26ceb7f..035fea77 100644
--- a/Makefile
+++ b/Makefile
@@ -868,7 +868,7 @@ ifeq ($(PLATFORM),serenity)
SHLIBLDFLAGS=-shared $(LDFLAGS)
THREAD_LIBS=-lpthread
- LIBS=-lm
+ LIBS=-lm -ldl
CLIENT_LIBS =
--
2.35.1

View file

@ -0,0 +1,52 @@
From 1d85a563613d3ea2f6cb03c01a4f4bbda2051e79 Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 09:45:32 +1100
Subject: [PATCH 5/8] Engine: Move `#ifdef` to more sensible location
No linker errors in this dojo!
---
code/qcommon/net_ip.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/code/qcommon/net_ip.c b/code/qcommon/net_ip.c
index ea940f59..aaba8321 100644
--- a/code/qcommon/net_ip.c
+++ b/code/qcommon/net_ip.c
@@ -1000,9 +1000,9 @@ NET_JoinMulticast
Join an ipv6 multicast group
====================
*/
-#ifndef __serenity__
void NET_JoinMulticast6(void)
{
+#ifndef __serenity__
int err;
if(ip6_socket == INVALID_SOCKET || multicast6_socket != INVALID_SOCKET || (net_enabled->integer & NET_DISABLEMCAST))
@@ -1049,10 +1049,12 @@ void NET_JoinMulticast6(void)
return;
}
}
+#endif
}
void NET_LeaveMulticast6()
{
+#ifndef __serenity__
if(multicast6_socket != INVALID_SOCKET)
{
if(multicast6_socket != ip6_socket)
@@ -1062,9 +1064,8 @@ void NET_LeaveMulticast6()
multicast6_socket = INVALID_SOCKET;
}
-}
-
#endif
+}
/*
====================
--
2.35.1

View file

@ -0,0 +1,25 @@
From 4c52876ae0217438e97ee9092533bbb29ee1739e Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 21:46:14 +1100
Subject: [PATCH 6/8] Meta: Add ARCH to TOOLS_CFLAGS
---
Makefile | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Makefile b/Makefile
index 035fea77..c5a27abe 100644
--- a/Makefile
+++ b/Makefile
@@ -821,6 +821,8 @@ ifeq ($(PLATFORM),serenity)
-pipe -DUSE_ICON -DMAP_ANONYMOUS=MAP_ANON
CLIENT_CFLAGS += $(SDL_CFLAGS)
+ TOOLS_CFLAGS += -DARCH_STRING=\"$(COMPILE_ARCH)\"
+
OPTIMIZEVM = -O3
OPTIMIZE = $(OPTIMIZEVM) -ffast-math
--
2.35.1

View file

@ -0,0 +1,58 @@
From 4d5d4cd86c7e94b3f4b2d8cdaf3909a5016aec23 Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Fri, 25 Mar 2022 22:04:17 +1100
Subject: [PATCH 7/8] Meta: Remove extension from main game exe
---
Makefile | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/Makefile b/Makefile
index c5a27abe..c0e62001 100644
--- a/Makefile
+++ b/Makefile
@@ -1046,12 +1046,12 @@ endif
ifneq ($(BUILD_CLIENT),0)
ifneq ($(USE_RENDERER_DLOPEN),0)
- TARGETS += $(B)/$(CLIENTBIN)$(FULLBINEXT) $(B)/renderer_opengl1_$(SHLIBNAME)
+ TARGETS += $(B)/$(CLIENTBIN) $(B)/renderer_opengl1_$(SHLIBNAME)
ifneq ($(BUILD_RENDERER_OPENGL2),0)
TARGETS += $(B)/renderer_opengl2_$(SHLIBNAME)
endif
else
- TARGETS += $(B)/$(CLIENTBIN)$(FULLBINEXT)
+ TARGETS += $(B)/$(CLIENTBIN)
ifneq ($(BUILD_RENDERER_OPENGL2),0)
TARGETS += $(B)/$(CLIENTBIN)_opengl2$(FULLBINEXT)
endif
@@ -2246,7 +2246,7 @@ ifeq ($(USE_MUMBLE),1)
endif
ifneq ($(USE_RENDERER_DLOPEN),0)
-$(B)/$(CLIENTBIN)$(FULLBINEXT): $(Q3OBJ) $(LIBSDLMAIN)
+$(B)/$(CLIENTBIN): $(Q3OBJ) $(LIBSDLMAIN)
$(echo_cmd) "LD $@"
$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
-o $@ $(Q3OBJ) \
@@ -2262,7 +2262,7 @@ $(B)/renderer_opengl2_$(SHLIBNAME): $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ)
$(Q)$(CC) $(CFLAGS) $(SHLIBLDFLAGS) -o $@ $(Q3R2OBJ) $(Q3R2STRINGOBJ) $(JPGOBJ) \
$(THREAD_LIBS) $(LIBSDLMAIN) $(RENDERER_LIBS) $(LIBS)
else
-$(B)/$(CLIENTBIN)$(FULLBINEXT): $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) $(LIBSDLMAIN)
+$(B)/$(CLIENTBIN): $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) $(LIBSDLMAIN)
$(echo_cmd) "LD $@"
$(Q)$(CC) $(CLIENT_CFLAGS) $(CFLAGS) $(CLIENT_LDFLAGS) $(LDFLAGS) $(NOTSHLIBLDFLAGS) \
-o $@ $(Q3OBJ) $(Q3ROBJ) $(JPGOBJ) \
@@ -2945,7 +2945,7 @@ ifneq ($(BUILD_GAME_SO),0)
endif
ifneq ($(BUILD_CLIENT),0)
- $(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN)$(FULLBINEXT) $(COPYBINDIR)/$(CLIENTBIN)$(FULLBINEXT)
+ $(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/$(CLIENTBIN) $(COPYBINDIR)/$(CLIENTBIN)
ifneq ($(USE_RENDERER_DLOPEN),0)
$(INSTALL) $(STRIP_FLAG) -m 0755 $(BR)/renderer_opengl1_$(SHLIBNAME) $(COPYBINDIR)/renderer_opengl1_$(SHLIBNAME)
ifneq ($(BUILD_RENDERER_OPENGL2),0)
--
2.35.1

View file

@ -0,0 +1,72 @@
From 488dfbc449db59057afabb92d2843a2ae63741ac Mon Sep 17 00:00:00 2001
From: Jesse Buhagiar <jooster669@gmail.com>
Date: Sat, 26 Mar 2022 00:08:46 +1100
Subject: [PATCH 8/8] Engine: Use Serenity style PROT_EXEC mmap
The code for this was really old and crusty, so let's `ifdef` it out and
use some more friendly Serenity style memory code.
---
code/qcommon/vm_x86.c | 29 +++++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/code/qcommon/vm_x86.c b/code/qcommon/vm_x86.c
index 8d6321a6..d155efc2 100644
--- a/code/qcommon/vm_x86.c
+++ b/code/qcommon/vm_x86.c
@@ -42,6 +42,12 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#endif
#endif
+#ifdef __serenity__
+#include <fcntl.h>
+#include <unistd.h> // for `pledge()`
+#include <serenity.h>
+#endif
+
#if defined (__i386__) || defined(__x86_64__)
static void VM_Destroy_Compiled(vm_t* self);
@@ -1649,9 +1655,24 @@ void VM_Compile(vm_t *vm, vmHeader_t *header)
// copy to an exact sized buffer with the appropriate permission bits
vm->codeLength = compiledOfs;
#ifdef VM_X86_MMAP
+#ifdef __serenity__
+ // Round up by a page for `anon_create` (so we don't blow up in the Kernel)
+ int compiledOfsPageAligned = compiledOfs + (4096u - (compiledOfs % 4096u));
+
+ // Create the fd...
+ int fd = anon_create(compiledOfsPageAligned, O_CLOEXEC);
+ if (fd == -1)
+ Com_Error(ERR_FATAL, "VM_CompileX86: anon_create failed (a very bad thing!)");
+
+ vm->codeBase = mmap_with_name(NULL, compiledOfs, PROT_WRITE|PROT_READ|PROT_EXEC, MAP_SHARED, fd, 0, "Quake3 VM Page");
+ if(vm->codeBase == MAP_FAILED)
+ Com_Error(ERR_FATAL, "VM_CompileX86: can't mmap memory");
+ close(fd);
+#else
vm->codeBase = mmap(NULL, compiledOfs, PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
if(vm->codeBase == MAP_FAILED)
Com_Error(ERR_FATAL, "VM_CompileX86: can't mmap memory");
+#endif
#elif _WIN32
// allocate memory with EXECUTE permissions under windows.
vm->codeBase = VirtualAlloc(NULL, compiledOfs, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
@@ -1665,9 +1686,13 @@ void VM_Compile(vm_t *vm, vmHeader_t *header)
Com_Memcpy( vm->codeBase, buf, compiledOfs );
+
#ifdef VM_X86_MMAP
- if(mprotect(vm->codeBase, compiledOfs, PROT_READ|PROT_EXEC))
- Com_Error(ERR_FATAL, "VM_CompileX86: mprotect failed");
+#ifndef __serenity__
+ int rc = mprotect(vm->codeBase, compiledOfs, PROT_READ|PROT_EXEC);
+ if(rc)
+ Com_Error(ERR_FATAL, "VM_CompileX86: mprotect failed with %d", rc);
+#endif
#elif _WIN32
{
DWORD oldProtect = 0;
--
2.35.1

View file

@ -0,0 +1,48 @@
# Patches for quake3 on SerenityOS
## `0001-Meta-Refactor-Makefile-to-support-Serenity.patch`
Meta: Refactor Makefile to support Serenity
## `0002-Engine-Add-Serenity-so-q_platform.h.patch`
Engine: Add Serenity so `q_platform.h`
## `0003-Engine-Add-sys-select.h-include-for-Serenity.patch`
Engine: Add `<sys/select.h>` include for Serenity
QuakeIII makes extensive use of the `select()` syscall for its' netcode.
It seems that Linux has this in a header that isn't `<sys/select.h>`
like us, which results in an implicit declaration error.
## `0004-Meta-Add-ldl-library-for-Serenity-target.patch`
Meta: Add `-ldl` library for Serenity target
## `0005-Engine-Move-ifdef-to-more-sensible-location.patch`
Engine: Move `#ifdef` to more sensible location
No linker errors in this dojo!
## `0006-Meta-Add-ARCH-to-TOOLS_CFLAGS.patch`
Meta: Add ARCH to TOOLS_CFLAGS
## `0007-Meta-Remove-extension-from-main-game-exe.patch`
Meta: Remove extension from main game exe
## `0008-Engine-Use-Serenity-style-PROT_EXEC-mmap.patch`
Engine: Use Serenity style PROT_EXEC mmap
The code for this was really old and crusty, so let's `ifdef` it out and
use some more friendly Serenity style memory code.