diff options
-rw-r--r-- | qtinfo.py | 12 | ||||
-rw-r--r-- | setup.py | 161 | ||||
-rw-r--r-- | sources/pyside2/PySide2/CMakeLists.txt | 5 | ||||
-rw-r--r-- | sources/pyside2/PySide2/_built_modules.py.in | 3 | ||||
-rw-r--r-- | utils.py | 10 |
5 files changed, 157 insertions, 34 deletions
@@ -28,9 +28,15 @@ class QtInfo(object): def getLibsPath(self): return self.getProperty("QT_INSTALL_LIBS") + def getLibsExecsPath(self): + return self.getProperty("QT_INSTALL_LIBEXECS") + def getPluginsPath(self): return self.getProperty("QT_INSTALL_PLUGINS") + def getPrefixPath(self): + return self.getProperty("QT_INSTALL_PREFIX") + def getImportsPath(self): return self.getProperty("QT_INSTALL_IMPORTS") @@ -43,6 +49,9 @@ class QtInfo(object): def getDocsPath(self): return self.getProperty("QT_INSTALL_DOCS") + def getQmlPath(self): + return self.getProperty("QT_INSTALL_QML") + def _getProperty(self, prop_name): cmd = self._qmake_command + ["-query", prop_name] proc = subprocess.Popen(cmd, stdout = subprocess.PIPE, shell=False) @@ -62,9 +71,12 @@ class QtInfo(object): version = property(getVersion) bins_dir = property(getBinsPath) libs_dir = property(getLibsPath) + lib_execs_dir = property(getLibsExecsPath) plugins_dir = property(getPluginsPath) + prefix_dir = property(getPrefixPath) qmake_command = property(getQMakeCommand) imports_dir = property(getImportsPath) translations_dir = property(getTranslationsPath) headers_dir = property(getHeadersPath) docs_dir = property(getDocsPath) + qml_dir = property(getQmlPath) @@ -151,6 +151,7 @@ import sys import platform import time import re +import fnmatch import difflib # for a close match of dirname and module @@ -301,10 +302,6 @@ if OPTION_JOBS: else: OPTION_JOBS = '' -if sys.platform == 'darwin' and OPTION_STANDALONE: - print("--standalone option does not yet work on OSX") - - # Show available versions if OPTION_LISTVERSIONS: for v in submodules: @@ -938,11 +935,15 @@ class pyside_build(_build): "qt_bin_dir": self.qtinfo.bins_dir, "qt_doc_dir": self.qtinfo.docs_dir, "qt_lib_dir": self.qtinfo.libs_dir, + "qt_lib_execs_dir": self.qtinfo.lib_execs_dir, "qt_plugins_dir": self.qtinfo.plugins_dir, + "qt_prefix_dir": self.qtinfo.prefix_dir, "qt_translations_dir": self.qtinfo.translations_dir, + "qt_qml_dir": self.qtinfo.qml_dir, "version": version_str, } os.chdir(self.script_dir) + if sys.platform == "win32": vars['dbgPostfix'] = OPTION_DEBUG and "_d" or "" return self.prepare_packages_win32(vars) @@ -1050,36 +1051,131 @@ class pyside_build(_build): # Copy Qt libs to package if OPTION_STANDALONE: if sys.platform == 'darwin': - raise RuntimeError('--standalone not yet supported for OSX') - # <qt>/bin/* -> <setup>/PySide2 - executables.extend(copydir("{qt_bin_dir}", "{dist_dir}/PySide2", - filter=[ - "designer", - "linguist", - "lrelease", - "lupdate", - "lconvert", - ], - recursive=False, vars=vars)) - # <qt>/lib/* -> <setup>/PySide2 - copydir("{qt_lib_dir}", "{dist_dir}/PySide2", - filter=[ - "libQt*.so.?", - "libphonon.so.?", - ], - recursive=False, vars=vars) - # <qt>/plugins/* -> <setup>/PySide2/plugins - copydir("{qt_plugins_dir}", "{dist_dir}/PySide2/plugins", - filter=["*.so"], - vars=vars) - # <qt>/translations/* -> <setup>/PySide2/translations - copydir("{qt_translations_dir}", "{dist_dir}/PySide2/translations", - filter=["*.qm"], - vars=vars) + self.prepare_standalone_package_osx(executables, vars) + else: + # <qt>/bin/* -> <setup>/PySide2 + executables.extend(copydir("{qt_bin_dir}", "{dist_dir}/PySide2", + filter=[ + "designer", + "linguist", + "lrelease", + "lupdate", + "lconvert", + ], + recursive=False, vars=vars)) + # <qt>/lib/* -> <setup>/PySide2 + copydir("{qt_lib_dir}", "{dist_dir}/PySide2", + filter=[ + "libQt*.so.?", + "libphonon.so.?", + ], + recursive=False, vars=vars) + # <qt>/plugins/* -> <setup>/PySide2/plugins + copydir("{qt_plugins_dir}", "{dist_dir}/PySide2/plugins", + filter=["*.so"], + vars=vars) + # <qt>/translations/* -> <setup>/PySide2/translations + copydir("{qt_translations_dir}", "{dist_dir}/PySide2/translations", + filter=["*.qm"], + vars=vars) # Update rpath to $ORIGIN if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): self.update_rpath("{dist_dir}/PySide2".format(**vars), executables) + def qt_is_framework_build(self): + if os.path.isdir(self.qtinfo.headers_dir + "/../lib/QtCore.framework"): + return True + return False + + def prepare_standalone_package_osx(self, executables, vars): + # Get list of built modules, so that we copy only required Qt libraries. + pyside_package_dir = vars['dist_dir'] + built_modules_path = os.path.join(pyside_package_dir, "PySide2", "_built_modules.py") + + with open(built_modules_path) as f: + scoped_locals = {} + code = compile(f.read(), built_modules_path, 'exec') + exec(code, scoped_locals, scoped_locals) + built_modules = scoped_locals['built_modules'] + + # Directory filter for skipping unnecessary files. + def general_dir_filter(dir_name, parent_full_path, dir_full_path): + if fnmatch.fnmatch(dir_name, "*.dSYM"): + return False + return True + + # <qt>/lib/* -> <setup>/PySide2/Qt/lib + if self.qt_is_framework_build(): + framework_built_modules = ['Qt' + name + '.framework' for name in built_modules] + + def framework_dir_filter(dir_name, parent_full_path, dir_full_path): + if '.framework' in dir_name: + if dir_name in ['QtWebEngine.framework', 'QtWebEngineCore.framework', \ + 'QtPositioning.framework', 'QtLocation.framework'] and \ + 'QtWebEngineWidgets.framework' in framework_built_modules: + return True + if dir_name in ['QtCLucene.framework'] and \ + 'QtHelp.framework' in framework_built_modules: + return True + if dir_name not in framework_built_modules: + return False + if dir_name in ['Headers', 'fonts']: + return False + if dir_full_path.endswith('Versions/Current'): + return False + if dir_full_path.endswith('Versions/5/Resources'): + return False + if dir_full_path.endswith('Versions/5/Helpers'): + return False + return general_dir_filter(dir_name, parent_full_path, dir_full_path) + + copydir("{qt_lib_dir}", "{dist_dir}/PySide2/Qt/lib", + recursive=True, vars=vars, + ignore=["*.la", "*.a", "*.cmake", "*.pc", "*.prl"], + dir_filter_function=framework_dir_filter) + else: + if 'WebEngineWidgets' in built_modules: + built_modules.extend(['WebEngine', 'WebEngineCore', 'Positioning', 'Location']) + if 'Help' in built_modules: + built_modules.extend(['CLucene']) + prefixed_built_modules = ['*Qt5' + name + '*.dylib' for name in built_modules] + + copydir("{qt_lib_dir}", "{dist_dir}/PySide2/Qt/lib", + filter=prefixed_built_modules, + recursive=True, vars=vars) + + if 'WebEngineWidgets' in built_modules: + copydir("{qt_lib_execs_dir}", "{dist_dir}/PySide2/Qt/libexec", + filter=None, + recursive=False, + vars=vars) + + copydir("{qt_prefix_dir}/resources", "{dist_dir}/PySide2/Qt/resources", + filter=None, + recursive=False, + vars=vars) + + # <qt>/plugins/* -> <setup>/PySide2/Qt/plugins + copydir("{qt_plugins_dir}", "{dist_dir}/PySide2/Qt/plugins", + filter=["*.dylib"], + recursive=True, + dir_filter_function=general_dir_filter, + vars=vars) + + # <qt>/qml/* -> <setup>/PySide2/Qt/qml + copydir("{qt_qml_dir}", "{dist_dir}/PySide2/Qt/qml", + filter=None, + recursive=True, + force=False, + dir_filter_function=general_dir_filter, + vars=vars) + + # <qt>/translations/* -> <setup>/PySide2/Qt/translations + copydir("{qt_translations_dir}", "{dist_dir}/PySide2/Qt/translations", + filter=["*.qm"], + force=False, + vars=vars) + def prepare_packages_win32(self, vars): pdbs = ['*.pdb'] if self.debug or self.build_type == 'RelWithDebInfo' else [] # <install>/lib/site-packages/PySide2/* -> <setup>/PySide2 @@ -1272,7 +1368,10 @@ class pyside_build(_build): if OPTION_RPATH_VALUES: final_rpath = OPTION_RPATH_VALUES else: - final_rpath = self.qtinfo.libs_dir + if OPTION_STANDALONE: + final_rpath = "@loader_path/Qt/lib" + else: + final_rpath = self.qtinfo.libs_dir osx_fix_rpaths_for_library(srcpath, final_rpath) else: diff --git a/sources/pyside2/PySide2/CMakeLists.txt b/sources/pyside2/PySide2/CMakeLists.txt index 53c4216fa..2a8cf15ee 100644 --- a/sources/pyside2/PySide2/CMakeLists.txt +++ b/sources/pyside2/PySide2/CMakeLists.txt @@ -7,6 +7,9 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/global.h.in" configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in" "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" @ONLY) +configure_file("${CMAKE_CURRENT_SOURCE_DIR}/_built_modules.py.in" + "${CMAKE_CURRENT_BINARY_DIR}/_built_modules.py" @ONLY) + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/_utils.py.in" "${CMAKE_CURRENT_BINARY_DIR}/_utils.py" @ONLY) @@ -46,6 +49,8 @@ endforeach() # install install(FILES "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" DESTINATION "${PYTHON_SITE_PACKAGES}/${BINDING_NAME}${pyside2_SUFFIX}") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/_built_modules.py" + DESTINATION "${PYTHON_SITE_PACKAGES}/${BINDING_NAME}${pyside2_SUFFIX}") install(FILES ${CMAKE_CURRENT_BINARY_DIR}/_utils.py DESTINATION "${PYTHON_SITE_PACKAGES}/${BINDING_NAME}${pyside2_SUFFIX}") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_templates.xml diff --git a/sources/pyside2/PySide2/_built_modules.py.in b/sources/pyside2/PySide2/_built_modules.py.in new file mode 100644 index 000000000..4e491d081 --- /dev/null +++ b/sources/pyside2/PySide2/_built_modules.py.in @@ -0,0 +1,3 @@ +built_modules = list(name for name in + "@all_module_shortnames@" + .split(";")) @@ -275,8 +275,8 @@ def makefile(dst, content=None, vars=None): f.close() -def copydir(src, dst, filter=None, ignore=None, force=True, - recursive=True, vars=None): +def copydir(src, dst, filter=None, ignore=None, force=True, recursive=True, vars=None, + dir_filter_function=None): if vars is not None: src = src.format(**vars) @@ -305,8 +305,12 @@ def copydir(src, dst, filter=None, ignore=None, force=True, dstname = os.path.join(dst, name) try: if os.path.isdir(srcname): + if dir_filter_function and not dir_filter_function(name, src, srcname): + continue if recursive: - results.extend(copydir(srcname, dstname, filter, ignore, force, recursive, vars)) + results.extend( + copydir(srcname, dstname, filter, ignore, force, recursive, + vars, dir_filter_function)) else: if (filter is not None and not filter_match(name, filter)) or \ (ignore is not None and filter_match(name, ignore)): |