From a6ca8eee2254762422f90cf94fbaac34f85db780 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 13 Jan 2022 10:46:04 +0200 Subject: [PATCH] bpo-46315: Add ifdef HAVE_ feature checks for WASI compatibility (GH-30507) --- Include/internal/pycore_condvar.h | 4 +++- Include/pythread.h | 2 +- .../2022-01-09-15-48-49.bpo-46315.NdCRLu.rst | 2 ++ Modules/_randommodule.c | 4 ++++ Modules/clinic/posixmodule.c.h | 10 +++++++++- Modules/faulthandler.c | 2 +- Modules/posixmodule.c | 9 +++++++++ Modules/xxsubtype.c | 4 +++- PC/pyconfig.h | 3 +++ Python/pyfpe.c | 5 ++++- Tools/wasm/config.site-wasm32-wasi | 17 +++++++++++++++++ configure | 17 +++++++++++++---- configure.ac | 13 +++++++++---- pyconfig.h.in | 12 ++++++++++++ 14 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Build/2022-01-09-15-48-49.bpo-46315.NdCRLu.rst create mode 100644 Tools/wasm/config.site-wasm32-wasi diff --git a/Include/internal/pycore_condvar.h b/Include/internal/pycore_condvar.h index edb7dc8193c..981c962bf7d 100644 --- a/Include/internal/pycore_condvar.h +++ b/Include/internal/pycore_condvar.h @@ -20,7 +20,9 @@ */ #define Py_HAVE_CONDVAR -#include +#ifdef HAVE_PTHREAD_H +# include +#endif #define PyMUTEX_T pthread_mutex_t #define PyCOND_T pthread_cond_t diff --git a/Include/pythread.h b/Include/pythread.h index 1a6092c4ad0..034e6605515 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -125,7 +125,7 @@ Py_DEPRECATED(3.7) PyAPI_FUNC(void) PyThread_ReInitTLS(void); typedef struct _Py_tss_t Py_tss_t; /* opaque */ #ifndef Py_LIMITED_API -#if defined(_POSIX_THREADS) +#ifdef HAVE_PTHREAD_H /* Darwin needs pthread.h to know type name the pthread_key_t. */ # include # define NATIVE_TSS_KEY_T pthread_key_t diff --git a/Misc/NEWS.d/next/Build/2022-01-09-15-48-49.bpo-46315.NdCRLu.rst b/Misc/NEWS.d/next/Build/2022-01-09-15-48-49.bpo-46315.NdCRLu.rst new file mode 100644 index 00000000000..9360f91e45d --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-01-09-15-48-49.bpo-46315.NdCRLu.rst @@ -0,0 +1,2 @@ +Added and fixed ``#ifdef HAVE_FEATURE`` checks for functionality that is not +available on WASI platform. diff --git a/Modules/_randommodule.c b/Modules/_randommodule.c index 5243d5a05e2..45860e342eb 100644 --- a/Modules/_randommodule.c +++ b/Modules/_randommodule.c @@ -258,7 +258,11 @@ random_seed_time_pid(RandomObject *self) key[0] = (uint32_t)(now & 0xffffffffU); key[1] = (uint32_t)(now >> 32); +#ifdef HAVE_GETPID key[2] = (uint32_t)getpid(); +#else + key[2] = 0; +#endif now = _PyTime_GetMonotonicClock(); key[3] = (uint32_t)(now & 0xffffffffU); diff --git a/Modules/clinic/posixmodule.c.h b/Modules/clinic/posixmodule.c.h index 86da08711fd..282a5410f70 100644 --- a/Modules/clinic/posixmodule.c.h +++ b/Modules/clinic/posixmodule.c.h @@ -1831,6 +1831,8 @@ exit: #endif /* defined(HAVE_SYSTEM) && !defined(MS_WINDOWS) */ +#if defined(HAVE_UMASK) + PyDoc_STRVAR(os_umask__doc__, "umask($module, mask, /)\n" "--\n" @@ -1859,6 +1861,8 @@ exit: return return_value; } +#endif /* defined(HAVE_UMASK) */ + PyDoc_STRVAR(os_unlink__doc__, "unlink($module, /, path, *, dir_fd=None)\n" "--\n" @@ -8812,6 +8816,10 @@ exit: #define OS_SYSTEM_METHODDEF #endif /* !defined(OS_SYSTEM_METHODDEF) */ +#ifndef OS_UMASK_METHODDEF + #define OS_UMASK_METHODDEF +#endif /* !defined(OS_UMASK_METHODDEF) */ + #ifndef OS_UNAME_METHODDEF #define OS_UNAME_METHODDEF #endif /* !defined(OS_UNAME_METHODDEF) */ @@ -9295,4 +9303,4 @@ exit: #ifndef OS_WAITSTATUS_TO_EXITCODE_METHODDEF #define OS_WAITSTATUS_TO_EXITCODE_METHODDEF #endif /* !defined(OS_WAITSTATUS_TO_EXITCODE_METHODDEF) */ -/*[clinic end generated code: output=05505f171cdcff72 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=d95ba7b0b9c52685 input=a9049054013a1b77]*/ diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index cb2e2588e19..1888337cf9f 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -10,7 +10,7 @@ #include #include #include // abort() -#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) +#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK) && defined(HAVE_PTHREAD_H) # include #endif #ifdef MS_WINDOWS diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 21adf806a4e..904f8bfa558 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3292,7 +3292,14 @@ os_chmod_impl(PyObject *module, path_t *path, int mode, int dir_fd, } else #endif /* HAVE_FHCMODAT */ + { +#ifdef HAVE_CHMOD result = chmod(path->narrow, mode); +#else + result = -1; + errno = ENOSYS; +#endif + } Py_END_ALLOW_THREADS if (result) { @@ -4885,6 +4892,7 @@ os_system_impl(PyObject *module, PyObject *command) #endif /* HAVE_SYSTEM */ +#ifdef HAVE_UMASK /*[clinic input] os.umask @@ -4903,6 +4911,7 @@ os_umask_impl(PyObject *module, int mask) return posix_error(); return PyLong_FromLong((long)i); } +#endif #ifdef MS_WINDOWS diff --git a/Modules/xxsubtype.c b/Modules/xxsubtype.c index 7200337724e..768dac9d1b1 100644 --- a/Modules/xxsubtype.c +++ b/Modules/xxsubtype.c @@ -237,10 +237,11 @@ spam_bench(PyObject *self, PyObject *args) { PyObject *obj, *name, *res; int n = 1000; - time_t t0, t1; + time_t t0 = 0, t1 = 0; if (!PyArg_ParseTuple(args, "OU|i", &obj, &name, &n)) return NULL; +#ifdef HAVE_CLOCK t0 = clock(); while (--n >= 0) { res = PyObject_GetAttr(obj, name); @@ -249,6 +250,7 @@ spam_bench(PyObject *self, PyObject *args) Py_DECREF(res); } t1 = clock(); +#endif return PyFloat_FromDouble((double)(t1-t0) / CLOCKS_PER_SEC); } diff --git a/PC/pyconfig.h b/PC/pyconfig.h index e0d875adf2e..e8649be5684 100644 --- a/PC/pyconfig.h +++ b/PC/pyconfig.h @@ -529,6 +529,9 @@ Py_NO_ENABLE_SHARED to find out. Also support MS_NO_COREDLL for b/w compat */ /* Define if you have times. */ /* #undef HAVE_TIMES */ +/* Define to 1 if you have the `umask' function. */ +#define HAVE_UMASK 1 + /* Define if you have uname. */ /* #undef HAVE_UNAME */ diff --git a/Python/pyfpe.c b/Python/pyfpe.c index 31ef5d73b70..9b1260f687a 100644 --- a/Python/pyfpe.c +++ b/Python/pyfpe.c @@ -3,9 +3,12 @@ * though, because they may be referenced by extensions using the stable ABI. */ -#include "setjmp.h" +#ifdef HAVE_SETJMP_H +#include jmp_buf PyFPE_jbuf; +#endif + int PyFPE_counter; double diff --git a/Tools/wasm/config.site-wasm32-wasi b/Tools/wasm/config.site-wasm32-wasi new file mode 100644 index 00000000000..be26c46a148 --- /dev/null +++ b/Tools/wasm/config.site-wasm32-wasi @@ -0,0 +1,17 @@ +# config.site override for cross compiling to wasm32-wasi platform +# +# Written by Christian Heimes +# Partly based on pyodide's pyconfig.undefs.h file. + + +# cannot be detected in cross builds +ac_cv_buggy_getaddrinfo=no + +# WASI has no /dev/pt* +ac_cv_file__dev_ptmx=no +ac_cv_file__dev_ptc=no + +# dummy readelf, WASI build does not need readelf. +ac_cv_prog_ac_ct_READELF=true + +ac_cv_func_eventfd=no diff --git a/configure b/configure index 6c9aacc68a9..127b350b4bb 100755 --- a/configure +++ b/configure @@ -6268,7 +6268,7 @@ else EXEEXT=.html ;; #( Emscripten/node) : EXEEXT=.js ;; #( - wasi/*) : + WASI/*) : EXEEXT=.wasm ;; #( *) : EXEEXT= @@ -7627,6 +7627,15 @@ case $ac_sys_system/$ac_sys_emscripten_target in #( LDFLAGS_NODIST="$(LDFLAGS_NODIST) -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD" CFLAGS_NODIST="$(CFLAGS_NODIST) -pthread" ;; #( + WASI) : + + +$as_echo "#define _WASI_EMULATED_SIGNAL 1" >>confdefs.h + + LIBS="$LIBS -lwasi-emulated-signal" + echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + + ;; #( *) : ;; esac @@ -8543,7 +8552,7 @@ for ac_header in \ alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \ ieeefp.h io.h langinfo.h libintl.h libutil.h linux/memfd.h linux/random.h linux/soundcard.h \ linux/tipc.h linux/wait.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \ - sched.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \ + sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \ sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \ sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \ sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \ @@ -13630,7 +13639,7 @@ fi # checks for library functions for ac_func in \ - accept4 alarm bind_textdomain_codeset chown clock close_range confstr \ + accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \ copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \ fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \ @@ -13652,7 +13661,7 @@ for ac_func in \ sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \ sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \ sysconf system tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \ - tmpnam tmpnam_r truncate ttyname uname unlinkat utimensat utimes vfork \ + tmpnam tmpnam_r truncate ttyname umask uname unlinkat utimensat utimes vfork \ wait wait3 wait4 waitid waitpid wcscoll wcsftime wcsxfrm wmemcmp writev \ do : diff --git a/configure.ac b/configure.ac index 4396828bf6f..e5ebf7bc2e0 100644 --- a/configure.ac +++ b/configure.ac @@ -1093,7 +1093,7 @@ AC_ARG_WITH([suffix], AS_CASE([$ac_sys_system/$ac_sys_emscripten_target], [Emscripten/browser], [EXEEXT=.html], [Emscripten/node], [EXEEXT=.js], - [wasi/*], [EXEEXT=.wasm], + [WASI/*], [EXEEXT=.wasm], [EXEEXT=] ) ]) @@ -1805,6 +1805,11 @@ AS_CASE([$ac_sys_system/$ac_sys_emscripten_target], LDFLAGS_NODIST="$(LDFLAGS_NODIST) -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 -s NODERAWFS=1 -s EXIT_RUNTIME=1 -s USE_PTHREADS -s PROXY_TO_PTHREAD" CFLAGS_NODIST="$(CFLAGS_NODIST) -pthread" ], + [WASI], [ + AC_DEFINE([_WASI_EMULATED_SIGNAL], [1], [Define to 1 if you want to emulate signals on WASI]) + LIBS="$LIBS -lwasi-emulated-signal" + echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h + ] ) AC_SUBST(BASECFLAGS) @@ -2306,7 +2311,7 @@ AC_CHECK_HEADERS([ \ alloca.h asm/types.h bluetooth.h conio.h crypt.h direct.h dlfcn.h endian.h errno.h fcntl.h grp.h \ ieeefp.h io.h langinfo.h libintl.h libutil.h linux/memfd.h linux/random.h linux/soundcard.h \ linux/tipc.h linux/wait.h netinet/in.h netpacket/packet.h poll.h process.h pthread.h pty.h \ - sched.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \ + sched.h setjmp.h shadow.h signal.h spawn.h stropts.h sys/audioio.h sys/bsdtty.h sys/devpoll.h \ sys/endian.h sys/epoll.h sys/event.h sys/eventfd.h sys/file.h sys/ioctl.h sys/kern_control.h \ sys/loadavg.h sys/lock.h sys/memfd.h sys/mkdev.h sys/mman.h sys/modem.h sys/param.h sys/poll.h \ sys/random.h sys/resource.h sys/select.h sys/sendfile.h sys/socket.h sys/soundcard.h sys/stat.h \ @@ -4062,7 +4067,7 @@ fi # checks for library functions AC_CHECK_FUNCS([ \ - accept4 alarm bind_textdomain_codeset chown clock close_range confstr \ + accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \ copy_file_range ctermid dup3 execv explicit_bzero explicit_memset \ faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \ fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \ @@ -4084,7 +4089,7 @@ AC_CHECK_FUNCS([ \ sigfillset siginterrupt sigpending sigrelse sigtimedwait sigwait \ sigwaitinfo snprintf splice strftime strlcpy strsignal symlinkat sync \ sysconf system tcgetpgrp tcsetpgrp tempnam timegm times tmpfile \ - tmpnam tmpnam_r truncate ttyname uname unlinkat utimensat utimes vfork \ + tmpnam tmpnam_r truncate ttyname umask uname unlinkat utimensat utimes vfork \ wait wait3 wait4 waitid waitpid wcscoll wcsftime wcsxfrm wmemcmp writev \ ]) diff --git a/pyconfig.h.in b/pyconfig.h.in index f496b771999..21822197708 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -127,6 +127,9 @@ /* Define to 1 if you have the 'chflags' function. */ #undef HAVE_CHFLAGS +/* Define to 1 if you have the `chmod' function. */ +#undef HAVE_CHMOD + /* Define to 1 if you have the `chown' function. */ #undef HAVE_CHOWN @@ -977,6 +980,9 @@ /* Define to 1 if you have the `setitimer' function. */ #undef HAVE_SETITIMER +/* Define to 1 if you have the header file. */ +#undef HAVE_SETJMP_H + /* Define to 1 if you have the `setlocale' function. */ #undef HAVE_SETLOCALE @@ -1336,6 +1342,9 @@ /* Define this if you have tcl and TCL_UTF_MAX==6 */ #undef HAVE_UCS4_TCL +/* Define to 1 if you have the `umask' function. */ +#undef HAVE_UMASK + /* Define to 1 if you have the `uname' function. */ #undef HAVE_UNAME @@ -1704,6 +1713,9 @@ /* Define to force use of thread-safe errno, h_errno, and other functions */ #undef _REENTRANT +/* Define to 1 if you want to emulate signals on WASI */ +#undef _WASI_EMULATED_SIGNAL + /* Define to the level of X/Open that your system supports */ #undef _XOPEN_SOURCE