mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
gh-109617: fix ncurses incompatibility on macOS with Xcode 15 (#111258)
Co-authored-by: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
parent
291cfa454b
commit
08d169f14a
5 changed files with 77 additions and 21 deletions
|
@ -23,10 +23,16 @@
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(HAVE_CURSES_IS_PAD) && defined(WINDOW_HAS_FLAGS)
|
#if defined(WINDOW_HAS_FLAGS) && defined(__APPLE__)
|
||||||
/* The following definition is necessary for ncurses 5.7; without it,
|
/* gh-109617, gh-115383: we can rely on the default value for NCURSES_OPAQUE on
|
||||||
some of [n]curses.h set NCURSES_OPAQUE to 1, and then Python
|
most platforms, but not on macOS. This is because, starting with Xcode 15,
|
||||||
can't get at the WINDOW flags field. */
|
Apple-provided ncurses.h comes from ncurses 6 (which defaults to opaque
|
||||||
|
structs) but can still be linked to older versions of ncurses dynamic
|
||||||
|
libraries which don't provide functions such as is_pad() to deal with opaque
|
||||||
|
structs. Setting NCURSES_OPAQUE to 0 is harmless in all ncurses releases to
|
||||||
|
this date (provided that a thread-safe implementation is not required), but
|
||||||
|
this might change in the future. This fix might become irrelevant once
|
||||||
|
support for macOS 13 or earlier is dropped. */
|
||||||
#define NCURSES_OPAQUE 0
|
#define NCURSES_OPAQUE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -39,7 +45,10 @@
|
||||||
#ifdef HAVE_NCURSES_H
|
#ifdef HAVE_NCURSES_H
|
||||||
/* configure was checking <curses.h>, but we will
|
/* configure was checking <curses.h>, but we will
|
||||||
use <ncurses.h>, which has some or all these features. */
|
use <ncurses.h>, which has some or all these features. */
|
||||||
#if !defined(WINDOW_HAS_FLAGS) && !(NCURSES_OPAQUE+0)
|
#if !defined(WINDOW_HAS_FLAGS) && \
|
||||||
|
(NCURSES_VERSION_PATCH+0 < 20070303 || !(NCURSES_OPAQUE+0))
|
||||||
|
/* the WINDOW flags field was always accessible in ncurses prior to 20070303;
|
||||||
|
after that, it depends on the value of NCURSES_OPAQUE. */
|
||||||
#define WINDOW_HAS_FLAGS 1
|
#define WINDOW_HAS_FLAGS 1
|
||||||
#endif
|
#endif
|
||||||
#if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906
|
#if !defined(HAVE_CURSES_IS_PAD) && NCURSES_VERSION_PATCH+0 >= 20090906
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
:mod:`ncurses`: fixed a crash that could occur on macOS 13 or earlier when
|
||||||
|
Python was built with Apple Xcode 15's SDK.
|
|
@ -1156,8 +1156,10 @@ int py_mvwdelch(WINDOW *w, int y, int x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(HAVE_CURSES_IS_PAD)
|
#if defined(HAVE_CURSES_IS_PAD)
|
||||||
|
// is_pad() is defined, either as a macro or as a function
|
||||||
#define py_is_pad(win) is_pad(win)
|
#define py_is_pad(win) is_pad(win)
|
||||||
#elif defined(WINDOW_HAS_FLAGS)
|
#elif defined(WINDOW_HAS_FLAGS)
|
||||||
|
// is_pad() is not defined, but we can inspect WINDOW structure members
|
||||||
#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
|
#define py_is_pad(win) ((win) ? ((win)->_flags & _ISPAD) != 0 : FALSE)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -4586,7 +4588,14 @@ make_ncurses_version(PyTypeObject *type)
|
||||||
if (ncurses_version == NULL) {
|
if (ncurses_version == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
const char *str = curses_version();
|
||||||
|
unsigned long major = 0, minor = 0, patch = 0;
|
||||||
|
if (!str || sscanf(str, "%*[^0-9]%lu.%lu.%lu", &major, &minor, &patch) < 3) {
|
||||||
|
// Fallback to header version, which cannot be that wrong
|
||||||
|
major = NCURSES_VERSION_MAJOR;
|
||||||
|
minor = NCURSES_VERSION_MINOR;
|
||||||
|
patch = NCURSES_VERSION_PATCH;
|
||||||
|
}
|
||||||
#define SetIntItem(flag) \
|
#define SetIntItem(flag) \
|
||||||
PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \
|
PyStructSequence_SET_ITEM(ncurses_version, pos++, PyLong_FromLong(flag)); \
|
||||||
if (PyErr_Occurred()) { \
|
if (PyErr_Occurred()) { \
|
||||||
|
@ -4594,9 +4603,9 @@ make_ncurses_version(PyTypeObject *type)
|
||||||
return NULL; \
|
return NULL; \
|
||||||
}
|
}
|
||||||
|
|
||||||
SetIntItem(NCURSES_VERSION_MAJOR)
|
SetIntItem(major)
|
||||||
SetIntItem(NCURSES_VERSION_MINOR)
|
SetIntItem(minor)
|
||||||
SetIntItem(NCURSES_VERSION_PATCH)
|
SetIntItem(patch)
|
||||||
#undef SetIntItem
|
#undef SetIntItem
|
||||||
|
|
||||||
return ncurses_version;
|
return ncurses_version;
|
||||||
|
|
55
configure
generated
vendored
55
configure
generated
vendored
|
@ -26781,7 +26781,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -26824,7 +26827,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -26867,7 +26873,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -26910,7 +26919,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -26953,7 +26965,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -26996,7 +27011,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -27039,7 +27057,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -27082,7 +27103,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -27125,7 +27149,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -27168,7 +27195,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
@ -27211,7 +27241,10 @@ then :
|
||||||
else $as_nop
|
else $as_nop
|
||||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
/* end confdefs.h. */
|
/* end confdefs.h. */
|
||||||
#include <curses.h>
|
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
main (void)
|
main (void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -6713,7 +6713,10 @@ AC_DEFUN([PY_CHECK_CURSES_FUNC],
|
||||||
[py_var],
|
[py_var],
|
||||||
[AC_COMPILE_IFELSE(
|
[AC_COMPILE_IFELSE(
|
||||||
[AC_LANG_PROGRAM(
|
[AC_LANG_PROGRAM(
|
||||||
[@%:@include <curses.h>], [
|
[
|
||||||
|
#define NCURSES_OPAQUE 0
|
||||||
|
#include <curses.h>
|
||||||
|
], [
|
||||||
#ifndef $1
|
#ifndef $1
|
||||||
void *x=$1
|
void *x=$1
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue