configure/cmake: Hook up Emscripten threads (disabled by default).

Fixes #3795.
main
Ryan C. Gordon 2021-04-04 00:16:30 -04:00
parent 354cabd4a7
commit a81fe27271
No known key found for this signature in database
GPG Key ID: FA148B892AB48044
4 changed files with 103 additions and 50 deletions

View File

@ -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)

View File

@ -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")

93
configure vendored
View File

@ -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 <X11/Xlib.h>
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

View File

@ -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