build: Resolve @rpath in macdeployqtplus

Extend `getFrameworks()` with an optional `rpath` parameter to replace
`@rpath` in dependency paths. This fixes resolution of framework
dependencies when using Homebrew's `qt@6` package.
This commit is contained in:
Hennadii Stepanov committed 2025-04-16 13:16:17 +01:00
1 parent cdc32994fe
commit 938208d91a
1 file changed
+6 -4
+6 -4
View File
@@ -181,7 +181,7 @@ class DeploymentInfo(object):
return True return True
return False 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") objdump = os.getenv("OBJDUMP", "objdump")
if verbose: if verbose:
print(f"Inspecting with {objdump}: {binaryPath}") print(f"Inspecting with {objdump}: {binaryPath}")
@@ -195,17 +195,19 @@ def getFrameworks(binaryPath: str, verbose: int) -> list[FrameworkInfo]:
lines.pop(0) # First line is the inspected binary lines.pop(0) # First line is the inspected binary
if ".framework" in binaryPath or binaryPath.endswith(".dylib"): if ".framework" in binaryPath or binaryPath.endswith(".dylib"):
lines.pop(0) # Frameworks and dylibs list themselves as a dependency. lines.pop(0) # Frameworks and dylibs list themselves as a dependency.
libraries = [] libraries = []
for line in lines: for line in lines:
line = line.replace("@loader_path", os.path.dirname(binaryPath)) line = line.replace("@loader_path", os.path.dirname(binaryPath))
if rpath:
line = line.replace("@rpath", rpath)
info = FrameworkInfo.fromLibraryLine(line.strip()) info = FrameworkInfo.fromLibraryLine(line.strip())
if info is not None: if info is not None:
if verbose: if verbose:
print("Found framework:") print("Found framework:")
print(info) print(info)
libraries.append(info) libraries.append(info)
return libraries return libraries
def runInstallNameTool(action: str, *args): def runInstallNameTool(action: str, *args):
@@ -318,7 +320,7 @@ def deployFrameworks(frameworks: list[FrameworkInfo], bundlePath: str, binaryPat
# install_name_tool it a new id. # install_name_tool it a new id.
changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose)
# Check for framework dependencies # Check for framework dependencies
dependencies = getFrameworks(deployedBinaryPath, verbose) dependencies = getFrameworks(deployedBinaryPath, verbose, rpath=framework.frameworkDirectory)
for dependency in dependencies: for dependency in dependencies:
changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose)