Skip to content

Commit 102fb0d

Browse files
committed
unix: build and use libncursesw so we have Unicode support
This required changing ncurses to build with wide character support, which appends a `w` to the library name and include path. libedit was a bit stubborn, as it didn't look for `libncursesw` by default. And the inline patch is horrible because we couldn't easily run autoconf in the old Debian Jessie build environment. The Python build also needed some tweaks to pick up the new library and include path. We also had to add some preprocessor defines so we enable wide support in curses. I verified that `curses.unget_wch` now exists. Closes #47. Originally reported at indygreg/PyOxidizer#250.
1 parent adf957f commit 102fb0d

File tree

7 files changed

+87
-15
lines changed

7 files changed

+87
-15
lines changed

cpython-unix/build-cpython.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ mv tmp Modules/readline-libedit.c
205205

206206
# Most bits look at CFLAGS. But setup.py only looks at CPPFLAGS.
207207
# So we need to set both.
208-
CFLAGS="-fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncurses"
208+
CFLAGS="-fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncursesw"
209209

210210
if [ "${PYBUILD_PLATFORM}" = "macos" ]; then
211211
CFLAGS="${CFLAGS} -I${TOOLS_PATH}/deps/lib/libffi-3.2.1/include -I${TOOLS_PATH}/deps/include/uuid"

cpython-unix/build-libedit.sh

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,74 @@ tar -xf libedit-${LIBEDIT_VERSION}.tar.gz
1313

1414
pushd libedit-${LIBEDIT_VERSION}
1515

16-
cflags="${EXTRA_TARGET_CFLAGS} -fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncurses"
16+
# libedit's configure isn't smart enough to look for ncursesw. So we teach it
17+
# to. Ideally we would edit configure.ac and run autoconf. But Jessie's autoconf
18+
# is older than what generated libedit's and the tools complain about this at
19+
# run-time. So we hack up the configure script instead.
20+
patch -p1 << "EOF"
21+
diff --git a/configure b/configure
22+
index 5f20ebe..eecc67a 100755
23+
--- a/configure
24+
+++ b/configure
25+
@@ -12448,13 +12448,13 @@ test -n "$NROFF" || NROFF="/bin/false"
26+
27+
28+
29+
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncurses" >&5
30+
-$as_echo_n "checking for tgetent in -lncurses... " >&6; }
31+
-if ${ac_cv_lib_ncurses_tgetent+:} false; then :
32+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lncursesw" >&5
33+
+$as_echo_n "checking for tgetent in -lncursesw... " >&6; }
34+
+if ${ac_cv_lib_ncursesw_tgetent+:} false; then :
35+
$as_echo_n "(cached) " >&6
36+
else
37+
ac_check_lib_save_LIBS=$LIBS
38+
-LIBS="-lncurses $LIBS"
39+
+LIBS="-lncursesw $LIBS"
40+
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
41+
/* end confdefs.h. */
42+
43+
@@ -12474,22 +12474,22 @@ return tgetent ();
44+
}
45+
_ACEOF
46+
if ac_fn_c_try_link "$LINENO"; then :
47+
- ac_cv_lib_ncurses_tgetent=yes
48+
+ ac_cv_lib_ncursesw_tgetent=yes
49+
else
50+
- ac_cv_lib_ncurses_tgetent=no
51+
+ ac_cv_lib_ncursesw_tgetent=no
52+
fi
53+
rm -f core conftest.err conftest.$ac_objext \
54+
conftest$ac_exeext conftest.$ac_ext
55+
LIBS=$ac_check_lib_save_LIBS
56+
fi
57+
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetent" >&5
58+
-$as_echo "$ac_cv_lib_ncurses_tgetent" >&6; }
59+
-if test "x$ac_cv_lib_ncurses_tgetent" = xyes; then :
60+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncursesw_tgetent" >&5
61+
+$as_echo "$ac_cv_lib_ncursesw_tgetent" >&6; }
62+
+if test "x$ac_cv_lib_ncursesw_tgetent" = xyes; then :
63+
cat >>confdefs.h <<_ACEOF
64+
#define HAVE_LIBNCURSES 1
65+
_ACEOF
66+
67+
- LIBS="-lncurses $LIBS"
68+
+ LIBS="-lncursesw $LIBS"
69+
70+
else
71+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetent in -lcurses" >&5
72+
@@ -12624,7 +12624,7 @@ _ACEOF
73+
LIBS="-ltinfo $LIBS"
74+
75+
else
76+
- as_fn_error $? "libncurses, libcurses, libtermcap or libtinfo is required!" "$LINENO" 5
77+
+ as_fn_error $? "libncursesw, libcurses, libtermcap or libtinfo is required!" "$LINENO" 5
78+
79+
fi
80+
81+
EOF
82+
83+
cflags="${EXTRA_TARGET_CFLAGS} -fPIC -I${TOOLS_PATH}/deps/include -I${TOOLS_PATH}/deps/include/ncursesw"
1784

1885
# musl doesn't define __STDC_ISO_10646__, so work around that.
1986
if [ "${CC}" = "musl-clang" ]; then

cpython-unix/build-ncurses.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ CFLAGS="${EXTRA_TARGET_CFLAGS} -fPIC" ./configure \
1717
--build=${BUILD_TRIPLE} \
1818
--host=${TARGET_TRIPLE} \
1919
--prefix=/tools/deps \
20-
--without-cxx
20+
--without-cxx \
21+
--enable-widec
2122
make -j ${NUM_CPUS}
2223
make -j ${NUM_CPUS} install DESTDIR=${ROOT}/out

