aboutsummaryrefslogtreecommitdiffstats
path: root/build_scripts/platforms/macos.py
diff options
context:
space:
mode:
Diffstat (limited to 'build_scripts/platforms/macos.py')
-rw-r--r--build_scripts/platforms/macos.py181
1 files changed, 79 insertions, 102 deletions
diff --git a/build_scripts/platforms/macos.py b/build_scripts/platforms/macos.py
index 7932db337..dbe60d343 100644
--- a/build_scripts/platforms/macos.py
+++ b/build_scripts/platforms/macos.py
@@ -1,50 +1,28 @@
-#############################################################################
-##
-## Copyright (C) 2018 The Qt Company Ltd.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is part of Qt for Python.
-##
-## $QT_BEGIN_LICENSE:LGPL$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see https://www.qt.io/terms-conditions. For further
-## information use the contact form at https://www.qt.io/contact-us.
-##
-## GNU Lesser General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU Lesser
-## General Public License version 3 as published by the Free Software
-## Foundation and appearing in the file LICENSE.LGPL3 included in the
-## packaging of this file. Please review the following information to
-## ensure the GNU Lesser General Public License version 3 requirements
-## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-##
-## GNU General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU
-## General Public License version 2.0 or (at your option) the GNU General
-## Public license version 3 or any later version approved by the KDE Free
-## Qt Foundation. The licenses are as published by the Free Software
-## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-## included in the packaging of this file. Please review the following
-## information to ensure the GNU General Public License requirements will
-## be met: https://www.gnu.org/licenses/gpl-2.0.html and
-## https://www.gnu.org/licenses/gpl-3.0.html.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2018 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
import fnmatch
-import os
-from ..utils import copydir, copyfile, macos_fix_rpaths_for_library, macos_add_rpath
+from pathlib import Path
+
+from ..log import log
from ..config import config
+from ..options import OPTION
+from ..utils import (copydir, copyfile, macos_add_rpath,
+ macos_fix_rpaths_for_library)
+from .. import PYSIDE, PYSIDE_UNIX_BUNDLED_TOOLS
+
+def _macos_patch_executable(name, _vars=None):
+ """ Patch an executable to run with the Qt libraries. """
+ upper_name = name.capitalize()
+ bundle = f"{{st_build_dir}}/{{st_package_name}}/{upper_name}.app".format(**_vars)
+ binary = f"{bundle}/Contents/MacOS/{upper_name}"
+ rpath = "@loader_path/../../../Qt/lib"
+ macos_add_rpath(rpath, binary)
-def prepare_standalone_package_macos(self, vars):
- built_modules = vars['built_modules']
+
+def prepare_standalone_package_macos(pyside_build, _vars):
+ built_modules = _vars['built_modules']
constrain_modules = None
copy_plugins = True
@@ -52,9 +30,14 @@ def prepare_standalone_package_macos(self, vars):
copy_translations = True
copy_qt_conf = True
+ destination_dir = Path("{st_build_dir}/{st_package_name}".format(**_vars))
+ destination_qt_dir = destination_dir / "Qt"
+ destination_qt_lib_dir = destination_qt_dir / "lib"
+ log.info("Copying files...")
+
if config.is_internal_shiboken_generator_build():
constrain_modules = ["Core", "Network", "Xml", "XmlPatterns"]
- constrain_frameworks = ['Qt' + name + '.framework' for name in constrain_modules]
+ constrain_frameworks = [f"Qt{name}.framework" for name in constrain_modules]
copy_plugins = False
copy_qml = False
copy_translations = False
@@ -71,36 +54,34 @@ def prepare_standalone_package_macos(self, vars):
no_copy_debug = True
def file_variant_filter(file_name, file_full_path):
- if self.qtinfo.build_type != 'debug_and_release':
+ if pyside_build.qtinfo.build_type != 'debug_and_release':
return True
if file_name.endswith('_debug.dylib') and no_copy_debug:
return False
return True
# Patching designer to use the Qt libraries provided in the wheel
- if config.is_internal_pyside_build():
- designer_bundle = "{st_build_dir}/{st_package_name}/Designer.app".format(**vars)
- designer_binary = "{}/Contents/MacOS/Designer".format(designer_bundle)
- rpath = "@loader_path/../../../Qt/lib"
- macos_add_rpath(rpath, designer_binary)
+ if config.is_internal_pyside_build() and not OPTION['NO_QT_TOOLS']:
+ for tool in PYSIDE_UNIX_BUNDLED_TOOLS:
+ _macos_patch_executable(tool, _vars)
# <qt>/lib/* -> <setup>/{st_package_name}/Qt/lib
- if self.qt_is_framework_build():
+ if pyside_build.qt_is_framework_build():
def framework_dir_filter(dir_name, parent_full_path, dir_full_path):
if '.framework' in dir_name:
if (dir_name.startswith('QtWebEngine')
- and not self.is_webengine_built(built_modules)):
+ and not pyside_build.is_webengine_built(built_modules)):
return False
if constrain_modules and dir_name not in constrain_frameworks:
return False
if dir_name in ['Headers', 'fonts']:
return False
- if dir_full_path.endswith('Versions/Current'):
+ if str(dir_full_path).endswith('Versions/Current'):
return False
- if dir_full_path.endswith('Versions/5/Resources'):
+ if str(dir_full_path).endswith('Versions/5/Resources'):
return False
- if dir_full_path.endswith('Versions/5/Helpers'):
+ if str(dir_full_path).endswith('Versions/5/Helpers'):
return False
return general_dir_filter(dir_name, parent_full_path, dir_full_path)
@@ -109,16 +90,16 @@ def prepare_standalone_package_macos(self, vars):
no_copy_debug = True
def framework_variant_filter(file_name, file_full_path):
- if self.qtinfo.build_type != 'debug_and_release':
+ if pyside_build.qtinfo.build_type != 'debug_and_release':
return True
- dir_path = os.path.dirname(file_full_path)
+ dir_path = Path(file_full_path).parent
in_framework = dir_path.endswith("Versions/5")
if file_name.endswith('_debug') and in_framework and no_copy_debug:
return False
return True
- copydir("{qt_lib_dir}", "{st_build_dir}/{st_package_name}/Qt/lib",
- recursive=True, vars=vars,
+ copydir("{qt_lib_dir}", destination_qt_lib_dir,
+ recursive=True, _vars=_vars,
ignore=["*.la", "*.a", "*.cmake", "*.pc", "*.prl"],
dir_filter_function=framework_dir_filter,
file_filter_function=framework_variant_filter)
@@ -127,85 +108,81 @@ def prepare_standalone_package_macos(self, vars):
# present rpath does not work because it assumes a symlink
# from Versions/5/Helpers, thus adding two more levels of
# directory hierarchy.
- if self.is_webengine_built(built_modules):
- qt_lib_path = "{st_build_dir}/{st_package_name}/Qt/lib".format(**vars)
- bundle = "QtWebEngineCore.framework/Helpers/"
- bundle += "QtWebEngineProcess.app"
+ if pyside_build.is_webengine_built(built_modules):
+ bundle = Path("QtWebEngineCore.framework/Helpers/") / "QtWebEngineProcess.app"
binary = "Contents/MacOS/QtWebEngineProcess"
- webengine_process_path = os.path.join(bundle, binary)
- final_path = os.path.join(qt_lib_path, webengine_process_path)
+ webengine_process_path = bundle / binary
+ final_path = destination_qt_lib_dir / webengine_process_path
rpath = "@loader_path/../../../../../"
macos_fix_rpaths_for_library(final_path, rpath)
else:
ignored_modules = []
- if not self.is_webengine_built(built_modules):
- ignored_modules.extend(['libQt5WebEngine*.dylib'])
- if 'WebKit' not in built_modules:
- ignored_modules.extend(['libQt5WebKit*.dylib'])
- accepted_modules = ['libQt5*.5.dylib']
+ if not pyside_build.is_webengine_built(built_modules):
+ ignored_modules.extend(['libQt6WebEngine*.dylib'])
+ accepted_modules = ['libQt6*.6.dylib']
if constrain_modules:
- accepted_modules = ["libQt5" + module + "*.5.dylib" for module in constrain_modules]
+ accepted_modules = [f"libQt6{module}*.6.dylib" for module in constrain_modules]
- copydir("{qt_lib_dir}",
- "{st_build_dir}/{st_package_name}/Qt/lib",
- filter=accepted_modules,
+ copydir("{qt_lib_dir}", destination_qt_lib_dir,
+ _filter=accepted_modules,
ignore=ignored_modules,
file_filter_function=file_variant_filter,
- recursive=True, vars=vars, force_copy_symlinks=True)
+ recursive=True, _vars=_vars, force_copy_symlinks=True)
- if self.is_webengine_built(built_modules):
- copydir("{qt_lib_execs_dir}",
- "{st_build_dir}/{st_package_name}/Qt/libexec",
- filter=None,
+ if pyside_build.is_webengine_built(built_modules):
+ copydir("{qt_data_dir}/resources",
+ destination_qt_dir / "resources",
+ _filter=None,
recursive=False,
- vars=vars)
-
- copydir("{qt_prefix_dir}/resources",
- "{st_build_dir}/{st_package_name}/Qt/resources",
- filter=None,
- recursive=False,
- vars=vars)
+ _vars=_vars)
# Fix rpath for WebEngine process executable.
- qt_libexec_path = "{st_build_dir}/{st_package_name}/Qt/libexec".format(**vars)
+ qt_libexec_path = Path(destination_qt_dir) / "libexec"
binary = "QtWebEngineProcess"
- final_path = os.path.join(qt_libexec_path, binary)
+ final_path = qt_libexec_path / binary
rpath = "@loader_path/../lib"
macos_fix_rpaths_for_library(final_path, rpath)
if copy_qt_conf:
# Copy the qt.conf file to libexec.
+ if not qt_libexec_path.is_dir():
+ qt_libexec_path.mkdir(parents=True)
copyfile(
- "{build_dir}/pyside2/{st_package_name}/qt.conf",
- "{st_build_dir}/{st_package_name}/Qt/libexec",
- vars=vars)
+ f"{{build_dir}}/{PYSIDE}/{{st_package_name}}/qt.conf",
+ qt_libexec_path, _vars=_vars)
if copy_plugins:
+ is_pypy = "pypy" in pyside_build.build_classifiers
# <qt>/plugins/* -> <setup>/{st_package_name}/Qt/plugins
- copydir("{qt_plugins_dir}",
- "{st_build_dir}/{st_package_name}/Qt/plugins",
- filter=["*.dylib"],
+ plugins_target = destination_qt_dir / "plugins"
+ filters = ["*.dylib"]
+ copydir("{qt_plugins_dir}", plugins_target,
+ _filter=filters,
recursive=True,
dir_filter_function=general_dir_filter,
file_filter_function=file_variant_filter,
- vars=vars)
+ _vars=_vars)
+ if not is_pypy:
+ copydir("{install_dir}/plugins/designer",
+ plugins_target / "designer",
+ _filter=filters,
+ recursive=False,
+ _vars=_vars)
if copy_qml:
# <qt>/qml/* -> <setup>/{st_package_name}/Qt/qml
- copydir("{qt_qml_dir}",
- "{st_build_dir}/{st_package_name}/Qt/qml",
- filter=None,
+ copydir("{qt_qml_dir}", destination_qt_dir / "qml",
+ _filter=None,
recursive=True,
force=False,
dir_filter_function=general_dir_filter,
file_filter_function=file_variant_filter,
- vars=vars)
+ _vars=_vars)
if copy_translations:
# <qt>/translations/* ->
# <setup>/{st_package_name}/Qt/translations
- copydir("{qt_translations_dir}",
- "{st_build_dir}/{st_package_name}/Qt/translations",
- filter=["*.qm", "*.pak"],
+ copydir("{qt_translations_dir}", destination_qt_dir / "translations",
+ _filter=["*.qm", "*.pak"],
force=False,
- vars=vars)
+ _vars=_vars)