summaryrefslogtreecommitdiff
path: root/buildlibxml.py
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2020-07-19 11:53:55 +0200
committerStefan Behnel <stefan_ml@behnel.de>2020-07-19 11:53:55 +0200
commit34aa8896f99f93a43f3c61fc66beb459ce163acd (patch)
tree27897e20b4c638796a13aabdad0976b08dd56af5 /buildlibxml.py
parent97f9d1e37157a2f7a8563f89a3972a4e73476fc0 (diff)
downloadpython-lxml-34aa8896f99f93a43f3c61fc66beb459ce163acd.tar.gz
Do not rebuild static libs when they are already available from a previous build (e.g. "setup.py build" + "setup.py bdist_wheel").
Diffstat (limited to 'buildlibxml.py')
-rw-r--r--buildlibxml.py36
1 files changed, 30 insertions, 6 deletions
diff --git a/buildlibxml.py b/buildlibxml.py
index 38030724..f45c8608 100644
--- a/buildlibxml.py
+++ b/buildlibxml.py
@@ -371,8 +371,29 @@ def build_libxml2xslt(download_dir, build_dir,
libxml2_dir = unpack_tarball(download_libxml2(download_dir, libxml2_version), build_dir)
libxslt_dir = unpack_tarball(download_libxslt(download_dir, libxslt_version), build_dir)
prefix = os.path.join(os.path.abspath(build_dir), 'libxml2')
+ lib_dir = os.path.join(prefix, 'lib')
safe_mkdir(prefix)
+ lib_names = ['libxml2', 'libexslt', 'libxslt', 'iconv', 'libz']
+ existing_libs = {
+ lib: os.path.join(lib_dir, filename)
+ for lib in lib_names
+ for filename in os.listdir(lib_dir)
+ if lib in filename and filename.endswith('.a')
+ } if os.path.isdir(lib_dir) else {}
+
+ def has_current_lib(name, build_dir, _build_all_following=[False]):
+ if _build_all_following[0]:
+ return False # a dependency was rebuilt => rebuilt this lib as well
+ lib_file = existing_libs.get(name)
+ found = lib_file and os.path.getmtime(lib_file) > os.path.getmtime(build_dir)
+ if found:
+ print("Found pre-built '%s'" % name)
+ else:
+ # also rebuild all following libs (which may depend on this one)
+ _build_all_following[0] = True
+ return found
+
call_setup = {}
if sys.platform == 'darwin':
configure_darwin_env(call_setup)
@@ -388,10 +409,12 @@ def build_libxml2xslt(download_dir, build_dir,
'./configure',
'--prefix=%s' % prefix,
]
- cmmi(zlib_configure_cmd, zlib_dir, multicore, **call_setup)
+ if not has_current_lib("libz", zlib_dir):
+ cmmi(zlib_configure_cmd, zlib_dir, multicore, **call_setup)
# build libiconv
- cmmi(configure_cmd, libiconv_dir, multicore, **call_setup)
+ if not has_current_lib("iconv", libiconv_dir):
+ cmmi(configure_cmd, libiconv_dir, multicore, **call_setup)
# build libxml2
libxml2_configure_cmd = configure_cmd + [
@@ -411,7 +434,8 @@ def build_libxml2xslt(download_dir, build_dir,
libxml2_configure_cmd.append('--enable-rebuild-docs=no')
except Exception:
pass # this isn't required, so ignore any errors
- cmmi(libxml2_configure_cmd, libxml2_dir, multicore, **call_setup)
+ if not has_current_lib("libxml2", libxml2_dir):
+ cmmi(libxml2_configure_cmd, libxml2_dir, multicore, **call_setup)
# build libxslt
libxslt_configure_cmd = configure_cmd + [
@@ -419,13 +443,13 @@ def build_libxml2xslt(download_dir, build_dir,
'--with-libxml-prefix=%s' % prefix,
'--without-crypto',
]
- cmmi(libxslt_configure_cmd, libxslt_dir, multicore, **call_setup)
+ if not (has_current_lib("libxslt", libxslt_dir) and has_current_lib("libexslt", libxslt_dir)):
+ cmmi(libxslt_configure_cmd, libxslt_dir, multicore, **call_setup)
# collect build setup for lxml
xslt_config = os.path.join(prefix, 'bin', 'xslt-config')
xml2_config = os.path.join(prefix, 'bin', 'xml2-config')
- lib_dir = os.path.join(prefix, 'lib')
static_include_dirs.extend([
os.path.join(prefix, 'include'),
os.path.join(prefix, 'include', 'libxml2'),
@@ -435,7 +459,7 @@ def build_libxml2xslt(download_dir, build_dir,
listdir = os.listdir(lib_dir)
static_binaries += [os.path.join(lib_dir, filename)
- for lib in ['libxml2', 'libexslt', 'libxslt', 'iconv', 'libz']
+ for lib in lib_names
for filename in listdir
if lib in filename and filename.endswith('.a')]