aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexandru Croitor <alexandru.croitor@qt.io>2018-02-21 18:15:10 +0100
committerAlexandru Croitor <alexandru.croitor@qt.io>2018-02-22 10:11:51 +0000
commit6c6991732355184698abeb12994149fe8b16727e (patch)
treec17d6415e004ef2afed61f89e189da4f5ee64f80
parent011b6ad1987f0dee3035e9803ece9fb2c1a0a1b2 (diff)
Don't copy duplicate libraries on package installation
This change makes sure to resolve symlinks and copy only one file for every dynamic shared library used (vs 3 before -> 2 symlinks + 1 actual library). This avoids duplicate files, as well as saves space when creating wheel (e.g. no 3 copies of standalone WebEngine library). This filtering happens copying from CMake install dir into pyside_package_dir (the symlinks are still present in the CMake dir, but that shouldn't harm anybody, and might be useful for users of shiboken only for example). Task-number: PYSIDE-495 Change-Id: I0fe454e16c6b254a8682aa7b1c702ec01a3064f0 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r--setup.py50
-rw-r--r--sources/pyside2/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/CMakeLists.txt6
-rw-r--r--sources/pyside2/PySide2/_built_modules.py.in3
-rw-r--r--sources/pyside2/PySide2/_config.py.in6
-rw-r--r--sources/pyside2/libpyside/CMakeLists.txt2
-rw-r--r--sources/shiboken2/CMakeLists.txt1
-rw-r--r--sources/shiboken2/data/Shiboken2Config-spec.cmake.in1
-rw-r--r--sources/shiboken2/libshiboken/CMakeLists.txt2
9 files changed, 48 insertions, 29 deletions
diff --git a/setup.py b/setup.py
index 523cb9a0d..a07f5f758 100644
--- a/setup.py
+++ b/setup.py
@@ -1129,29 +1129,27 @@ class pyside_build(_build):
print('setup.py/prepare_packages: ', e)
raise
- def get_built_pyside_modules(self, vars):
- # Get list of built modules, so that we copy only required Qt libraries.
+ def get_built_pyside_config(self, vars):
+ # Get config that contains list of built modules, and SOVERSIONs of the built libraries.
pyside_package_dir = vars['pyside_package_dir']
- built_modules_path = os.path.join(pyside_package_dir, "PySide2", "_built_modules.py")
+ config_path = os.path.join(pyside_package_dir, "PySide2", "_config.py")
try:
- with open(built_modules_path) as f:
+ with open(config_path) as f:
scoped_locals = {}
- code = compile(f.read(), built_modules_path, 'exec')
+ code = compile(f.read(), config_path, 'exec')
exec(code, scoped_locals, scoped_locals)
- return scoped_locals['built_modules']
+ config = {}
+ config['built_modules'] = scoped_locals['built_modules']
+ config['shiboken_library_soversion'] = scoped_locals['shiboken_library_soversion']
+ config['pyside_library_soversion'] = scoped_locals['pyside_library_soversion']
+ return config
except IOError as e:
- print("get_built_pyside_modules: Couldn't find file: {}.".format(built_modules_path))
+ print("get_built_pyside_config: Couldn't find file: {}.".format(config_path))
raise
def prepare_packages_posix(self, vars):
executables = []
- if sys.platform.startswith('linux'):
- so_ext = '.so'
- so_star = so_ext + '*'
- elif sys.platform == 'darwin':
- so_ext = '.dylib'
- so_star = so_ext
# <build>/shiboken2/doc/html/* -> <setup>/PySide2/docs/shiboken2
copydir(
"{build_dir}/shiboken2/doc/html",
@@ -1202,14 +1200,22 @@ class pyside_build(_build):
],
recursive=False, vars=vars))
# <install>/lib/lib* -> PySide2/
+ config = self.get_built_pyside_config(vars)
+ def adjusted_lib_name(name, version):
+ postfix = ''
+ if sys.platform.startswith('linux'):
+ postfix = '.so.' + version
+ elif sys.platform == 'darwin':
+ postfix = '.' + version + '.dylib'
+ return name + postfix
copydir(
"{install_dir}/lib/",
"{pyside_package_dir}/PySide2",
filter=[
- "libpyside*" + so_star,
- "libshiboken*" + so_star,
+ adjusted_lib_name("libpyside*", config['pyside_library_soversion']),
+ adjusted_lib_name("libshiboken*", config['shiboken_library_soversion']),
],
- recursive=False, vars=vars)
+ recursive=False, vars=vars, force_copy_symlinks=True)
# <install>/share/PySide2/typesystems/* -> <setup>/PySide2/typesystems
copydir(
"{install_dir}/share/PySide2/typesystems",
@@ -1241,7 +1247,7 @@ class pyside_build(_build):
pyside_rcc_options)
# Copy Qt libs to package
if OPTION_STANDALONE:
- vars['built_modules'] = self.get_built_pyside_modules(vars)
+ vars['built_modules'] = config['built_modules']
if sys.platform == 'darwin':
self.prepare_standalone_package_osx(executables, vars)
else:
@@ -1358,13 +1364,15 @@ class pyside_build(_build):
else:
ignored_modules = []
if 'WebEngineWidgets' not in built_modules:
- ignored_modules.extend(['*Qt5WebEngine*.dylib'])
- accepted_modules = ['*Qt5*.dylib']
+ ignored_modules.extend(['libQt5WebEngine*.dylib'])
+ if 'WebKit' not in built_modules:
+ ignored_modules.extend(['libQt5WebKit*.dylib'])
+ accepted_modules = ['libQt5*.5.dylib']
copydir("{qt_lib_dir}", "{pyside_package_dir}/PySide2/Qt/lib",
filter=accepted_modules,
ignore=ignored_modules,
- recursive=True, vars=vars)
+ recursive=True, vars=vars, force_copy_symlinks=True)
if 'WebEngineWidgets' in built_modules:
copydir("{qt_lib_execs_dir}", "{pyside_package_dir}/PySide2/Qt/libexec",
@@ -1405,7 +1413,7 @@ class pyside_build(_build):
"{site_packages_dir}/PySide2",
"{pyside_package_dir}/PySide2",
vars=vars)
- built_modules = self.get_built_pyside_modules(vars)
+ built_modules = self.get_built_pyside_config(vars)['built_modules']
if self.debug or self.build_type == 'RelWithDebInfo':
# <build>/pyside2/PySide2/*.pdb -> <setup>/PySide2
diff --git a/sources/pyside2/CMakeLists.txt b/sources/pyside2/CMakeLists.txt
index d7d17f27d..08ed52473 100644
--- a/sources/pyside2/CMakeLists.txt
+++ b/sources/pyside2/CMakeLists.txt
@@ -166,6 +166,7 @@ set(BINDING_API_MICRO_VERSION "0")
set(BINDING_API_RELEASE_LEVEL "alpha") # alpha, beta, rc, or final
set(BINDING_API_SERIAL 0) # leave as 0 when release level is final
set(BINDING_API_VERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}" CACHE STRING "PySide version" FORCE)
+set(PYSIDE_SO_VERSION ${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION})
if (BINDING_API_RELEASE_LEVEL STREQUAL "final")
set(BINDING_API_VERSION_FULL "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}"
CACHE STRING "PySide version [full]" FORCE)
@@ -220,6 +221,11 @@ if(GIT_FOUND)
endif()
endif()
+# Used by setup.py to know which symlink to resolve and copy in to the final package, in order to
+# avoid resolving all symlinks and thus copying unnecessary duplicate files.
+set(config_py_shiboken_library_version "")
+set(config_py_pyside_library_version "")
+
include(PySideModules)
macro(COLLECT_MODULE_IF_FOUND shortname)
diff --git a/sources/pyside2/PySide2/CMakeLists.txt b/sources/pyside2/PySide2/CMakeLists.txt
index 2a8cf15ee..98cb00b0a 100644
--- a/sources/pyside2/PySide2/CMakeLists.txt
+++ b/sources/pyside2/PySide2/CMakeLists.txt
@@ -7,8 +7,8 @@ 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}/_config.py.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/_config.py" @ONLY)
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/_utils.py.in"
"${CMAKE_CURRENT_BINARY_DIR}/_utils.py" @ONLY)
@@ -49,7 +49,7 @@ 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"
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/_config.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}")
diff --git a/sources/pyside2/PySide2/_built_modules.py.in b/sources/pyside2/PySide2/_built_modules.py.in
deleted file mode 100644
index 4e491d081..000000000
--- a/sources/pyside2/PySide2/_built_modules.py.in
+++ /dev/null
@@ -1,3 +0,0 @@
-built_modules = list(name for name in
- "@all_module_shortnames@"
- .split(";"))
diff --git a/sources/pyside2/PySide2/_config.py.in b/sources/pyside2/PySide2/_config.py.in
new file mode 100644
index 000000000..db8a17210
--- /dev/null
+++ b/sources/pyside2/PySide2/_config.py.in
@@ -0,0 +1,6 @@
+built_modules = list(name for name in
+ "@all_module_shortnames@"
+ .split(";"))
+
+shiboken_library_soversion = str(@SHIBOKEN_SO_VERSION@)
+pyside_library_soversion = str(@PYSIDE_SO_VERSION@)
diff --git a/sources/pyside2/libpyside/CMakeLists.txt b/sources/pyside2/libpyside/CMakeLists.txt
index de29269a4..15879a201 100644
--- a/sources/pyside2/libpyside/CMakeLists.txt
+++ b/sources/pyside2/libpyside/CMakeLists.txt
@@ -99,7 +99,7 @@ target_link_libraries(pyside2
set_target_properties(pyside2 PROPERTIES
VERSION ${BINDING_API_VERSION}
- SOVERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}"
+ SOVERSION "${PYSIDE_SO_VERSION}"
OUTPUT_NAME "pyside2${pyside2_SUFFIX}${SHIBOKEN_PYTHON_SHARED_LIBRARY_SUFFIX}"
DEFINE_SYMBOL PYSIDE_EXPORTS)
diff --git a/sources/shiboken2/CMakeLists.txt b/sources/shiboken2/CMakeLists.txt
index be3187591..238ee2d34 100644
--- a/sources/shiboken2/CMakeLists.txt
+++ b/sources/shiboken2/CMakeLists.txt
@@ -15,6 +15,7 @@ set(shiboken_MAJOR_VERSION "2")
set(shiboken_MINOR_VERSION "0")
set(shiboken_MICRO_VERSION "0")
set(shiboken2_VERSION "${shiboken_MAJOR_VERSION}.${shiboken_MINOR_VERSION}.${shiboken_MICRO_VERSION}")
+set(shiboken2_library_so_version "${shiboken_MAJOR_VERSION}.${shiboken_MINOR_VERSION}")
option(BUILD_TESTS "Build tests." TRUE)
option(USE_PYTHON_VERSION "Use specific python version to build shiboken2." "")
diff --git a/sources/shiboken2/data/Shiboken2Config-spec.cmake.in b/sources/shiboken2/data/Shiboken2Config-spec.cmake.in
index 9a30d7b4d..576bed0e2 100644
--- a/sources/shiboken2/data/Shiboken2Config-spec.cmake.in
+++ b/sources/shiboken2/data/Shiboken2Config-spec.cmake.in
@@ -25,6 +25,7 @@ SET(SHIBOKEN_PYTHON_LIBRARIES "@SBK_PYTHON_LIBRARIES@")
SET(SHIBOKEN_PYTHON_EXTENSION_SUFFIX "@PYTHON_EXTENSION_SUFFIX@")
SET(SHIBOKEN_PYTHON_SHARED_LIBRARY_SUFFIX "@PYTHON_SHARED_LIBRARY_SUFFIX@")
SET(SHIBOKEN_PYTHON_CONFIG_SUFFIX "@PYTHON_CONFIG_SUFFIX@")
+SET(SHIBOKEN_SO_VERSION "@shiboken2_library_so_version@")
message(STATUS "libshiboken built for @SHIBOKEN_BUILD_TYPE@")
@SBK_ADD_PY_DEBUG_DEFINITION@
diff --git a/sources/shiboken2/libshiboken/CMakeLists.txt b/sources/shiboken2/libshiboken/CMakeLists.txt
index 6f7e4b463..6e725e6af 100644
--- a/sources/shiboken2/libshiboken/CMakeLists.txt
+++ b/sources/shiboken2/libshiboken/CMakeLists.txt
@@ -22,7 +22,7 @@ set(libshiboken_MAJOR_VERSION ${shiboken_MAJOR_VERSION})
set(libshiboken_MINOR_VERSION ${shiboken_MINOR_VERSION})
set(libshiboken_MICRO_VERSION ${shiboken_MICRO_VERSION})
set(libshiboken_VERSION "${libshiboken_MAJOR_VERSION}.${libshiboken_MINOR_VERSION}.${libshiboken_MICRO_VERSION}")
-set(libshiboken_SOVERSION "${libshiboken_MAJOR_VERSION}.${libshiboken_MINOR_VERSION}")
+set(libshiboken_SOVERSION "${shiboken2_library_so_version}")
set(libshiboken_SRC
basewrapper.cpp