[libxml2/python3-windows: 31/32] Python distutils: Make DLL packaging more flexible




commit f5c10af46cdace303cd203f461308fabe8eb7cf5
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Thu Jul 22 15:36:15 2021 +0800

    Python distutils: Make DLL packaging more flexible
    
    This updates setup.py.in to pack the DLLs according to the options we specified
    to configure.js or CMake (or, even configure, although autotools builds are not
    likely to build the libxml2 Python module via distutils).
    
    At this point, we can pack only the DLLs that libxml2 really depends on, and
    pack the libxslt DLLs only if we really built the libxslt Python modules.
    
    Also make the DLL filenames more easily configured

 python/setup.py.in | 78 ++++++++++++++++++++++++++++++++++--------------------
 win32/configure.js |  8 ++++++
 2 files changed, 58 insertions(+), 28 deletions(-)
---
diff --git a/python/setup.py.in b/python/setup.py.in
index 90c21147..fce63824 100755
--- a/python/setup.py.in
+++ b/python/setup.py.in
@@ -13,6 +13,26 @@ ROOT = r'@prefix@'
 # Thread-enabled libxml2
 with_threads = @WITH_THREADS@
 
+# Features of libxml2 requiring external DLLs
+with_iconv = @WITH_ICONV@
+with_zlib = @WITH_ZLIB@
+with_lzma = @WITH_LZMA@
+with_icu = @WITH_ICU@
+
+icu_series = 69
+
+if icu_series is not None:
+    icu_series_s = str(icu_series)
+else:
+    icu_series_s = ''
+
+# If bundling DLLs, check the following to ensure things are correct
+# (Check the value of `icu_series` above as well)
+iconv_dll = 'iconv.dll'
+zlib_dll = 'zlib1.dll'
+lzma_dll = 'liblzma.dll'
+icu_dlls = ['icuuc%s.dll' % icu_series_s, 'icudt%s.dll' % icu_series_s]
+
 # If this flag is set (windows only),
 # a private copy of the dlls are included in the package.
 # If this flag is not set, the libxml2 and libxslt
@@ -29,21 +49,6 @@ try:
 except:
     HOME="C:"
 
-if WITHDLLS:
-    # libxml dlls (expected in ROOT/bin)
-    dlls = [ 'iconv.dll','libxml2.dll','libxslt.dll','libexslt.dll' ]
-    dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls]
-
-    # create __init__.py for the libxmlmods package
-    if not os.path.exists("libxmlmods"):
-        os.mkdir("libxmlmods")
-        open("libxmlmods/__init__.py","w").close()
-
-    def altImport(s):
-        s = s.replace("import libxml2mod","from libxmlmods import libxml2mod")
-        s = s.replace("import libxsltmod","from libxmlmods import libxsltmod")
-        return s
-
 if sys.platform.startswith('win'):
     libraryPrefix = 'lib'
     platformLibs = []
@@ -53,7 +58,6 @@ else:
 
 # those are examined to find
 # - libxml2/libxml/tree.h
-# - iconv.h
 # - libxslt/xsltconfig.h
 includes_dir = [
 "/usr/include",
@@ -73,16 +77,6 @@ if xml_includes == "":
     print("failed to find headers for libxml2: update includes_dir")
     sys.exit(1)
 
-iconv_includes=""
-for dir in includes_dir:
-    if not missing(dir + "/iconv.h"):
-        iconv_includes=dir
-        break;
-
-if iconv_includes == "":
-    print("failed to find headers for libiconv: update includes_dir")
-    sys.exit(1)
-
 # those are added in the linker search path for libraries
 libdirs = [
 os.path.join(ROOT,'lib'),
@@ -160,13 +154,41 @@ if with_xslt == 1:
         print("failed to find headers for libxslt: update includes_dir")
         with_xslt = 0
 
+if WITHDLLS:
+    # libxml dlls (expected in ROOT/bin)
+    dlls = [ 'libxml2.dll' ]
+
+    if with_zlib == 1:
+        dlls.append(zlib_dll)
+    if with_lzma == 1:
+        dlls.append(lzma_dll)
+    if with_iconv == 1:
+        dlls.append(iconv_dll)
+    if with_icu == 1:
+        dlls += icu_dlls
+    if with_xslt == 1:
+        dlls += ['libxslt.dll','libexslt.dll']
+
+    packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls]
+
+    # create __init__.py for the libxmlmods package
+    if not os.path.exists("libxmlmods"):
+        os.mkdir("libxmlmods")
+        open("libxmlmods/__init__.py","w").close()
+
+    def altImport(s):
+        s = s.replace("import libxml2mod","from libxmlmods import libxml2mod")
+        s = s.replace("import libxsltmod","from libxmlmods import libxsltmod")
+        return s
+
+    packaged_dlls = [os.path.join(ROOT,'bin',dll) for dll in dlls]
 
 descr = "libxml2 package"
 modules = [ 'libxml2', 'drv_libxml2' ]
 if WITHDLLS:
     modules.append('libxmlmods.__init__')
 c_files = ['libxml2-py.c', 'libxml.c', 'types.c' ]
-includes= [xml_includes, iconv_includes]
+includes= [xml_includes]
 libs    = [libraryPrefix + "xml2"] + platformLibs
 macros  = []
 if with_threads:
@@ -218,7 +240,7 @@ if WITHDLLS:
         base = "lib/site-packages/"
     else:
         base = ""
-    data_files = [(base+"libxmlmods",dlls)]
+    data_files = [(base+"libxmlmods",packaged_dlls)]
 else:
     ext_package = None
     data_files = []
diff --git a/win32/configure.js b/win32/configure.js
index cec64c53..8f03b464 100644
--- a/win32/configure.js
+++ b/win32/configure.js
@@ -408,6 +408,14 @@ function configureLibxmlPy()
                        of.WriteLine(s.replace(/\@prefix\@/, buildPrefix));
                } else if (s.search(/\@WITH_THREADS\@/) != -1) {
                        of.WriteLine(s.replace(/\@WITH_THREADS\@/, withThreads == "no"? "0" : "1"));
+               } else if (s.search(/\@WITH_ZLIB\@/) != -1) {
+                       of.WriteLine(s.replace(/\@WITH_ZLIB\@/, withZlib? "1" : "0"));
+               } else if (s.search(/\@WITH_LZMA\@/) != -1) {
+                       of.WriteLine(s.replace(/\@WITH_LZMA\@/, withLzma? "1" : "0"));
+               } else if (s.search(/\@WITH_ICONV\@/) != -1) {
+            of.WriteLine(s.replace(/\@WITH_ICONV\@/, withIconv? "1" : "0"));
+               } else if (s.search(/\@WITH_ICU\@/) != -1) {
+                       of.WriteLine(s.replace(/\@WITH_ICU\@/, withIcu? "1" : "0"));
                } else
                        of.WriteLine(ln);
        }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]