aboutsummaryrefslogtreecommitdiffstats
path: root/pyside_postinstall.py
diff options
context:
space:
mode:
authorRoman Lacko <backup.rlacko@gmail.com>2014-11-23 23:09:07 +0100
committerRoman Lacko <backup.rlacko@gmail.com>2014-12-05 00:19:12 +0100
commit2cf788b1a118c3ce630e0ae5e850641ea71d0c02 (patch)
tree40cc277279813e2cc641025aaac5ba3f1dc780d4 /pyside_postinstall.py
parent2f63d9bb802bbd5b1b70e94e5bc17ac21e31cfce (diff)
Remove the need to use the post-install script on Linux platform by patching the rpath at build time + exclude patchelf executable from binary distribution
Diffstat (limited to 'pyside_postinstall.py')
-rw-r--r--pyside_postinstall.py170
1 files changed, 14 insertions, 156 deletions
diff --git a/pyside_postinstall.py b/pyside_postinstall.py
index 146d313b9..9230a55ad 100644
--- a/pyside_postinstall.py
+++ b/pyside_postinstall.py
@@ -1,9 +1,9 @@
#!/usr/bin/env python
# Postinstall script for PySide
#
-# Generates the qt.conf file
-#
-# This file is based on pywin32_postinstall.py file from pywin32 project
+# TODO:
+# This file can be removed after OSX support
+# is implemented in pyside_build.update_rpath()
import os, sys, traceback, shutil, fnmatch, stat
from os.path import dirname, abspath
@@ -11,25 +11,6 @@ from subprocess import Popen, PIPE
import re
-try:
- # When this script is run from inside the bdist_wininst installer,
- # file_created() and directory_created() are additional builtin
- # functions which write lines to Python23\pyside-install.log. This is
- # a list of actions for the uninstaller, the format is inspired by what
- # the Wise installer also creates.
- file_created
- is_bdist_wininst = True
-except NameError:
- is_bdist_wininst = False # we know what it is not - but not what it is :)
- def file_created(file):
- pass
-
-def install():
- if sys.platform == "win32":
- install_win32()
- else:
- install_posix()
-
def filter_match(name, patterns):
for pattern in patterns:
if pattern is None:
@@ -38,19 +19,6 @@ def filter_match(name, patterns):
return True
return False
-def set_exec(name):
- mode = os.stat(name).st_mode
- new_mode = mode
- if new_mode & stat.S_IRUSR:
- new_mode = new_mode | stat.S_IXUSR
- if new_mode & stat.S_IRGRP:
- new_mode = new_mode | stat.S_IXGRP
- if new_mode & stat.S_IROTH:
- new_mode = new_mode | stat.S_IXOTH
- if (mode != new_mode):
- print("Setting exec for '%s' (mode %o => %o)" % (name, mode, new_mode))
- os.chmod(name, new_mode)
-
def back_tick(cmd, ret_err=False):
""" Run command `cmd`, return stdout, or stdout, stderr if `ret_err`
@@ -152,7 +120,7 @@ def osx_get_rpaths(libpath):
return rpaths
-def localize_libpaths(libpath, local_libs, enc_path=None):
+def osx_localize_libpaths(libpath, local_libs, enc_path=None):
""" Set rpaths and install names to load local dynamic libs at run time
Use ``install_name_tool`` to set relative install names in `libpath` (as
@@ -185,7 +153,7 @@ def localize_libpaths(libpath, local_libs, enc_path=None):
(enc_path, libpath))
-def install_posix():
+def post_install_osx():
# Try to find PySide package
try:
import PySide
@@ -195,40 +163,17 @@ def install_posix():
pyside_path = os.path.abspath(os.path.dirname(PySide.__file__))
print("PySide package found in %s..." % pyside_path)
- executables = ['shiboken']
- if sys.platform.startswith('linux'):
- executables.append('patchelf')
- patchelf_path = os.path.join(pyside_path, "patchelf")
- from distutils.spawn import spawn
-
- def rpath_cmd(pyside_path, srcpath):
- cmd = [patchelf_path, '--set-rpath', pyside_path, srcpath]
- spawn(cmd, search_path=False, verbose=1)
-
- pyside_libs = [lib for lib in os.listdir(pyside_path) if filter_match(
- lib, ["Qt*.so", "phonon.so", "shiboken"])]
- elif sys.platform == 'darwin':
- pyside_libs = [lib for lib in os.listdir(pyside_path) if filter_match(
- lib, ["*.so", "*.dylib", "shiboken"])]
-
- def rpath_cmd(pyside_path, srcpath):
- localize_libpaths(srcpath, pyside_libs, pyside_path)
-
- else:
- raise RuntimeError('Not configured for platform ' +
- sys.platform)
-
- # Set exec mode on executables
- for executable in executables:
- execpath = os.path.join(pyside_path, executable)
- set_exec(execpath)
+ pyside_libs = [lib for lib in os.listdir(pyside_path) if filter_match(
+ lib, ["*.so", "*.dylib", "shiboken"])]
# Update rpath in PySide libs
for srcname in pyside_libs:
- if os.path.isdir(srcname):
- continue
srcpath = os.path.join(pyside_path, srcname)
- rpath_cmd(pyside_path, srcpath)
+ if os.path.isdir(srcpath):
+ continue
+ if not os.path.exists(srcpath):
+ continue
+ osx_localize_libpaths(srcpath, pyside_libs, pyside_path)
print("Patched rpath in %s to %s." % (srcpath, pyside_path))
# Check PySide installation status
@@ -240,93 +185,6 @@ def install_posix():
print("The PySide package not installed: %s" % traceback.print_exception(*sys.exc_info()))
-def install_win32():
- # Try to find PySide package
- try:
- from PySide import QtCore
- except ImportError:
- print("The PySide package not found: %s" % traceback.print_exception(*sys.exc_info()))
- return
- pyside_path = os.path.dirname(QtCore.__file__)
- pyside_path = pyside_path.replace("\\", "/")
- pyside_path = pyside_path.replace("lib/site-packages", "Lib/site-packages")
- print("PySide package found in %s..." % pyside_path)
-
- # Since version 1.2.0 there is no need to run post install procedure on win32
- from PySide import __version_info__ as pyside_version_info
- if pyside_version_info >= (1,2,0):
- return
-
- if is_bdist_wininst:
- # Run from inside the bdist_wininst installer
- import distutils.sysconfig
- exec_prefix = distutils.sysconfig.get_config_var("exec_prefix")
- else:
- # Run manually
- exec_prefix = os.path.dirname(sys.executable)
-
- # Generate qt.conf
- qtconf_path = os.path.join(exec_prefix, "qt.conf")
- print("Generating file %s..." % qtconf_path)
- f = open(qtconf_path, 'wt')
- file_created(qtconf_path)
- f.write("""[Paths]
-Prefix = %(pyside_prefix)s
-Binaries = %(pyside_prefix)s
-Plugins = %(pyside_prefix)s/plugins
-Translations = %(pyside_prefix)s/translations
-""" % { "pyside_prefix": pyside_path })
- print("The PySide extensions were successfully installed.")
-
- # Install OpenSSL libs
- for dll in ["libeay32.dll", "ssleay32.dll"]:
- dest_path = os.path.join(exec_prefix, dll)
- src_path = os.path.join(pyside_path, "openssl", dll)
- if not os.path.exists(dest_path) and os.path.exists(src_path):
- shutil.copy(src_path, dest_path)
- file_created(dest_path)
- print("Installed %s to %s." % (dll, exec_prefix))
-
-def uninstall():
- print("The PySide extensions were successfully uninstalled.")
-
-def usage():
- msg = \
-"""%s: A post-install script for the PySide extensions.
-
-This should be run automatically after installation, but if it fails you
-can run it again with a '-install' parameter, to ensure the environment
-is setup correctly.
-"""
- print(msg.strip() % os.path.basename(sys.argv[0]))
-
-# NOTE: If this script is run from inside the bdist_wininst created
-# binary installer or uninstaller, the command line args are either
-# '-install' or '-remove'.
-
-# Important: From inside the binary installer this script MUST NOT
-# call sys.exit() or raise SystemExit, otherwise not only this script
-# but also the installer will terminate! (Is there a way to prevent
-# this from the bdist_wininst C code?)
-
if __name__ == '__main__':
- if len(sys.argv)==1:
- usage()
- sys.exit(1)
-
- arg_index = 1
- while arg_index < len(sys.argv):
- arg = sys.argv[arg_index]
- if arg == "-install":
- install()
- elif arg == "-remove":
- # bdist_msi calls us before uninstall, so we can undo what we
- # previously did. Sadly, bdist_wininst calls us *after*, so
- # we can't do much at all.
- if not is_bdist_wininst:
- uninstall()
- else:
- print("Unknown option: %s" % arg)
- usage()
- sys.exit(0)
- arg_index += 1
+ if sys.platform == "darwin":
+ post_install_osx()