[Python-checkins] python/dist/src/Tools/msi msi.py,1.19,1.20

loewis at users.sourceforge.net loewis at users.sourceforge.net
Wed Dec 22 14:41:57 CET 2004


Update of /cvsroot/python/python/dist/src/Tools/msi
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2470

Modified Files:
	msi.py 
Log Message:
Patch #1088716: build and incorporate libpython24.a. Backported to 2.4

Index: msi.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Tools/msi/msi.py,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- msi.py	22 Dec 2004 12:55:44 -0000	1.19
+++ msi.py	22 Dec 2004 13:41:49 -0000	1.20
@@ -1,10 +1,11 @@
 # Python MSI Generator
 # (C) 2003 Martin v. Loewis
 # See "FOO" in comments refers to MSDN sections with the title FOO.
-import msilib, schema, sequence, os, glob, time
+import msilib, schema, sequence, os, glob, time, re
 from msilib import Feature, CAB, Directory, Dialog, Binary, add_data
 import uisample
 from win32com.client import constants
+from distutils.spawn import find_executable
 
 # Settings can be overridden in config.py below
 # 1 for Itanium build
@@ -116,6 +117,52 @@
     'parser.pyd',
     ])
 
+# Build the mingw import library, libpythonXY.a
+# This requires 'nm' and 'dlltool' executables on your PATH
+def build_mingw_lib(lib_file, def_file, dll_file, mingw_lib):
+    warning = "WARNING: %s - libpythonXX.a not built"
+    nm = find_executable('nm')
+    dlltool = find_executable('dlltool')
+
+    if not nm or not dlltool:
+        print warning % "nm and/or dlltool were not found"
+        return False
+
+    nm_command = '%s -Cs %s' % (nm, lib_file)
+    dlltool_command = "%s --dllname %s --def %s --output-lib %s" % \
+        (dlltool, dll_file, def_file, mingw_lib)
+    export_match = re.compile(r"^_imp__(.*) in python\d+\.dll").match
+
+    f = open(def_file,'w')
+    print >>f, "LIBRARY %s" % dll_file
+    print >>f, "EXPORTS"
+
+    nm_pipe = os.popen(nm_command)
+    for line in nm_pipe.readlines():
+        m = export_match(line)
+        if m:
+            print >>f, m.group(1)
+    f.close()
+    exit = nm_pipe.close()
+
+    if exit:
+        print warning % "nm did not run successfully"
+        return False
+
+    if os.system(dlltool_command) != 0:
+        print warning % "dlltool did not run successfully"
+        return False
+
+    return True
+
+# Target files (.def and .a) go in PCBuild directory
+lib_file = os.path.join(srcdir, "PCBuild", "python%s%s.lib" % (major, minor))
+def_file = os.path.join(srcdir, "PCBuild", "python%s%s.def" % (major, minor))
+dll_file = "python%s%s.dll" % (major, minor)
+mingw_lib = os.path.join(srcdir, "PCBuild", "libpython%s%s.a" % (major, minor))
+
+have_mingw = build_mingw_lib(lib_file, def_file, dll_file, mingw_lib)
+
 if testpackage:
     ext = 'px'
     testprefix = 'x'
@@ -924,6 +971,9 @@
     for f in dlls:
         lib.add_file(f.replace('pyd','lib'))
     lib.add_file('python%s%s.lib' % (major, minor))
+    # Add the mingw-format library
+    if have_mingw:
+	lib.add_file('libpython%s%s.a' % (major, minor))
     if have_tcl:
         # Add Tcl/Tk
         tcldirs = [(root, '../tcltk/lib', 'tcl')]



More information about the Python-checkins mailing list