diff options
| author | Alexandru Croitor <alexandru.croitor@qt.io> | 2021-09-29 19:01:51 +0200 |
|---|---|---|
| committer | Alexandru Croitor <alexandru.croitor@qt.io> | 2022-02-04 15:51:04 +0100 |
| commit | 57866a57586d401c784f809f9f7994b0e4623706 (patch) | |
| tree | 48b9d5a7d1a03d1edd15359858adcefd18430467 /build_scripts/platforms/linux.py | |
| parent | 14e4527cc427ce8c5e7c1758a95a1bbce0498471 (diff) | |
setup.py: Add support for cross-building
setup.py can now be used to cross-compile PySide to a target Linux
distribution from a Linux host.
For example you could cross-compile PySide targeting an arm64
Raspberry Pi4 sysroot on an Ubuntu x86_64 host machine.
Cross-compiling PySide has a few requirements:
- a sysroot to cross-compile against, with a pre-installed Qt,
Python interpreter, library and development packages (which
provides C++ headers)
- a host Qt installation of the same version that is in the target
sysroot
- a host Python installation, preferably of the same version as the
target one (to run setup.py)
- a working cross-compiling toolchain (cross-compiler, linker, etc)
- a custom written CMake toolchain file
- CMake version 3.17+
- Qt version 6.3+
The CMake toolchain file is required to set up all the relevant
cross-compilation information: where the sysroot is, where the
toolchain is, the compiler name, compiler flags, etc.
Once are requirements are met, to cross-compile one has to specify a
few additional options when calling setup.py: the path to the cmake
toolchain file, the path to the host Qt installation
and the target python platform name.
An example setup.py invocation to build a wheel for an armv7 machine
might look like the following:
python setup.py bdist_wheel --parallel=8 --ignore-git --reuse-build
--cmake-toolchain-file=$PWD/rpi/toolchain_armv7.cmake
--qt-host-path=/opt/Qt/6.3.0/gcc_64
--plat-name=linux_armv7l
--limited-api=yes
--standalone
Sample platform names that can be used are: linux_armv7, linux_aarch64.
If the auto-detection code fails to find the target Python or Qt
installation, one can specify their location by providing the
--python-target-path=<path>
and
--qt-target-path=<path>
options to setup.py.
If the automatic build of the host shiboken code generator fails,
one can specify the path to a custom built host shiboken via the
--shiboken-host-path option.
Documentation about the build process and a sample CMake
toolchain file will be added in a separate change.
Implementation details.
Internally, setup.py will build a host shiboken executable using
the provided host Qt path, and then use it for the cross-build.
This is achieved via an extra setup.py sub-invocation with some
heuristics on which options should be passed to the sub-invocation.
The host shiboken is not included in the target wheels.
Introspection of where the host / target Qt and Python are located
is done via CMake compile tests, because we can't query information
from a qmake that is built for a different architecture / platform.
When limited API is enabled, we modify the wheel name to contain the
manylinux2014 tag, despite the wheel not fully qualifying for that
tag.
When copying the Qt libraries / plugins from the target sysroot in a
standalone build, we need to adjust all their rpaths to match the
destination directory layout of the wheel.
Fixes: PYSIDE-802
Task-number: PYSIDE-1033
Change-Id: I6e8c51ef5127d85949de650396d615ca95194db0
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'build_scripts/platforms/linux.py')
| -rw-r--r-- | build_scripts/platforms/linux.py | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/build_scripts/platforms/linux.py b/build_scripts/platforms/linux.py index 324b962db..31e2613ef 100644 --- a/build_scripts/platforms/linux.py +++ b/build_scripts/platforms/linux.py @@ -89,6 +89,9 @@ def prepare_standalone_package_linux(self, vars): if not maybe_icu_libs: copy_icu_libs(self._patchelf_path, resolved_destination_lib_dir) + # Set RPATH for Qt libs. + self.update_rpath_for_linux_qt_libraries(destination_lib_dir.format(**vars)) + # Patching designer to use the Qt libraries provided in the wheel if config.is_internal_pyside_build(): assistant_path = "{st_build_dir}/{st_package_name}/assistant".format(**vars) @@ -116,15 +119,26 @@ def prepare_standalone_package_linux(self, vars): recursive=False, vars=vars) + copied_plugins = self.get_shared_libraries_in_path_recursively( + plugins_target.format(**vars)) + self.update_rpath_for_linux_plugins(copied_plugins) + if copy_qml: # <qt>/qml/* -> <setup>/{st_package_name}/Qt/qml + qml_plugins_target = "{st_build_dir}/{st_package_name}/Qt/qml" copydir("{qt_qml_dir}", - "{st_build_dir}/{st_package_name}/Qt/qml", + qml_plugins_target, filter=None, force=False, recursive=True, ignore=["*.so.debug"], vars=vars) + copied_plugins = self.get_shared_libraries_in_path_recursively( + qml_plugins_target.format(**vars)) + self.update_rpath_for_linux_plugins( + copied_plugins, + qt_lib_dir=destination_lib_dir.format(**vars), + is_qml_plugin=True) if copy_translations: # <qt>/translations/* -> |