cpython-unix/static-modules.3.7.linux64

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
_bz2 _bz2module.c -lbz2
77
_crypt _cryptmodule.c -lcrypt
8-
_curses _cursesmodule.c -I/tools/deps/include/ncurses -L/tools/deps/lib -lncurses
9-
_curses_panel _curses_panel.c -I/tools/deps/include/ncurses -L/tools/deps/lib -lpanel -lncurses
8+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lncursesw
9+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lpanelw -lncursesw
1010
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c -I/tools/deps/lib/libffi-3.2.1/include -lffi -ldl
1111
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/memory.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DCONFIG_64=1 -DASM=1 -IModules/_decimal/libmpdec
1212
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -I/tools/deps/include -L/tools/deps/lib -ldb
@@ -32,5 +32,5 @@ pyexpat pyexpat.c expat/xmlparse.c expat/xmlrole.c expat/xmltok.c -DHAVE_EXPAT_C
3232
# picked up by build. We /could/ make libedit first. But since we employ a hack to
3333
# coerce use of libedit on Linux, it seems prudent for the build system to pick
3434
# up readline.
35-
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncurses -L/tools/deps/lib -lreadline -lncurses
36-
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncurses -L/tools/deps/libedit/lib -ledit -lncurses
35+
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncursesw -L/tools/deps/lib -lreadline -lncursesw
36+
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncursesw -L/tools/deps/libedit/lib -ledit -lncursesw

cpython-unix/static-modules.3.7.macos

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
_bz2 _bz2module.c -lbz2
77
_crypt _cryptmodule.c
8-
_curses _cursesmodule.c -lncurses
9-
_curses_panel _curses_panel.c -lpanel -lncurses
8+
# We link against the system ncurses on macOS for simplicity. There is no ncursesw
9+
# but it is Unicode aware.
10+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -D_XOPEN_SOURCE_EXTENDED=1 -lncurses
11+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -D_XOPEN_SOURCE_EXTENDED=1 -lpanel -lncurses
1012
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/darwin/dlfcn_simple.c _ctypes/malloc_closure.c _ctypes/stgdict.c _ctypes/cfield.c -DMACOSX -I_ctypes/darwin -lffi -ldl
1113
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/memory.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DUNIVERSAL=1 -IModules/_decimal/libmpdec
1214
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -ldb

cpython-unix/static-modules.3.8.linux64

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
_bz2 _bz2module.c -lbz2
77
_crypt _cryptmodule.c -lcrypt
8-
_curses _cursesmodule.c -I/tools/deps/include/ncurses -L/tools/deps/lib -lncurses
9-
_curses_panel _curses_panel.c -I/tools/deps/include/ncurses -L/tools/deps/lib -lpanel -lncurses
8+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lncursesw
9+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -I/tools/deps/include/ncursesw -L/tools/deps/lib -lpanelw -lncursesw
1010
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c -I/tools/deps/lib/libffi-3.2.1/include -lffi -ldl
1111
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/memory.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DCONFIG_64=1 -DASM=1 -IModules/_decimal/libmpdec
1212
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -I/tools/deps/include -L/tools/deps/lib -ldb
@@ -33,5 +33,5 @@ pyexpat pyexpat.c expat/xmlparse.c expat/xmlrole.c expat/xmltok.c -DHAVE_EXPAT_C
3333
# picked up by build. We /could/ make libedit first. But since we employ a hack to
3434
# coerce use of libedit on Linux, it seems prudent for the build system to pick
3535
# up readline.
36-
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncurses -L/tools/deps/lib -lreadline -lncurses
37-
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncurses -L/tools/deps/libedit/lib -ledit -lncurses
36+
readline VARIANT=readline readline.c -I/tools/deps/include -I/tools/deps/include/ncursesw -L/tools/deps/lib -lreadline -lncursesw
37+
readline VARIANT=libedit readline-libedit.c -DUSE_LIBEDIT=1 -I/tools/deps/libedit/include -I/tools/deps/libedit/include/ncursesw -L/tools/deps/libedit/lib -ledit -lncursesw

cpython-unix/static-modules.3.8.macos

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
_bz2 _bz2module.c -lbz2
77
_crypt _cryptmodule.c
8-
_curses _cursesmodule.c -lncurses
9-
_curses_panel _curses_panel.c -lpanel -lncurses
8+
# We link against the system ncurses on macOS for simplicity. There is no ncursesw
9+
# but it is Unicode aware.
10+
_curses _cursesmodule.c -DHAVE_NCURSESW=1 -D_XOPEN_SOURCE_EXTENDED=1 -lncurses
11+
_curses_panel _curses_panel.c -DHAVE_NCURSESW=1 -D_XOPEN_SOURCE_EXTENDED=1 -lpanel -lncurses
1012
_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c _ctypes/callproc.c _ctypes/darwin/dlfcn_simple.c _ctypes/malloc_closure.c _ctypes/stgdict.c _ctypes/cfield.c -DMACOSX -I_ctypes/darwin -lffi -ldl
1113
_decimal _decimal/_decimal.c _decimal/libmpdec/basearith.c _decimal/libmpdec/constants.c _decimal/libmpdec/context.c _decimal/libmpdec/convolute.c _decimal/libmpdec/crt.c _decimal/libmpdec/difradix2.c _decimal/libmpdec/fnt.c _decimal/libmpdec/fourstep.c _decimal/libmpdec/io.c _decimal/libmpdec/memory.c _decimal/libmpdec/mpdecimal.c _decimal/libmpdec/numbertheory.c _decimal/libmpdec/sixstep.c _decimal/libmpdec/transpose.c -DUNIVERSAL=1 -IModules/_decimal/libmpdec
1214
_dbm _dbmmodule.c -DHAVE_BERKDB_H -DDB_DBM_HSEARCH -ldb

0 commit comments

Comments
 (0)