3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-10 19:27:06 +00:00

Avoid making a copy of libz3 on non Windows platforms for the

Python bindings (provided they both exist within the same install
prefix) by creating a relative symbolic link. This saves
space when packaging Z3.
This commit is contained in:
Dan Liew 2015-11-24 18:15:11 +00:00
parent e8822b1806
commit 53f0addb6b

View file

@ -1246,11 +1246,57 @@ class DLLComponent(Component):
if self.static:
out.write(' %s$(LIB_EXT)' % self.dll_name)
def _compute_relative_path(self, link_dir, target):
"""
Compute the relative path to ``target`` from a directory
``link_dir``.
e.g.
```
self._compute_relative_path("/usr/lib/python3.5/site-packages",
"/usr/lib/libz3.so")
==
"../../libz3.so"
```
"""
assert os.path.isabs(link_dir)
assert os.path.isabs(target)
relative_path =""
temp_path = link_dir
# Keep walking up the directory tree until temp_path
# is a prefix of target.
while not target.startswith(temp_path):
assert temp_path != '/'
temp_path = os.path.dirname(temp_path)
relative_path += '../'
# Now get the path from the common prefix to the target
target_from_prefix = target.replace(temp_path,'',1)
relative_path += target_from_prefix
# Remove any double slashes
relativePath = relative_path.replace('//','/')
return relativePath
def mk_install(self, out):
if self.install:
dllfile = '%s$(SO_EXT)' % self.dll_name
out.write('\t@cp %s %s\n' % (dllfile, os.path.join('$(DESTDIR)$(PREFIX)', 'lib', dllfile)))
out.write('\t@cp %s $(DESTDIR)%s\n' % (dllfile, os.path.join(PYTHON_PACKAGE_DIR, dllfile)))
dllInstallPath = os.path.join('$(PREFIX)', 'lib', dllfile)
pythonPkgDirSubst = PYTHON_PACKAGE_DIR.replace('$(PREFIX)', PREFIX, 1)
out.write('\t@cp %s $(DESTDIR)%s\n' % (dllfile, dllInstallPath))
if IS_WINDOWS or not pythonPkgDirSubst.startswith(PREFIX):
out.write('\t@cp %s $(DESTDIR)%s\n' % (dllfile, os.path.join(PYTHON_PACKAGE_DIR, dllfile)))
else:
# Create symbolic link to save space.
# Compute the relative path from the python package directory
# to libz3. It's important that this symlink be relative
# (rather than absolute) so that the install is relocatable.
dllInstallPathSubst = dllInstallPath.replace('$(PREFIX)', PREFIX,1)
relativePath = self._compute_relative_path(pythonPkgDirSubst,
dllInstallPathSubst)
out.write('\t@ln -s %s $(DESTDIR)%s\n' % (relativePath, os.path.join(PYTHON_PACKAGE_DIR, dllfile)))
if self.static:
libfile = '%s$(LIB_EXT)' % self.dll_name
out.write('\t@cp %s %s\n' % (libfile, os.path.join('$(DESTDIR)$(PREFIX)', 'lib', libfile)))