https://github.com/python/cpython/commit/7b2495e8111ee316fc9a781eb7de4eaac681b379
commit: 7b2495e8111ee316fc9a781eb7de4eaac681b379
branch: main
author: Marcel Telka <[email protected]>
committer: encukou <[email protected]>
date: 2026-03-30T11:55:42+02:00
summary:

gh-138850: Add --disable-epoll to configure (GH-145768)

* gh-138850: Add --disable-epoll to configure


Co-authored-by: Petr Viktorin <[email protected]>

files:
A Misc/NEWS.d/next/Build/2026-03-10-16-58-55.gh-issue-138850.CkqTw6.rst
M Doc/library/select.rst
M Doc/using/configure.rst
M configure
M configure.ac

diff --git a/Doc/library/select.rst b/Doc/library/select.rst
index f6d8ce3c30ff1d..6c4a55612180a3 100644
--- a/Doc/library/select.rst
+++ b/Doc/library/select.rst
@@ -62,7 +62,7 @@ The module defines the following:
 
    *sizehint* informs epoll about the expected number of events to be
    registered.  It must be positive, or ``-1`` to use the default. It is only
-   used on older systems where :c:func:`!epoll_create1` is not available;
+   used on older systems where :manpage:`epoll_create1(2)` is not available;
    otherwise it has no effect (though its value is still checked).
 
    *flags* is deprecated and completely ignored.  However, when supplied, its
@@ -89,6 +89,11 @@ The module defines the following:
       The *flags* parameter.  ``select.EPOLL_CLOEXEC`` is used by default now.
       Use :func:`os.set_inheritable` to make the file descriptor inheritable.
 
+   .. versionchanged:: next
+
+      When CPython is built, this function may be disabled using
+      :option:`--disable-epoll`.
+
 
 .. function:: poll()
 
diff --git a/Doc/using/configure.rst b/Doc/using/configure.rst
index 084c27d2155d0b..b218325b140d43 100644
--- a/Doc/using/configure.rst
+++ b/Doc/using/configure.rst
@@ -463,6 +463,17 @@ General Options
 
    ``pkg-config`` options.
 
+.. option:: --disable-epoll
+
+   Build without ``epoll``, meaning that :py:func:`select.epoll` will not be
+   present even if the system provides an
+   :manpage:`epoll_create <epoll_create(2)>` function.
+   This may be used on systems where :manpage:`!epoll_create` or
+   :manpage:`epoll_create1 <epoll_create1(2)>` is available
+   but incompatible with Linux semantics.
+
+   .. versionadded:: next
+
 
 C compiler options
 ------------------
diff --git 
a/Misc/NEWS.d/next/Build/2026-03-10-16-58-55.gh-issue-138850.CkqTw6.rst 
b/Misc/NEWS.d/next/Build/2026-03-10-16-58-55.gh-issue-138850.CkqTw6.rst
new file mode 100644
index 00000000000000..256f13b28772cc
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2026-03-10-16-58-55.gh-issue-138850.CkqTw6.rst
@@ -0,0 +1 @@
+Add :option:`--disable-epoll` to ``configure``
diff --git a/configure b/configure
index 0c65e5c11e669a..c958b2bf5d84a8 100755
--- a/configure
+++ b/configure
@@ -1133,6 +1133,7 @@ with_pymalloc_hugepages
 with_c_locale_coercion
 with_valgrind
 with_dtrace
+enable_epoll
 with_libm
 with_libc
 enable_big_digits
@@ -1856,6 +1857,7 @@ Optional Features:
                           see Doc/library/sqlite3.rst (default is no)
   --enable-ipv6           enable ipv6 (with ipv4) support, see
                           Doc/library/socket.rst (default is yes if supported)
+  --disable-epoll         disable epoll (default is yes if supported)
   --enable-big-digits[=15|30]
                           use big digits (30 or 15 bits) for Python longs
                           (default is 30)]
@@ -21006,6 +21008,29 @@ fi
 
 
 
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --disable-epoll" >&5
+printf %s "checking for --disable-epoll... " >&6; }
+# Check whether --enable-epoll was given.
+if test ${enable_epoll+y}
+then :
+  enableval=$enable_epoll; if test "x$enable_epoll" = xno
+then :
+  disable_epoll=yes
+else case e in #(
+  e) disable_epoll=no ;;
+esac
+fi
+else case e in #(
+  e) disable_epoll=no
+ ;;
+esac
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $disable_epoll" >&5
+printf "%s\n" "$disable_epoll" >&6; }
+if test "$disable_epoll" = "no"
+then
+
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for epoll_create" >&5
 printf %s "checking for epoll_create... " >&6; }
@@ -21087,6 +21112,8 @@ fi
 
 
 
+fi
+
 
 
   { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for kqueue" >&5
diff --git a/configure.ac b/configure.ac
index bef76c92d0adf9..75aa6519e89197 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5389,8 +5389,20 @@ PY_CHECK_FUNC([symlink], [@%:@include <unistd.h>])
 PY_CHECK_FUNC([fchdir], [@%:@include <unistd.h>])
 PY_CHECK_FUNC([fsync], [@%:@include <unistd.h>])
 PY_CHECK_FUNC([fdatasync], [@%:@include <unistd.h>])
-PY_CHECK_FUNC([epoll_create], [@%:@include <sys/epoll.h>], [HAVE_EPOLL])
-PY_CHECK_FUNC([epoll_create1], [@%:@include <sys/epoll.h>])
+
+AC_MSG_CHECKING([for --disable-epoll])
+AC_ARG_ENABLE([epoll],
+  [AS_HELP_STRING([--disable-epoll], [disable epoll (default is yes if 
supported)])],
+  [AS_VAR_IF([enable_epoll], [no], [disable_epoll=yes], [disable_epoll=no])],
+  [disable_epoll=no]
+)
+AC_MSG_RESULT([$disable_epoll])
+if test "$disable_epoll" = "no"
+then
+  PY_CHECK_FUNC([epoll_create], [@%:@include <sys/epoll.h>], [HAVE_EPOLL])
+  PY_CHECK_FUNC([epoll_create1], [@%:@include <sys/epoll.h>])
+fi
+
 PY_CHECK_FUNC([kqueue],[
 #include <sys/types.h>
 #include <sys/event.h>

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to