diff --git a/ci/test/00_setup_env_mac_native.sh b/ci/test/00_setup_env_mac_native.sh index e01a56895bf..1b4bee1566f 100755 --- a/ci/test/00_setup_env_mac_native.sh +++ b/ci/test/00_setup_env_mac_native.sh @@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8 # Homebrew's python@3.12 is marked as externally managed (PEP 668). # Therefore, `--break-system-packages` is needed. export PIP_PACKAGES="--break-system-packages zmq" -export GOAL="install" +export GOAL="install deploy" export CMAKE_GENERATOR="Ninja" export BITCOIN_CONFIG="-DBUILD_GUI=ON -DWITH_ZMQ=ON -DREDUCE_EXPORTS=ON" export CI_OS_NAME="macos" diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index eaa7b896be9..ba532d77740 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -157,20 +157,19 @@ class DeploymentInfo(object): self.qtPath = None self.pluginPath = None self.deployedFrameworks = [] - + def detectQtPath(self, frameworkDirectory: str): parentDir = os.path.dirname(frameworkDirectory) - if os.path.exists(os.path.join(parentDir, "translations")): - # Classic layout, e.g. "/usr/local/Trolltech/Qt-4.x.x" + if os.path.exists(os.path.join(parentDir, "share", "qt", "translations")): self.qtPath = parentDir else: self.qtPath = os.getenv("QTDIR", None) if self.qtPath is not None: - pluginPath = os.path.join(self.qtPath, "plugins") + pluginPath = os.path.join(self.qtPath, "share", "qt", "plugins") if os.path.exists(pluginPath): self.pluginPath = pluginPath - + def usesFramework(self, name: str) -> bool: for framework in self.deployedFrameworks: if framework.endswith(".framework"): @@ -181,7 +180,7 @@ class DeploymentInfo(object): return True return False -def getFrameworks(binaryPath: str, verbose: int) -> list[FrameworkInfo]: +def getFrameworks(binaryPath: str, verbose: int, rpath: str = '') -> list[FrameworkInfo]: objdump = os.getenv("OBJDUMP", "objdump") if verbose: print(f"Inspecting with {objdump}: {binaryPath}") @@ -195,17 +194,19 @@ def getFrameworks(binaryPath: str, verbose: int) -> list[FrameworkInfo]: lines.pop(0) # First line is the inspected binary if ".framework" in binaryPath or binaryPath.endswith(".dylib"): lines.pop(0) # Frameworks and dylibs list themselves as a dependency. - + libraries = [] for line in lines: line = line.replace("@loader_path", os.path.dirname(binaryPath)) + if rpath: + line = line.replace("@rpath", rpath) info = FrameworkInfo.fromLibraryLine(line.strip()) if info is not None: if verbose: print("Found framework:") print(info) libraries.append(info) - + return libraries def runInstallNameTool(action: str, *args): @@ -318,7 +319,7 @@ def deployFrameworks(frameworks: list[FrameworkInfo], bundlePath: str, binaryPat # install_name_tool it a new id. changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) # Check for framework dependencies - dependencies = getFrameworks(deployedBinaryPath, verbose) + dependencies = getFrameworks(deployedBinaryPath, verbose, rpath=framework.frameworkDirectory) for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose)