From 171885010dc232a3d971239253283f493d7828de Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Thu, 7 Aug 2025 23:35:39 +0200 Subject: [PATCH] Add GNU/Hurd as platform SDL has been building on GNU/Hurd for a long time, using either drivers based on external libraries (e.g. X11, pulseaudio, sndio, etc) or dummy drivers. This commit introduces it explicitly as platform, so it can be recognized, and tweaked as needed. In particular: - introduce the SDL_PLATFORM_HURD define - tighten/improve the platform detection in cmake, and use "Hurd" as identifier - return the platform name in SDL_GetPlatform() - tweak the CFLAGS/LDFLAGS so pthreads can be used properly - implement SDL_GetExeName(), using /proc/self/exe as provided by the basic Linux-like procfs - enable GLES 2 in tests (mostly for consistency with Linux) --- cmake/sdlchecks.cmake | 3 +++ cmake/sdlplatform.cmake | 4 ++-- include/SDL3/SDL_platform_defines.h | 10 ++++++++++ src/SDL.c | 2 ++ src/core/unix/SDL_appid.c | 4 ++-- test/testgles2.c | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake index 865e28f6d5..c5a51edd1d 100644 --- a/cmake/sdlchecks.cmake +++ b/cmake/sdlchecks.cmake @@ -884,6 +884,9 @@ macro(CheckPTHREAD) set(PTHREAD_LDFLAGS "-pthread") elseif(QNX) # pthread support is baked in + elseif(HURD) + set(PTHREAD_CFLAGS "-D_REENTRANT") + set(PTHREAD_LDFLAGS "-pthread") else() set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-lpthread") diff --git a/cmake/sdlplatform.cmake b/cmake/sdlplatform.cmake index 60e0e77fd9..6b5777aeca 100644 --- a/cmake/sdlplatform.cmake +++ b/cmake/sdlplatform.cmake @@ -36,8 +36,8 @@ function(SDL_DetectCMakePlatform) set(sdl_cmake_platform NetBSD) elseif(CMAKE_SYSTEM_NAME MATCHES "kOpenBSD.*|OpenBSD.*") set(sdl_cmake_platform OpenBSD) - elseif(CMAKE_SYSTEM_NAME MATCHES ".*GNU.*") - set(sdl_cmake_platform GNU) + elseif(CMAKE_SYSTEM_NAME STREQUAL "GNU") + set(sdl_cmake_platform Hurd) elseif(CMAKE_SYSTEM_NAME MATCHES ".*BSDI.*") set(sdl_cmake_platform BSDi) elseif(CMAKE_SYSTEM_NAME MATCHES "DragonFly.*|FreeBSD") diff --git a/include/SDL3/SDL_platform_defines.h b/include/SDL3/SDL_platform_defines.h index f7f14be005..848dac3db8 100644 --- a/include/SDL3/SDL_platform_defines.h +++ b/include/SDL3/SDL_platform_defines.h @@ -484,4 +484,14 @@ #define SDL_PLATFORM_NGAGE 1 #endif +#ifdef __GNU__ + +/** + * A preprocessor macro that is only defined if compiling for GNU/Hurd. + * + * \since This macro is available since SDL 3.4.0. + */ +#define SDL_PLATFORM_HURD 1 +#endif + #endif /* SDL_platform_defines_h_ */ diff --git a/src/SDL.c b/src/SDL.c index 41a8435e6a..9b5ee8713f 100644 --- a/src/SDL.c +++ b/src/SDL.c @@ -770,6 +770,8 @@ const char *SDL_GetPlatform(void) return "PlayStation Vita"; #elif defined(SDL_PLATFORM_3DS) return "Nintendo 3DS"; +#elif defined(SDL_PLATFORM_HURD) + return "GNU/Hurd"; #elif defined(__managarm__) return "Managarm"; #else diff --git a/src/core/unix/SDL_appid.c b/src/core/unix/SDL_appid.c index 996e216cd5..8bf3349877 100644 --- a/src/core/unix/SDL_appid.c +++ b/src/core/unix/SDL_appid.c @@ -30,11 +30,11 @@ const char *SDL_GetExeName(void) // TODO: Use a fallback if BSD has no mounted procfs (OpenBSD has no procfs at all) if (!proc_name) { -#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_FREEBSD) || defined (SDL_PLATFORM_NETBSD) +#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_FREEBSD) || defined (SDL_PLATFORM_NETBSD) || defined(SDL_PLATFORM_HURD) static char linkfile[1024]; int linksize; -#if defined(SDL_PLATFORM_LINUX) +#if defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_HURD) const char *proc_path = "/proc/self/exe"; #elif defined(SDL_PLATFORM_FREEBSD) const char *proc_path = "/proc/curproc/file"; diff --git a/test/testgles2.c b/test/testgles2.c index 1184eab7cb..ba3e0ddcda 100644 --- a/test/testgles2.c +++ b/test/testgles2.c @@ -19,7 +19,7 @@ #include -#if defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_ANDROID) || defined(SDL_PLATFORM_EMSCRIPTEN) || defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_LINUX) +#if defined(SDL_PLATFORM_IOS) || defined(SDL_PLATFORM_ANDROID) || defined(SDL_PLATFORM_EMSCRIPTEN) || defined(SDL_PLATFORM_WIN32) || defined(SDL_PLATFORM_LINUX) || defined(SDL_PLATFORM_HURD) #define HAVE_OPENGLES2 #endif