mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
Issue #7384: If the system readline library is linked against
ncurses, do not link the readline module against ncursesw.
This commit is contained in:
parent
0dc3d035f3
commit
b0434fcd4b
3 changed files with 53 additions and 24 deletions
|
@ -23,11 +23,6 @@ requires('curses')
|
||||||
curses = import_module('curses')
|
curses = import_module('curses')
|
||||||
curses.panel = import_module('curses.panel')
|
curses.panel = import_module('curses.panel')
|
||||||
|
|
||||||
# skip all these tests on FreeBSD: test_curses currently hangs the
|
|
||||||
# FreeBSD buildbots, preventing other tests from running. See issue
|
|
||||||
# #7384.
|
|
||||||
if 'freebsd' in sys.platform:
|
|
||||||
raise unittest.SkipTest('The curses module is broken on FreeBSD. See http://bugs.python.org/issue7384.')
|
|
||||||
|
|
||||||
# XXX: if newterm was supported we could use it instead of initscr and not exit
|
# XXX: if newterm was supported we could use it instead of initscr and not exit
|
||||||
term = os.environ.get('TERM')
|
term = os.environ.get('TERM')
|
||||||
|
|
|
@ -244,6 +244,11 @@ Library
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #7384: If the system readline library is linked against
|
||||||
|
ncurses, do not link the readline module against ncursesw. The
|
||||||
|
additional restriction of linking the readline and curses modules
|
||||||
|
against the same curses library is currently not enabled.
|
||||||
|
|
||||||
- Issue #8973: Add __all__ to struct module; this ensures that
|
- Issue #8973: Add __all__ to struct module; this ensures that
|
||||||
help(struct) includes documentation for the struct.Struct class.
|
help(struct) includes documentation for the struct.Struct class.
|
||||||
|
|
||||||
|
|
67
setup.py
67
setup.py
|
@ -14,6 +14,7 @@ from distutils.core import Extension, setup
|
||||||
from distutils.command.build_ext import build_ext
|
from distutils.command.build_ext import build_ext
|
||||||
from distutils.command.install import install
|
from distutils.command.install import install
|
||||||
from distutils.command.install_lib import install_lib
|
from distutils.command.install_lib import install_lib
|
||||||
|
from distutils.spawn import find_executable
|
||||||
|
|
||||||
# This global variable is used to hold the list of modules to be disabled.
|
# This global variable is used to hold the list of modules to be disabled.
|
||||||
disabled_module_list = []
|
disabled_module_list = []
|
||||||
|
@ -538,6 +539,42 @@ class PyBuildExt(build_ext):
|
||||||
|
|
||||||
# readline
|
# readline
|
||||||
do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
|
do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
|
||||||
|
readline_termcap_library = ""
|
||||||
|
curses_library = ""
|
||||||
|
# Determine if readline is already linked against curses or tinfo.
|
||||||
|
if do_readline and find_executable('ldd'):
|
||||||
|
# Cannot use os.popen here in py3k.
|
||||||
|
tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
|
||||||
|
if not os.path.exists(self.build_temp):
|
||||||
|
os.makedirs(self.build_temp)
|
||||||
|
os.system("ldd %s > %s" % (do_readline, tmpfile))
|
||||||
|
fp = open(tmpfile)
|
||||||
|
for ln in fp:
|
||||||
|
if 'curses' in ln:
|
||||||
|
readline_termcap_library = re.sub(
|
||||||
|
r'.*lib(n?cursesw?)\.so.*', r'\1', ln
|
||||||
|
).rstrip()
|
||||||
|
break
|
||||||
|
if 'tinfo' in ln: # termcap interface split out from ncurses
|
||||||
|
readline_termcap_library = 'tinfo'
|
||||||
|
break
|
||||||
|
fp.close()
|
||||||
|
os.unlink(tmpfile)
|
||||||
|
# Issue 7384: If readline is already linked against curses,
|
||||||
|
# use the same library for the readline and curses modules.
|
||||||
|
# Disabled since applications relying on ncursesw might break.
|
||||||
|
#
|
||||||
|
# if 'curses' in readline_termcap_library:
|
||||||
|
# curses_library = readline_termcap_library
|
||||||
|
# elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
|
||||||
|
# (...)
|
||||||
|
if self.compiler.find_library_file(lib_dirs, 'ncursesw'):
|
||||||
|
curses_library = 'ncursesw'
|
||||||
|
elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
|
||||||
|
curses_library = 'ncurses'
|
||||||
|
elif self.compiler.find_library_file(lib_dirs, 'curses'):
|
||||||
|
curses_library = 'curses'
|
||||||
|
|
||||||
if platform == 'darwin': # and os.uname()[2] < '9.':
|
if platform == 'darwin': # and os.uname()[2] < '9.':
|
||||||
# MacOSX 10.4 has a broken readline. Don't try to build
|
# MacOSX 10.4 has a broken readline. Don't try to build
|
||||||
# the readline module unless the user has installed a fixed
|
# the readline module unless the user has installed a fixed
|
||||||
|
@ -558,14 +595,10 @@ class PyBuildExt(build_ext):
|
||||||
readline_extra_link_args = ()
|
readline_extra_link_args = ()
|
||||||
|
|
||||||
readline_libs = ['readline']
|
readline_libs = ['readline']
|
||||||
if self.compiler.find_library_file(lib_dirs,
|
if readline_termcap_library:
|
||||||
'ncursesw'):
|
pass # Issue 7384: Already linked against curses or tinfo.
|
||||||
readline_libs.append('ncursesw')
|
elif curses_library:
|
||||||
elif self.compiler.find_library_file(lib_dirs,
|
readline_libs.append(curses_library)
|
||||||
'ncurses'):
|
|
||||||
readline_libs.append('ncurses')
|
|
||||||
elif self.compiler.find_library_file(lib_dirs, 'curses'):
|
|
||||||
readline_libs.append('curses')
|
|
||||||
elif self.compiler.find_library_file(lib_dirs +
|
elif self.compiler.find_library_file(lib_dirs +
|
||||||
['/usr/lib/termcap'],
|
['/usr/lib/termcap'],
|
||||||
'termcap'):
|
'termcap'):
|
||||||
|
@ -1071,19 +1104,15 @@ class PyBuildExt(build_ext):
|
||||||
# Curses support, requiring the System V version of curses, often
|
# Curses support, requiring the System V version of curses, often
|
||||||
# provided by the ncurses library.
|
# provided by the ncurses library.
|
||||||
panel_library = 'panel'
|
panel_library = 'panel'
|
||||||
if (self.compiler.find_library_file(lib_dirs, 'ncursesw')):
|
if curses_library.startswith('ncurses'):
|
||||||
curses_libs = ['ncursesw']
|
if curses_library == 'ncursesw':
|
||||||
# Bug 1464056: If _curses.so links with ncursesw,
|
# Bug 1464056: If _curses.so links with ncursesw,
|
||||||
# _curses_panel.so must link with panelw.
|
# _curses_panel.so must link with panelw.
|
||||||
panel_library = 'panelw'
|
panel_library = 'panelw'
|
||||||
|
curses_libs = [curses_library]
|
||||||
exts.append( Extension('_curses', ['_cursesmodule.c'],
|
exts.append( Extension('_curses', ['_cursesmodule.c'],
|
||||||
libraries = curses_libs) )
|
libraries = curses_libs) )
|
||||||
elif (self.compiler.find_library_file(lib_dirs, 'ncurses')):
|
elif curses_library == 'curses' and platform != 'darwin':
|
||||||
curses_libs = ['ncurses']
|
|
||||||
exts.append( Extension('_curses', ['_cursesmodule.c'],
|
|
||||||
libraries = curses_libs) )
|
|
||||||
elif (self.compiler.find_library_file(lib_dirs, 'curses')
|
|
||||||
and platform != 'darwin'):
|
|
||||||
# OSX has an old Berkeley curses, not good enough for
|
# OSX has an old Berkeley curses, not good enough for
|
||||||
# the _curses module.
|
# the _curses module.
|
||||||
if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
|
if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue