https://github.com/python/cpython/commit/32fd69bdea00ce4dc24959734cc0d9284eb52f1e
commit: 32fd69bdea00ce4dc24959734cc0d9284eb52f1e
branch: main
author: Petr Viktorin <[email protected]>
committer: freakboy3742 <[email protected]>
date: 2026-10-14T11:36:44+08:00
summary:

gh-153711: Test availability for dup3() and pipe2() on iOS (#155222)

Modifies the configure test for dup3 and pipe2 to allow for iOS. These symbols
exist, but are unlinkable on iOS 26.

Co-authored-by: Russell Keith-Magee <[email protected]>
Co-authored-by: Ned Deily <[email protected]>

files:
A Misc/NEWS.d/next/Library/2026-08-05-10-13-23.gh-issue-153711.9g9dVz.rst
M Doc/library/os.rst
M Modules/posixmodule.c
M configure
M configure.ac

diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 32ab3aeb501871..3f0b91af4d0a86 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -1479,7 +1479,7 @@ or `the MSDN 
<https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>`_ on Windo
    Return a pair of file descriptors ``(r, w)`` usable for reading and writing,
    respectively.
 
-   .. availability:: Unix, macOS >= 27.0, not WASI, not iOS.
+   .. availability:: Unix, macOS >= 27.0, iOS >= 27.0, not WASI.
 
    .. versionadded:: 3.3
 
diff --git 
a/Misc/NEWS.d/next/Library/2026-08-05-10-13-23.gh-issue-153711.9g9dVz.rst 
b/Misc/NEWS.d/next/Library/2026-08-05-10-13-23.gh-issue-153711.9g9dVz.rst
new file mode 100644
index 00000000000000..ca825ce6917db9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-08-05-10-13-23.gh-issue-153711.9g9dVz.rst
@@ -0,0 +1,3 @@
+On iOS, add :func:`os.pipe2`, and use the syscalls :manpage:`pipe2 (2)` and
+:manpage:`dup3 (2)` internally, when available at both build-time and
+run-time.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 8b226d73a27606..a3f4449e8bc486 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -513,8 +513,8 @@ static const unsigned int _Py_STATX_KNOWN = 
(STATX_BASIC_STATS | STATX_BTIME
 #  define HAVE_MKFIFOAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 
16.0, watchOS 9.0, *)
 #  define HAVE_MKNODAT_RUNTIME __builtin_available(macOS 13.0, iOS 16.0, tvOS 
16.0, watchOS 9.0, *)
 #  define HAVE_PTSNAME_R_RUNTIME __builtin_available(macOS 10.13.4, iOS 11.3, 
tvOS 11.3, watchOS 4.3, *)
-#  define HAVE_DUP3_RUNTIME __builtin_available(macOS 27.0, *)
-#  define HAVE_PIPE2_RUNTIME __builtin_available(macOS 27.0, *)
+#  define HAVE_DUP3_RUNTIME __builtin_available(macOS 27.0, iOS 27.0, tvOS 
27.0, watchOS 27.0, visionOS 27.0, *)
+#  define HAVE_PIPE2_RUNTIME __builtin_available(macOS 27.0, iOS 27.0, tvOS 
27.0, watchOS 27.0, visionOS 27.0, *)
 
 #  define HAVE_POSIX_SPAWN_SETSID_RUNTIME __builtin_available(macOS 10.15, *)
 
diff --git a/configure b/configure
index 7a4c4ac9e1faeb..a628d337003b1e 100755
--- a/configure
+++ b/configure
@@ -4288,7 +4288,7 @@ if test -z "$AR"; then
                aarch64-apple-ios*)           AR=arm64-apple-ios-ar ;;
                x86_64-apple-ios*-simulator)  AR=x86_64-apple-ios-simulator-ar 
;;
                *)
-       esac
+    esac
 fi
 if test -z "$CC"; then
        case "$host" in
@@ -21849,8 +21849,37 @@ fi
 # found by configure), but either raise a compilation error (because the
 # header definition prevents usage - autoconf doesn't use the headers), or
 # raise an error if used at runtime. Force these symbols off.
-if test "$ac_sys_system" != "iOS" ; then
-  ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3"
+# In particular, dup3 and pipe2 are available as of iOS 27 but were
+# incorrectly detected in older simulator versions.
+case "$ac_sys_system" in
+    iOS)
+        { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if iOS SDK is 
older than 27" >&5
+printf %s "checking if iOS SDK is older than 27... " >&6; }
+        ios_sdk_version=$(xcrun --sdk iphoneos --show-sdk-version 2>/dev/null 
| cut -d. -f1)
+        if test -n "$ios_sdk_version" && test "$ios_sdk_version" -ge 27; then
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+            ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3"
+if test "x$ac_cv_func_dup3" = xyes
+then :
+  printf "%s\n" "#define HAVE_DUP3 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
+if test "x$ac_cv_func_pipe2" = xyes
+then :
+  printf "%s\n" "#define HAVE_PIPE2 1" >>confdefs.h
+
+fi
+
+        else
+            { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+        fi
+        ;;
+    *)
+        # not iOS
+        ac_fn_c_check_func "$LINENO" "dup3" "ac_cv_func_dup3"
 if test "x$ac_cv_func_dup3" = xyes
 then :
   printf "%s\n" "#define HAVE_DUP3 1" >>confdefs.h
@@ -21881,7 +21910,8 @@ then :
 
 fi
 
-fi
+        ;;
+esac
 
 ac_fn_check_decl "$LINENO" "dirfd" "ac_cv_have_decl_dirfd" "#include 
<sys/types.h>
                #include <dirent.h>
diff --git a/configure.ac b/configure.ac
index 6ac3c887ae2917..cf01e6fa82bceb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -439,7 +439,7 @@ if test -z "$AR"; then
                aarch64-apple-ios*)           AR=arm64-apple-ios-ar ;;
                x86_64-apple-ios*-simulator)  AR=x86_64-apple-ios-simulator-ar 
;;
                *)
-       esac
+    esac
 fi
 if test -z "$CC"; then
        case "$host" in
@@ -5605,9 +5605,24 @@ fi
 # found by configure), but either raise a compilation error (because the
 # header definition prevents usage - autoconf doesn't use the headers), or
 # raise an error if used at runtime. Force these symbols off.
-if test "$ac_sys_system" != "iOS" ; then
-  AC_CHECK_FUNCS([dup3 getentropy getgroups pipe2 system])
-fi
+# In particular, dup3 and pipe2 are available as of iOS 27 but were
+# incorrectly detected in older simulator versions.
+case "$ac_sys_system" in
+    iOS)
+        AC_MSG_CHECKING([if iOS SDK is older than 27])
+        ios_sdk_version=$(xcrun --sdk iphoneos --show-sdk-version 2>/dev/null 
| cut -d. -f1)
+        if test -n "$ios_sdk_version" && test "$ios_sdk_version" -ge 27; then
+            AC_MSG_RESULT([no])
+            AC_CHECK_FUNCS([dup3 pipe2])
+        else
+            AC_MSG_RESULT([yes])
+        fi
+        ;;
+    *)
+        # not iOS
+        AC_CHECK_FUNCS([dup3 getentropy getgroups pipe2 system])
+        ;;
+esac
 
 AC_CHECK_DECL([dirfd],
               [AC_DEFINE([HAVE_DIRFD], [1],

_______________________________________________
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