mirror of
https://github.com/python/cpython.git
synced 2025-11-02 11:08:57 +00:00
Issue #15037: Build OS X installers with local copy of ncurses 5.9 libraries
to avoid curses.unget_wch bug present in older versions of ncurses such as those shipped with OS X.
This commit is contained in:
parent
dfca8c95c4
commit
a0abb4404a
3 changed files with 93 additions and 105 deletions
|
|
@ -198,7 +198,43 @@ def library_recipes():
|
||||||
configure_pre=[
|
configure_pre=[
|
||||||
'--disable-dependency-tracking',
|
'--disable-dependency-tracking',
|
||||||
]
|
]
|
||||||
)
|
),
|
||||||
|
dict(
|
||||||
|
name="NCurses 5.9",
|
||||||
|
url="http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz",
|
||||||
|
checksum='8cb9c412e5f2d96bc6f459aa8c6282a1',
|
||||||
|
configure_pre=[
|
||||||
|
"--enable-widec",
|
||||||
|
"--without-cxx",
|
||||||
|
"--without-cxx-binding",
|
||||||
|
"--without-ada",
|
||||||
|
"--without-curses-h",
|
||||||
|
"--enable-shared",
|
||||||
|
"--with-shared",
|
||||||
|
"--without-debug",
|
||||||
|
"--without-normal",
|
||||||
|
"--without-termlib",
|
||||||
|
"--without-ticlib",
|
||||||
|
"--without-tests",
|
||||||
|
"--without-manpages",
|
||||||
|
"--datadir=/usr/share",
|
||||||
|
"--sysconfdir=/etc",
|
||||||
|
"--sharedstatedir=/usr/com",
|
||||||
|
"--with-terminfo-dirs=/usr/share/terminfo",
|
||||||
|
"--with-default-terminfo-dir=/usr/share/terminfo",
|
||||||
|
"--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib"%(getVersion(),),
|
||||||
|
],
|
||||||
|
patchscripts=[
|
||||||
|
("ftp://invisible-island.net/ncurses//5.9/ncurses-5.9-20120616-patch.sh.bz2",
|
||||||
|
"f54bf02a349f96a7c4f0d00922f3a0d4"),
|
||||||
|
],
|
||||||
|
useLDFlags=False,
|
||||||
|
install='make && make install DESTDIR=%s && cd %s/usr/local/lib && ln -fs ../../../Library/Frameworks/Python.framework/Versions/%s/lib/lib* .'%(
|
||||||
|
shellQuote(os.path.join(WORKDIR, 'libraries')),
|
||||||
|
shellQuote(os.path.join(WORKDIR, 'libraries')),
|
||||||
|
getVersion(),
|
||||||
|
),
|
||||||
|
),
|
||||||
])
|
])
|
||||||
|
|
||||||
if DEPTARGET < '10.5':
|
if DEPTARGET < '10.5':
|
||||||
|
|
@ -236,8 +272,10 @@ def library_recipes():
|
||||||
patches=[
|
patches=[
|
||||||
# The readline maintainers don't do actual micro releases, but
|
# The readline maintainers don't do actual micro releases, but
|
||||||
# just ship a set of patches.
|
# just ship a set of patches.
|
||||||
'http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-001',
|
('http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-001',
|
||||||
'http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-002',
|
'c642f2e84d820884b0bf9fd176bc6c3f'),
|
||||||
|
('http://ftp.gnu.org/pub/gnu/readline/readline-6.1-patches/readline61-002',
|
||||||
|
'1a76781a1ea734e831588285db7ec9b1'),
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
dict(
|
dict(
|
||||||
|
|
@ -258,36 +296,6 @@ def library_recipes():
|
||||||
'--disable-dependency-tracking',
|
'--disable-dependency-tracking',
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
dict(
|
|
||||||
name="NCurses 5.5",
|
|
||||||
url="http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.5.tar.gz",
|
|
||||||
checksum='e73c1ac10b4bfc46db43b2ddfd6244ef',
|
|
||||||
configure_pre=[
|
|
||||||
"--enable-widec",
|
|
||||||
"--without-cxx",
|
|
||||||
"--without-ada",
|
|
||||||
"--without-progs",
|
|
||||||
"--without-curses-h",
|
|
||||||
"--enable-shared",
|
|
||||||
"--with-shared",
|
|
||||||
"--datadir=/usr/share",
|
|
||||||
"--sysconfdir=/etc",
|
|
||||||
"--sharedstatedir=/usr/com",
|
|
||||||
"--with-terminfo-dirs=/usr/share/terminfo",
|
|
||||||
"--with-default-terminfo-dir=/usr/share/terminfo",
|
|
||||||
"--libdir=/Library/Frameworks/Python.framework/Versions/%s/lib"%(getVersion(),),
|
|
||||||
"--enable-termcap",
|
|
||||||
],
|
|
||||||
patches=[
|
|
||||||
"ncurses-5.5.patch",
|
|
||||||
],
|
|
||||||
useLDFlags=False,
|
|
||||||
install='make && make install DESTDIR=%s && cd %s/usr/local/lib && ln -fs ../../../Library/Frameworks/Python.framework/Versions/%s/lib/lib* .'%(
|
|
||||||
shellQuote(os.path.join(WORKDIR, 'libraries')),
|
|
||||||
shellQuote(os.path.join(WORKDIR, 'libraries')),
|
|
||||||
getVersion(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
])
|
])
|
||||||
|
|
||||||
if not PYTHON_3:
|
if not PYTHON_3:
|
||||||
|
|
@ -660,23 +668,10 @@ def extractArchive(builddir, archiveName):
|
||||||
finally:
|
finally:
|
||||||
os.chdir(curdir)
|
os.chdir(curdir)
|
||||||
|
|
||||||
KNOWNSIZES = {
|
|
||||||
"http://ftp.gnu.org/pub/gnu/readline/readline-5.1.tar.gz": 7952742,
|
|
||||||
"http://downloads.sleepycat.com/db-4.4.20.tar.gz": 2030276,
|
|
||||||
}
|
|
||||||
|
|
||||||
def downloadURL(url, fname):
|
def downloadURL(url, fname):
|
||||||
"""
|
"""
|
||||||
Download the contents of the url into the file.
|
Download the contents of the url into the file.
|
||||||
"""
|
"""
|
||||||
try:
|
|
||||||
size = os.path.getsize(fname)
|
|
||||||
except OSError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
if KNOWNSIZES.get(url) == size:
|
|
||||||
print("Using existing file for", url)
|
|
||||||
return
|
|
||||||
fpIn = urllib_request.urlopen(url)
|
fpIn = urllib_request.urlopen(url)
|
||||||
fpOut = open(fname, 'wb')
|
fpOut = open(fname, 'wb')
|
||||||
block = fpIn.read(10240)
|
block = fpIn.read(10240)
|
||||||
|
|
@ -692,6 +687,24 @@ def downloadURL(url, fname):
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def verifyThirdPartyFile(url, checksum, fname):
|
||||||
|
"""
|
||||||
|
Download file from url to filename fname if it does not already exist.
|
||||||
|
Abort if file contents does not match supplied md5 checksum.
|
||||||
|
"""
|
||||||
|
name = os.path.basename(fname)
|
||||||
|
if os.path.exists(fname):
|
||||||
|
print("Using local copy of %s"%(name,))
|
||||||
|
else:
|
||||||
|
print("Did not find local copy of %s"%(name,))
|
||||||
|
print("Downloading %s"%(name,))
|
||||||
|
downloadURL(url, fname)
|
||||||
|
print("Archive for %s stored as %s"%(name, fname))
|
||||||
|
if os.system(
|
||||||
|
'MD5=$(openssl md5 %s) ; test "${MD5##*= }" = "%s"'
|
||||||
|
% (shellQuote(fname), checksum) ):
|
||||||
|
fatal('MD5 checksum mismatch for file %s' % fname)
|
||||||
|
|
||||||
def buildRecipe(recipe, basedir, archList):
|
def buildRecipe(recipe, basedir, archList):
|
||||||
"""
|
"""
|
||||||
Build software using a recipe. This function does the
|
Build software using a recipe. This function does the
|
||||||
|
|
@ -712,16 +725,7 @@ def buildRecipe(recipe, basedir, archList):
|
||||||
if not os.path.exists(DEPSRC):
|
if not os.path.exists(DEPSRC):
|
||||||
os.mkdir(DEPSRC)
|
os.mkdir(DEPSRC)
|
||||||
|
|
||||||
|
verifyThirdPartyFile(url, recipe['checksum'], sourceArchive)
|
||||||
if os.path.exists(sourceArchive):
|
|
||||||
print("Using local copy of %s"%(name,))
|
|
||||||
|
|
||||||
else:
|
|
||||||
print("Did not find local copy of %s"%(name,))
|
|
||||||
print("Downloading %s"%(name,))
|
|
||||||
downloadURL(url, sourceArchive)
|
|
||||||
print("Archive for %s stored as %s"%(name, sourceArchive))
|
|
||||||
|
|
||||||
print("Extracting archive for %s"%(name,))
|
print("Extracting archive for %s"%(name,))
|
||||||
buildDir=os.path.join(WORKDIR, '_bld')
|
buildDir=os.path.join(WORKDIR, '_bld')
|
||||||
if not os.path.exists(buildDir):
|
if not os.path.exists(buildDir):
|
||||||
|
|
@ -732,18 +736,31 @@ def buildRecipe(recipe, basedir, archList):
|
||||||
if 'buildDir' in recipe:
|
if 'buildDir' in recipe:
|
||||||
os.chdir(recipe['buildDir'])
|
os.chdir(recipe['buildDir'])
|
||||||
|
|
||||||
|
for patch in recipe.get('patches', ()):
|
||||||
for fn in recipe.get('patches', ()):
|
if isinstance(patch, tuple):
|
||||||
if fn.startswith('http://'):
|
url, checksum = patch
|
||||||
# Download the patch before applying it.
|
fn = os.path.join(DEPSRC, os.path.basename(url))
|
||||||
path = os.path.join(DEPSRC, os.path.basename(fn))
|
verifyThirdPartyFile(url, checksum, fn)
|
||||||
downloadURL(fn, path)
|
else:
|
||||||
fn = path
|
# patch is a file in the source directory
|
||||||
|
fn = os.path.join(curdir, patch)
|
||||||
fn = os.path.join(curdir, fn)
|
|
||||||
runCommand('patch -p%s < %s'%(recipe.get('patchlevel', 1),
|
runCommand('patch -p%s < %s'%(recipe.get('patchlevel', 1),
|
||||||
shellQuote(fn),))
|
shellQuote(fn),))
|
||||||
|
|
||||||
|
for patchscript in recipe.get('patchscripts', ()):
|
||||||
|
if isinstance(patchscript, tuple):
|
||||||
|
url, checksum = patchscript
|
||||||
|
fn = os.path.join(DEPSRC, os.path.basename(url))
|
||||||
|
verifyThirdPartyFile(url, checksum, fn)
|
||||||
|
else:
|
||||||
|
# patch is a file in the source directory
|
||||||
|
fn = os.path.join(curdir, patchscript)
|
||||||
|
if fn.endswith('.bz2'):
|
||||||
|
runCommand('bunzip2 -fk %s' % shellQuote(fn))
|
||||||
|
fn = fn[:-4]
|
||||||
|
runCommand('sh %s' % shellQuote(fn))
|
||||||
|
os.unlink(fn)
|
||||||
|
|
||||||
if configure is not None:
|
if configure is not None:
|
||||||
configure_args = [
|
configure_args = [
|
||||||
"--prefix=/usr/local",
|
"--prefix=/usr/local",
|
||||||
|
|
@ -762,25 +779,28 @@ def buildRecipe(recipe, basedir, archList):
|
||||||
|
|
||||||
if recipe.get('useLDFlags', 1):
|
if recipe.get('useLDFlags', 1):
|
||||||
configure_args.extend([
|
configure_args.extend([
|
||||||
"CFLAGS=-arch %s -isysroot %s -I%s/usr/local/include"%(
|
"CFLAGS=-mmacosx-version-min=%s -arch %s -isysroot %s -I%s/usr/local/include"%(
|
||||||
|
DEPTARGET,
|
||||||
' -arch '.join(archList),
|
' -arch '.join(archList),
|
||||||
shellQuote(SDKPATH)[1:-1],
|
shellQuote(SDKPATH)[1:-1],
|
||||||
shellQuote(basedir)[1:-1],),
|
shellQuote(basedir)[1:-1],),
|
||||||
"LDFLAGS=-syslibroot,%s -L%s/usr/local/lib -arch %s"%(
|
"LDFLAGS=-mmacosx-version-min=%s -syslibroot,%s -L%s/usr/local/lib -arch %s"%(
|
||||||
|
DEPTARGET,
|
||||||
shellQuote(SDKPATH)[1:-1],
|
shellQuote(SDKPATH)[1:-1],
|
||||||
shellQuote(basedir)[1:-1],
|
shellQuote(basedir)[1:-1],
|
||||||
' -arch '.join(archList)),
|
' -arch '.join(archList)),
|
||||||
])
|
])
|
||||||
else:
|
else:
|
||||||
configure_args.extend([
|
configure_args.extend([
|
||||||
"CFLAGS=-arch %s -isysroot %s -I%s/usr/local/include"%(
|
"CFLAGS=-mmacosx-version-min=%s -arch %s -isysroot %s -I%s/usr/local/include"%(
|
||||||
|
DEPTARGET,
|
||||||
' -arch '.join(archList),
|
' -arch '.join(archList),
|
||||||
shellQuote(SDKPATH)[1:-1],
|
shellQuote(SDKPATH)[1:-1],
|
||||||
shellQuote(basedir)[1:-1],),
|
shellQuote(basedir)[1:-1],),
|
||||||
])
|
])
|
||||||
|
|
||||||
if 'configure_post' in recipe:
|
if 'configure_post' in recipe:
|
||||||
configure_args = configure_args = list(recipe['configure_post'])
|
configure_args = configure_args + list(recipe['configure_post'])
|
||||||
|
|
||||||
configure_args.insert(0, configure)
|
configure_args.insert(0, configure)
|
||||||
configure_args = [ shellQuote(a) for a in configure_args ]
|
configure_args = [ shellQuote(a) for a in configure_args ]
|
||||||
|
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
||||||
diff -r -u ncurses-5.5-orig/test/Makefile.in ncurses-5.5/test/Makefile.in
|
|
||||||
--- ncurses-5.5-orig/test/Makefile.in 2006-03-24 12:47:40.000000000 +0100
|
|
||||||
+++ ncurses-5.5/test/Makefile.in 2006-03-24 12:47:50.000000000 +0100
|
|
||||||
@@ -75,7 +75,7 @@
|
|
||||||
MATH_LIB = @MATH_LIB@
|
|
||||||
|
|
||||||
LD = @LD@
|
|
||||||
-LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CC) $(CFLAGS)
|
|
||||||
+LINK = @LINK_TESTS@ $(LIBTOOL_LINK) $(CC)
|
|
||||||
|
|
||||||
usFLAGS = @LD_MODEL@ @LOCAL_LDFLAGS@ @LDFLAGS@
|
|
||||||
|
|
||||||
diff -ru ncurses-5.5-orig/ncurses/tinfo/read_entry.c ncurses-5.5/ncurses/tinfo/read_entry.c
|
|
||||||
--- ncurses-5.5-orig/ncurses/tinfo/read_entry.c 2004-01-11 02:57:05.000000000 +0100
|
|
||||||
+++ ncurses-5.5/ncurses/tinfo/read_entry.c 2006-03-25 22:49:39.000000000 +0100
|
|
||||||
@@ -474,7 +474,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
/* truncate the terminal name to prevent buffer overflow */
|
|
||||||
- (void) sprintf(ttn, "%c/%.*s", *tn, (int) sizeof(ttn) - 3, tn);
|
|
||||||
+ (void) sprintf(ttn, "%x/%.*s", *tn, (int) sizeof(ttn) - 3, tn);
|
|
||||||
|
|
||||||
/* This is System V behavior, in conjunction with our requirements for
|
|
||||||
* writing terminfo entries.
|
|
||||||
diff -ru ncurses-5.5-orig/configure ncurses-5.5/configure
|
|
||||||
--- ncurses-5.5-orig/configure 2005-09-24 23:50:50.000000000 +0200
|
|
||||||
+++ ncurses-5.5/configure 2006-03-26 22:24:59.000000000 +0200
|
|
||||||
@@ -5027,7 +5027,7 @@
|
|
||||||
darwin*)
|
|
||||||
EXTRA_CFLAGS="-no-cpp-precomp"
|
|
||||||
CC_SHARED_OPTS="-dynamic"
|
|
||||||
- MK_SHARED_LIB='$(CC) -dynamiclib -install_name $(DESTDIR)$(libdir)/`basename $@` -compatibility_version $(ABI_VERSION) -current_version $(ABI_VERSION) -o $@'
|
|
||||||
+ MK_SHARED_LIB='$(CC) $(CFLAGS) -dynamiclib -install_name $(DESTDIR)$(libdir)/`basename $@` -compatibility_version $(ABI_VERSION) -current_version $(ABI_VERSION) -o $@'
|
|
||||||
test "$cf_cv_shlib_version" = auto && cf_cv_shlib_version=abi
|
|
||||||
cf_cv_shlib_version_infix=yes
|
|
||||||
;;
|
|
||||||
|
|
@ -304,6 +304,10 @@ Tests
|
||||||
Build
|
Build
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
- Issue #15037: Build OS X installers with local copy of ncurses 5.9 libraries
|
||||||
|
to avoid curses.unget_wch bug present in older versions of ncurses such as
|
||||||
|
those shipped with OS X.
|
||||||
|
|
||||||
- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK.
|
- Issue #15560: Fix building _sqlite3 extension on OS X with an SDK.
|
||||||
|
|
||||||
- Issue #8847: Disable COMDAT folding in Windows PGO builds.
|
- Issue #8847: Disable COMDAT folding in Windows PGO builds.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue