From 8f1a916ac5fa7b77696755a445cb9b628683cf05 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 13 Feb 2020 20:50:47 +0000 Subject: [PATCH] Add basic support for compiling on RISC OS --- CMakeLists.txt | 24 +++++++++++++++++++++--- configure | 21 +++++++++++++++++++++ configure.ac | 19 +++++++++++++++++++ src/atomic/SDL_spinlock.c | 14 ++++++++++++++ src/dynapi/SDL_dynapi.h | 2 ++ src/thread/pthread/SDL_systhread.c | 2 +- test/configure | 5 +++++ test/configure.ac | 5 +++++ 8 files changed, 88 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b3b2875be6978..f18ec8b61963f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -129,7 +129,7 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Haiku.*") endif() # Don't mistake osx for unix -if(UNIX AND NOT APPLE) +if(UNIX AND NOT APPLE AND NOT RISCOS) set(UNIX_SYS ON) else() set(UNIX_SYS OFF) @@ -341,7 +341,7 @@ set_option(VIDEO_OPENGLES "Include OpenGL ES support" ON) set_option(PTHREADS "Use POSIX threads for multi-threading" ${SDL_PTHREADS_ENABLED_BY_DEFAULT}) dep_option(PTHREADS_SEM "Use pthread semaphores" ON "PTHREADS" OFF) set_option(SDL_DLOPEN "Use dlopen for shared object loading" ${SDL_DLOPEN_ENABLED_BY_DEFAULT}) -set_option(OSS "Support the OSS audio API" ${UNIX_SYS}) +dep_option(OSS "Support the OSS audio API" ON "UNIX_SYS OR RISCOS" OFF) set_option(ALSA "Support the ALSA audio API" ${UNIX_SYS}) dep_option(ALSA_SHARED "Dynamically load ALSA audio support" ON "ALSA" OFF) set_option(JACK "Support the JACK audio API" ${UNIX_SYS}) @@ -1091,7 +1091,7 @@ elseif(EMSCRIPTEN) endif() endif() -elseif(UNIX AND NOT APPLE AND NOT ANDROID) +elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS) if(SDL_AUDIO) if(SYSV5 OR SOLARIS OR HPUX) set(SDL_AUDIO_DRIVER_SUNAUDIO 1) @@ -1814,6 +1814,24 @@ elseif(HAIKU) endif() CheckPTHREAD() + +elseif(RISCOS) + if(SDL_TIMERS) + set(SDL_TIMER_UNIX 1) + file(GLOB TIMER_SOURCES ${SDL2_SOURCE_DIR}/src/timer/unix/*.c) + set(SOURCE_FILES ${SOURCE_FILES} ${TIMER_SOURCES}) + set(HAVE_SDL_TIMERS TRUE) + + if(CLOCK_GETTIME) + set(HAVE_CLOCK_GETTIME 1) + endif() + endif() + + CheckPTHREAD() + + if(SDL_AUDIO) + CheckOSS() + endif() endif() if(VIDEO_VULKAN) diff --git a/configure b/configure index b3ddeaa0e3c2d..8e06e859acc6b 100755 --- a/configure +++ b/configure @@ -25365,6 +25365,27 @@ $as_echo "#define SDL_FILESYSTEM_EMSCRIPTEN 1" >>confdefs.h # Set up files for the timer library if test x$enable_timers = xyes; then +$as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h + + SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" + have_timers=yes + fi + ;; + *-*-riscos*) + ARCH=riscos + CheckVisibilityHidden + CheckDeclarationAfterStatement + CheckDummyVideo + CheckDiskAudio + CheckDummyAudio + CheckDLOPEN + CheckOSS + CheckPTHREAD + CheckClockGettime + + # Set up files for the timer library + if test x$enable_timers = xyes; then + $as_echo "#define SDL_TIMER_UNIX 1" >>confdefs.h SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" diff --git a/configure.ac b/configure.ac index 470e675453957..aa751d1140d81 100644 --- a/configure.ac +++ b/configure.ac @@ -4056,6 +4056,25 @@ AS_HELP_STRING([--enable-render-d3d], [enable the Direct3D render driver [[defau SOURCES="$SOURCES $srcdir/src/filesystem/emscripten/*.c" have_filesystem=yes fi + # Set up files for the timer library + if test x$enable_timers = xyes; then + AC_DEFINE(SDL_TIMER_UNIX, 1, [ ]) + SOURCES="$SOURCES $srcdir/src/timer/unix/*.c" + have_timers=yes + fi + ;; + *-*-riscos*) + ARCH=riscos + CheckVisibilityHidden + CheckDeclarationAfterStatement + CheckDummyVideo + CheckDiskAudio + CheckDummyAudio + CheckDLOPEN + CheckOSS + CheckPTHREAD + CheckClockGettime + # Set up files for the timer library if test x$enable_timers = xyes; then AC_DEFINE(SDL_TIMER_UNIX, 1, [ ]) diff --git a/src/atomic/SDL_spinlock.c b/src/atomic/SDL_spinlock.c index 78e447d96a8d3..aa8ae574756d3 100644 --- a/src/atomic/SDL_spinlock.c +++ b/src/atomic/SDL_spinlock.c @@ -32,6 +32,10 @@ #include #endif +#if !defined(HAVE_GCC_ATOMICS) && defined(__RISCOS__) +#include +#endif + #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) #include #endif @@ -84,6 +88,16 @@ SDL_AtomicTryLock(SDL_SpinLock *lock) defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5TE__) || \ defined(__ARM_ARCH_5TEJ__)) int result; + +#if defined(__RISCOS__) + if (__cpucap_have_rex()) { + __asm__ __volatile__ ( + "ldrex %0, [%2]\nteq %0, #0\nstrexeq %0, %1, [%2]" + : "=&r" (result) : "r" (1), "r" (lock) : "cc", "memory"); + return (result == 0); + } +#endif + __asm__ __volatile__ ( "swp %0, %1, [%2]\n" : "=&r,&r" (result) : "r,0" (1), "r,r" (lock) : "memory"); diff --git a/src/dynapi/SDL_dynapi.h b/src/dynapi/SDL_dynapi.h index 2bf0affb78781..764e5d978a025 100644 --- a/src/dynapi/SDL_dynapi.h +++ b/src/dynapi/SDL_dynapi.h @@ -53,6 +53,8 @@ #define SDL_DYNAMIC_API 0 #elif defined(__PSP__) && __PSP__ #define SDL_DYNAMIC_API 0 +#elif defined(__riscos__) && __riscos__ /* probably not useful on RISC OS, since dlopen() can't be used when using static linking. */ +#define SDL_DYNAMIC_API 0 #elif defined(__clang_analyzer__) #define SDL_DYNAMIC_API 0 /* Turn off for static analysis, so reports are more clear. */ #endif diff --git a/src/thread/pthread/SDL_systhread.c b/src/thread/pthread/SDL_systhread.c index e8efd688e27e5..0a4650a9bbeef 100644 --- a/src/thread/pthread/SDL_systhread.c +++ b/src/thread/pthread/SDL_systhread.c @@ -188,7 +188,7 @@ SDL_ThreadID(void) int SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority) { -#if __NACL__ +#if __NACL__ || __RISCOS__ /* FIXME: Setting thread priority does not seem to be supported in NACL */ return 0; #elif __LINUX__ diff --git a/test/configure b/test/configure index 909a485ac604b..b0abb99c41260 100755 --- a/test/configure +++ b/test/configure @@ -2988,6 +2988,11 @@ fi MATHLIB="" SYS_GL_LIBS="" ;; + *-*-riscos* ) + EXE=",e1f" + MATHLIB="" + SYS_GL_LIBS="" + ;; *) ISUNIX="true" EXE="" diff --git a/test/configure.ac b/test/configure.ac index 2e237262eaf1e..af801222d2bbf 100644 --- a/test/configure.ac +++ b/test/configure.ac @@ -71,6 +71,11 @@ case "$host" in MATHLIB="" SYS_GL_LIBS="" ;; + *-*-riscos* ) + EXE=",e1f" + MATHLIB="" + SYS_GL_LIBS="" + ;; *) dnl Oh well, call it Unix... ISUNIX="true"