diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fef44774..68041078c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -153,7 +153,14 @@ else() set(UNIX_OR_MAC_SYS OFF) endif() -if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) # JavaScript does not yet have threading support, so disable pthreads when building for Emscripten. +# Emscripten pthreads work, but you need to have a non-pthread fallback build +# for systems without support. It's not currently enough to not use +# pthread functions in a pthread-build; it won't start up on unsupported +# browsers. As such, you have to explicitly enable it on Emscripten builds +# for the time being. This default with change to ON once this becomes +# commonly supported in browsers or the Emscripten teams makes a single +# binary work everywhere. +if (UNIX_OR_MAC_SYS AND NOT EMSCRIPTEN) set(SDL_PTHREADS_ENABLED_BY_DEFAULT ON) else() set(SDL_PTHREADS_ENABLED_BY_DEFAULT OFF) @@ -289,11 +296,14 @@ set(OPT_DEF_ASM TRUE) if(EMSCRIPTEN) # Set up default values for the currently supported set of subsystems: # Emscripten/Javascript does not have assembly support, a dynamic library - # loading architecture, low-level CPU inspection or multithreading. + # loading architecture, or low-level CPU inspection. + + # SDL_THREADS_ENABLED_BY_DEFAULT now defaults to ON, but pthread support might be disabled by default. + # !!! FIXME: most of these subsystems should default to ON if there are dummy implementations to be used. + set(OPT_DEF_ASM FALSE) set(SDL_SHARED_ENABLED_BY_DEFAULT OFF) set(SDL_ATOMIC_ENABLED_BY_DEFAULT OFF) - set(SDL_THREADS_ENABLED_BY_DEFAULT OFF) set(SDL_LOADSO_ENABLED_BY_DEFAULT OFF) set(SDL_CPUINFO_ENABLED_BY_DEFAULT OFF) set(SDL_DLOPEN_ENABLED_BY_DEFAULT OFF) @@ -1154,6 +1164,8 @@ elseif(EMSCRIPTEN) endif() endif() + CheckPTHREAD() + elseif(UNIX AND NOT APPLE AND NOT ANDROID AND NOT RISCOS) if(SDL_AUDIO) if(SYSV5 OR SOLARIS OR HPUX) diff --git a/cmake/sdlchecks.cmake b/cmake/sdlchecks.cmake index 64089c6bd..9e05497e9 100644 --- a/cmake/sdlchecks.cmake +++ b/cmake/sdlchecks.cmake @@ -919,6 +919,9 @@ macro(CheckPTHREAD) elseif(HAIKU) set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "") + elseif(EMSCRIPTEN) + set(PTHREAD_CFLAGS "-D_REENTRANT -pthread") + set(PTHREAD_LDFLAGS "-pthread") else() set(PTHREAD_CFLAGS "-D_REENTRANT") set(PTHREAD_LDFLAGS "-lpthread") diff --git a/configure b/configure index b1a6c2429..0daa8a1f1 100755 --- a/configure +++ b/configure @@ -771,6 +771,7 @@ infodir docdir oldincludedir includedir +runstatedir localstatedir sharedstatedir sysconfdir @@ -986,6 +987,7 @@ datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' @@ -1238,6 +1240,15 @@ do | -silent | --silent | --silen | --sile | --sil) silent=yes ;; + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ @@ -1375,7 +1386,7 @@ fi for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir + libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. @@ -1528,6 +1539,7 @@ Fine tuning of the installation directories: --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] @@ -1682,8 +1694,9 @@ Optional Features: --enable-ibus enable IBus support [default=yes] --enable-fcitx enable fcitx support [default=yes] --enable-joystick-mfi include macOS MFI joystick support [default=yes] - --enable-pthreads use POSIX threads for multi-threading [default=yes] - --enable-pthread-sem use pthread semaphores [default=yes] + --enable-pthreads use POSIX threads for multi-threading + [default=maybe] + --enable-pthread-sem use pthread semaphores [default=maybe] --enable-directx use DirectX for Windows audio/video [default=yes] --enable-xinput use Xinput for Windows [default=yes] --enable-wasapi use the Windows WASAPI audio driver [default=yes] @@ -20257,34 +20270,8 @@ else $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. -ac_x_includes=no -ac_x_libraries=no -# Do we need to do anything special at all? -ac_save_LIBS=$LIBS -LIBS="-lX11 $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -int -main () -{ -XrmInitialize () - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - # We can compile and link X programs with no special options. - ac_x_includes= - ac_x_libraries= -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS="$ac_save_LIBS" -# If that didn't work, only try xmkmf and filesystem searches -# for native compilation. -if test x"$ac_x_includes" = xno && test "$cross_compiling" = no; then : - rm -f -r conftest.dir +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' @@ -20323,7 +20310,7 @@ _ACEOF rm -f -r conftest.dir fi - # Standard set of common directories for X headers. +# Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include @@ -20350,8 +20337,6 @@ ac_x_header_dirs=' /usr/local/include/X11R5 /usr/local/include/X11R4 -/opt/X11/include - /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 @@ -20425,17 +20410,15 @@ rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no -fi -# Record the results. case $ac_x_includes,$ac_x_libraries in #( - no,* | *,no | *\'*) : + no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. - ac_cv_have_x="have_x=no" ;; #( - *) : + ac_cv_have_x="have_x=no";; #( + *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ - ac_x_libraries='$ac_x_libraries'" ;; + ac_x_libraries='$ac_x_libraries'" esac fi ;; #( @@ -23541,20 +23524,39 @@ $as_echo "#define SDL_JOYSTICK_MFI 1" >>confdefs.h CheckPTHREAD() { - # Check whether --enable-pthreads was given. + + + case "$host" in + *-*-emscripten*) + enable_pthreads_default=no + ;; + *) + enable_pthreads_default=yes + ;; + esac + + # Check whether --enable-pthreads was given. if test "${enable_pthreads+set}" = set; then : enableval=$enable_pthreads; else - enable_pthreads=yes + enable_pthreads=maybe fi # Check whether --enable-pthread-sem was given. if test "${enable_pthread_sem+set}" = set; then : enableval=$enable_pthread_sem; else - enable_pthread_sem=yes + enable_pthread_sem=maybe fi + + if test x$enable_pthreads = xmaybe; then + enable_pthreads=$enable_pthreads_default + fi + if test x$enable_pthread_sem = xmaybe; then + enable_pthread_sem=$enable_pthreads + fi + case "$host" in *-*-android*) pthread_cflags="-D_REENTRANT -D_THREAD_SAFE" @@ -23620,6 +23622,10 @@ fi pthread_cflags="-D_REENTRANT" pthread_lib="" ;; + *-*-emscripten*) + pthread_cflags="-D_REENTRANT -pthread" + pthread_lib="-pthread" + ;; *) pthread_cflags="-D_REENTRANT" pthread_lib="-lpthread" @@ -25868,6 +25874,7 @@ $as_echo "#define SDL_AUDIO_DRIVER_EMSCRIPTEN 1" >>confdefs.h CheckDummyVideo CheckDiskAudio CheckDummyAudio + CheckPTHREAD CheckDLOPEN CheckClockGettime CheckEmscriptenGLES diff --git a/configure.ac b/configure.ac index e28996695..5e583e09f 100644 --- a/configure.ac +++ b/configure.ac @@ -2941,13 +2941,39 @@ dnl See what type of thread model to use on Linux and Solaris CheckPTHREAD() { dnl Check for pthread support + + dnl Emscripten pthreads work, but you need to have a non-pthread fallback build + dnl for systems without support. It's not currently enough to not use + dnl pthread functions in a pthread-build; it won't start up on unsupported + dnl browsers. As such, you have to explicitly enable it on Emscripten builds + dnl for the time being. This default with change to ON once this becomes + dnl commonly supported in browsers or the Emscripten teams makes a single + dnl binary work everywhere. + + case "$host" in + *-*-emscripten*) + enable_pthreads_default=no + ;; + *) + enable_pthreads_default=yes + ;; + esac + AC_ARG_ENABLE(pthreads, -[AS_HELP_STRING([--enable-pthreads], [use POSIX threads for multi-threading [default=yes]])], - , enable_pthreads=yes) +[AS_HELP_STRING([--enable-pthreads], [use POSIX threads for multi-threading [default=maybe]])], + , enable_pthreads=maybe) dnl This is used on Linux for glibc binary compatibility (Doh!) AC_ARG_ENABLE(pthread-sem, -[AS_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [default=yes]])], - , enable_pthread_sem=yes) +[AS_HELP_STRING([--enable-pthread-sem], [use pthread semaphores [default=maybe]])], + , enable_pthread_sem=maybe) + + if test x$enable_pthreads = xmaybe; then + enable_pthreads=$enable_pthreads_default + fi + if test x$enable_pthread_sem = xmaybe; then + enable_pthread_sem=$enable_pthreads + fi + case "$host" in *-*-android*) pthread_cflags="-D_REENTRANT -D_THREAD_SAFE" @@ -3013,6 +3039,10 @@ CheckPTHREAD() pthread_cflags="-D_REENTRANT" pthread_lib="" ;; + *-*-emscripten*) + pthread_cflags="-D_REENTRANT -pthread" + pthread_lib="-pthread" + ;; *) pthread_cflags="-D_REENTRANT" pthread_lib="-lpthread" @@ -4302,6 +4332,7 @@ case "$host" in CheckDummyVideo CheckDiskAudio CheckDummyAudio + CheckPTHREAD CheckDLOPEN CheckClockGettime CheckEmscriptenGLES