diff --git a/Misc/NEWS.d/next/Build/2026-07-19-12-16-31.gh-issue-154070.f5da07.rst b/Misc/NEWS.d/next/Build/2026-07-19-12-16-31.gh-issue-154070.f5da07.rst new file mode 100644 index 00000000000000..31c6fd3ece3532 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2026-07-19-12-16-31.gh-issue-154070.f5da07.rst @@ -0,0 +1,4 @@ +Build the :mod:`curses` module against a wide-character capable ncurses +even when it is not named ``ncursesw`` -- for example the pkgsrc ncurses on +NetBSD and illumos, or the system ncurses on macOS. Such a library +previously produced a narrow build. diff --git a/configure b/configure index 08b493311a3f92..3a884cc3ff771a 100755 --- a/configure +++ b/configure @@ -30910,10 +30910,19 @@ fi PANEL_CFLAGS=$(echo $PANEL_CFLAGS | sed 's/-D_XOPEN_SOURCE=600//g') -if test "x$with_curses" = xcurses -then : +case $with_curses in #( + ncursesw|no) : + ;; #( + *) : - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether curses supports wide characters" >&5 + save_CFLAGS=$CFLAGS +save_CPPFLAGS=$CPPFLAGS +save_LDFLAGS=$LDFLAGS +save_LIBS=$LIBS + + + as_fn_append CPPFLAGS " $CURSES_CFLAGS" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether curses supports wide characters" >&5 printf %s "checking whether curses supports wide characters... " >&6; } if test ${ac_cv_curses_wide+y} then : @@ -30941,9 +30950,9 @@ int main (void) { - cchar_t wcval; - setcchar(&wcval, L"x", A_NORMAL, 0, NULL); - add_wch(&wcval); + cchar_t wcval; + setcchar(&wcval, L"x", A_NORMAL, 0, NULL); + add_wch(&wcval); ; return 0; @@ -30962,13 +30971,20 @@ esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_curses_wide" >&5 printf "%s\n" "$ac_cv_curses_wide" >&6; } + +CFLAGS=$save_CFLAGS +CPPFLAGS=$save_CPPFLAGS +LDFLAGS=$save_LDFLAGS +LIBS=$save_LIBS + + if test "x$ac_cv_curses_wide" = xyes then : printf "%s\n" "#define HAVE_NCURSESW 1" >>confdefs.h fi - -fi + ;; +esac # On Solaris, term.h requires curses.h ac_fn_c_check_header_compile "$LINENO" "term.h" "ac_cv_header_term_h" " diff --git a/configure.ac b/configure.ac index f40db5bc82e24a..2f0ea566565423 100644 --- a/configure.ac +++ b/configure.ac @@ -7248,22 +7248,27 @@ AS_VAR_IF([ac_sys_system], [Darwin], [ dnl pyconfig.h defines _XOPEN_SOURCE=700 PANEL_CFLAGS=$(echo $PANEL_CFLAGS | sed 's/-D_XOPEN_SOURCE=600//g') -dnl Native curses ("curses") may be wide-character capable (e.g. on NetBSD) -dnl even though it is not ncursesw. Probe for the wide API; if present, build -dnl the module against it like ncursesw by defining HAVE_NCURSESW. ncursesw -dnl already defines HAVE_NCURSESW, and ncurses must stay narrow, so only the -dnl native backend is probed here. -AS_VAR_IF([with_curses], [curses], [ - AC_CACHE_CHECK([whether curses supports wide characters], - [ac_cv_curses_wide], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM([_CURSES_INCLUDES], [[ - cchar_t wcval; - setcchar(&wcval, L"x", A_NORMAL, 0, NULL); - add_wch(&wcval); - ]])], - [ac_cv_curses_wide=yes], - [ac_cv_curses_wide=no])]) +dnl A curses that is not named "ncursesw" can still be wide-character capable: +dnl the system curses of NetBSD, or an ncurses built with --enable-widec that +dnl keeps the plain name (pkgsrc, macOS). Probe for the wide API and, if +dnl present, build the module wide by defining HAVE_NCURSESW. The "ncursesw" +dnl backend already defines it, so only the other backends are probed. +AS_CASE([$with_curses], [ncursesw|no], [], [ + WITH_SAVE_ENV([ + dnl Use the adjusted CURSES_CFLAGS (e.g. macOS's -D_XOPEN_SOURCE_EXTENDED) + dnl so the wide-character declarations are visible to the probe. + AS_VAR_APPEND([CPPFLAGS], [" $CURSES_CFLAGS"]) + AC_CACHE_CHECK([whether curses supports wide characters], + [ac_cv_curses_wide], + [AC_LINK_IFELSE( + [AC_LANG_PROGRAM([_CURSES_INCLUDES], [[ + cchar_t wcval; + setcchar(&wcval, L"x", A_NORMAL, 0, NULL); + add_wch(&wcval); + ]])], + [ac_cv_curses_wide=yes], + [ac_cv_curses_wide=no])]) + ]) dnl HAVE_NCURSESW marks the wide (cchar_t) curses API; its template comes dnl from the ncursesw pkg-config check above, so no description here. AS_VAR_IF([ac_cv_curses_wide], [yes], [AC_DEFINE([HAVE_NCURSESW], [1])])