summaryrefslogtreecommitdiff
path: root/Mac/BuildScript/build-installer.py
diff options
context:
space:
mode:
authorNed Deily <nad@python.org>2018-01-30 17:29:53 -0500
committerNed Deily <nad@python.org>2018-01-31 17:14:12 -0500
commit1ca2ffdc532622ef001418585c146e6b0f31027f (patch)
treec83a4317d31d253ceae019d44c0bf42292307dce /Mac/BuildScript/build-installer.py
parentb299393cc372f3ecbef4304f8eaa4c7838e975ca (diff)
downloadcpython-git-1ca2ffdc532622ef001418585c146e6b0f31027f.tar.gz
bpo-32726: Build macOS 10.9+ installer with private copy of Tcl/Tk 8.6
Diffstat (limited to 'Mac/BuildScript/build-installer.py')
-rwxr-xr-xMac/BuildScript/build-installer.py116
1 files changed, 67 insertions, 49 deletions
diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
index 8e2e104a0b..1a7080c18f 100755
--- a/Mac/BuildScript/build-installer.py
+++ b/Mac/BuildScript/build-installer.py
@@ -189,6 +189,11 @@ USAGE = textwrap.dedent("""\
# '/Library/Frameworks/Tk.framework/Versions/8.5/Tk']
EXPECTED_SHARED_LIBS = {}
+# Are we building and linking with our own copy of Tcl/TK?
+# For now, do so if deployment target is 10.9+.
+def internalTk():
+ return getDeptargetTuple() >= (10, 9)
+
# List of names of third party software built with this installer.
# The names will be inserted into the rtf version of the License.
THIRD_PARTY_LIBS = []
@@ -217,13 +222,12 @@ def library_recipes():
),
])
-# Disable for now
- if False: # if getDeptargetTuple() > (10, 5):
+ if internalTk():
result.extend([
dict(
- name="Tcl 8.5.15",
- url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tcl8.5.15-src.tar.gz",
- checksum='f3df162f92c69b254079c4d0af7a690f',
+ name="Tcl 8.6.7",
+ url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tcl8.6.7-src.tar.gz",
+ checksum='5673aaf45b5de5d8dd80bb3daaeb8838',
buildDir="unix",
configure_pre=[
'--enable-shared',
@@ -233,16 +237,13 @@ def library_recipes():
useLDFlags=False,
install='make TCL_LIBRARY=%(TCL_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
"DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
- "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
+ "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.6'%(getVersion())),
},
),
dict(
- name="Tk 8.5.15",
- url="ftp://ftp.tcl.tk/pub/tcl//tcl8_5/tk8.5.15-src.tar.gz",
- checksum='55b8e33f903210a4e1c8bce0f820657f',
- patches=[
- "issue19373_tk_8_5_15_source.patch",
- ],
+ name="Tk 8.6.7",
+ url="ftp://ftp.tcl.tk/pub/tcl//tcl8_6/tk8.6.7-src.tar.gz",
+ checksum='46ea9c0165c515d87393700f4891ab6f',
buildDir="unix",
configure_pre=[
'--enable-aqua',
@@ -253,8 +254,8 @@ def library_recipes():
useLDFlags=False,
install='make TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s && make install TCL_LIBRARY=%(TCL_LIBRARY)s TK_LIBRARY=%(TK_LIBRARY)s DESTDIR=%(DESTDIR)s'%{
"DESTDIR": shellQuote(os.path.join(WORKDIR, 'libraries')),
- "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.5'%(getVersion())),
- "TK_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tk8.5'%(getVersion())),
+ "TCL_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tcl8.6'%(getVersion())),
+ "TK_LIBRARY": shellQuote('/Library/Frameworks/Python.framework/Versions/%s/lib/tk8.6'%(getVersion())),
},
),
])
@@ -547,42 +548,45 @@ def checkEnvironment():
fatal("This script should be run on a macOS 10.5 (or later) system")
# Because we only support dynamic load of only one major/minor version of
+ # Tcl/Tk, if we are not using building and using our own private copy of
# Tcl/Tk, ensure:
# 1. there is a user-installed framework (usually ActiveTcl) in (or linked
# in) SDKROOT/Library/Frameworks. As of Python 3.7.0, we no longer
# enforce that the version of the user-installed framework also
# exists in the system-supplied Tcl/Tk frameworks. Time to support
# Tcl/Tk 8.6 even if Apple does not.
-
- frameworks = {}
- for framework in ['Tcl', 'Tk']:
- fwpth = 'Library/Frameworks/%s.framework/Versions/Current' % framework
- libfw = os.path.join('/', fwpth)
- usrfw = os.path.join(os.getenv('HOME'), fwpth)
- frameworks[framework] = os.readlink(libfw)
- if not os.path.exists(libfw):
- fatal("Please install a link to a current %s %s as %s so "
- "the user can override the system framework."
- % (framework, frameworks[framework], libfw))
- if os.path.exists(usrfw):
- fatal("Please rename %s to avoid possible dynamic load issues."
- % usrfw)
-
- if frameworks['Tcl'] != frameworks['Tk']:
- fatal("The Tcl and Tk frameworks are not the same version.")
-
- print(" -- Building with Tcl/Tk %s frameworks"
- % frameworks['Tk'])
+ if not internalTk():
+ frameworks = {}
+ for framework in ['Tcl', 'Tk']:
+ fwpth = 'Library/Frameworks/%s.framework/Versions/Current' % framework
+ libfw = os.path.join('/', fwpth)
+ usrfw = os.path.join(os.getenv('HOME'), fwpth)
+ frameworks[framework] = os.readlink(libfw)
+ if not os.path.exists(libfw):
+ fatal("Please install a link to a current %s %s as %s so "
+ "the user can override the system framework."
+ % (framework, frameworks[framework], libfw))
+ if os.path.exists(usrfw):
+ fatal("Please rename %s to avoid possible dynamic load issues."
+ % usrfw)
+
+ if frameworks['Tcl'] != frameworks['Tk']:
+ fatal("The Tcl and Tk frameworks are not the same version.")
+
+ print(" -- Building with external Tcl/Tk %s frameworks"
+ % frameworks['Tk'])
+
+ # add files to check after build
+ EXPECTED_SHARED_LIBS['_tkinter.so'] = [
+ "/Library/Frameworks/Tcl.framework/Versions/%s/Tcl"
+ % frameworks['Tcl'],
+ "/Library/Frameworks/Tk.framework/Versions/%s/Tk"
+ % frameworks['Tk'],
+ ]
+ else:
+ print(" -- Building private copy of Tcl/Tk")
print("")
- # add files to check after build
- EXPECTED_SHARED_LIBS['_tkinter.so'] = [
- "/Library/Frameworks/Tcl.framework/Versions/%s/Tcl"
- % frameworks['Tcl'],
- "/Library/Frameworks/Tk.framework/Versions/%s/Tk"
- % frameworks['Tk'],
- ]
-
# Remove inherited environment variables which might influence build
environ_var_prefixes = ['CPATH', 'C_INCLUDE_', 'DYLD_', 'LANG', 'LC_',
'LD_', 'LIBRARY_', 'PATH', 'PYTHON']
@@ -1086,12 +1090,18 @@ def buildPython():
"--with-universal-archs=%s "
"%s "
"%s "
+ "%s "
+ "%s "
"LDFLAGS='-g -L%s/libraries/usr/local/lib' "
"CFLAGS='-g -I%s/libraries/usr/local/include' 2>&1"%(
shellQuote(os.path.join(SRCDIR, 'configure')),
UNIVERSALARCHS,
(' ', '--with-computed-gotos ')[PYTHON_3],
(' ', '--without-ensurepip ')[PYTHON_3],
+ (' ', "--with-tcltk-includes='-I%s/libraries/usr/local/include'"%(
+ shellQuote(WORKDIR)[1:-1],))[internalTk()],
+ (' ', "--with-tcltk-libs='-L%s/libraries/usr/local/lib -ltcl8.6 -ltk8.6'"%(
+ shellQuote(WORKDIR)[1:-1],))[internalTk()],
shellQuote(WORKDIR)[1:-1],
shellQuote(WORKDIR)[1:-1]))
@@ -1126,14 +1136,22 @@ def buildPython():
del os.environ['DYLD_LIBRARY_PATH']
print("Copying required shared libraries")
if os.path.exists(os.path.join(WORKDIR, 'libraries', 'Library')):
- runCommand("mv %s/* %s"%(
- shellQuote(os.path.join(
+ build_lib_dir = os.path.join(
WORKDIR, 'libraries', 'Library', 'Frameworks',
- 'Python.framework', 'Versions', getVersion(),
- 'lib')),
- shellQuote(os.path.join(WORKDIR, '_root', 'Library', 'Frameworks',
- 'Python.framework', 'Versions', getVersion(),
- 'lib'))))
+ 'Python.framework', 'Versions', getVersion(), 'lib')
+ fw_lib_dir = os.path.join(
+ WORKDIR, '_root', 'Library', 'Frameworks',
+ 'Python.framework', 'Versions', getVersion(), 'lib')
+ if internalTk():
+ # move Tcl and Tk pkgconfig files
+ runCommand("mv %s/pkgconfig/* %s/pkgconfig"%(
+ shellQuote(build_lib_dir),
+ shellQuote(fw_lib_dir) ))
+ runCommand("rm -r %s/pkgconfig"%(
+ shellQuote(build_lib_dir), ))
+ runCommand("mv %s/* %s"%(
+ shellQuote(build_lib_dir),
+ shellQuote(fw_lib_dir) ))
frmDir = os.path.join(rootDir, 'Library', 'Frameworks', 'Python.framework')
frmDirVersioned = os.path.join(frmDir, 'Versions', version)