From 5a1bb1db8e10d3964d72d7a15855bd8796d97ec7 Mon Sep 17 00:00:00 2001 From: Jake Petroules Date: Fri, 1 Dec 2017 00:36:06 -0800 Subject: Rewrite rpath handling for binaries that are a part of Qbs itself Exporting a list of rpaths from a target is completely bogus as-is, because a target cannot know a dependee's install location relative to itself. This patch instead has each target category (executables in bin, libraries in lib, libexec binaries in libexec/qbs, and plugins in lib/qbs/plugins) set its relative installation directory at the product level, and then an appropriate rpath is created for the target by calculating a relative path from the target to the lib directory in the context of an installed build. This also has the advantage that rpaths are now calculated dynamically at build time rather than hardcoded, so if a user changes the directory depth of pluginsInstallDir, for example, everything will be adjusted automatically. Each target also therefore now has an rpath pointing exactly to its immediate dependencies, instead of relying on the parent process to inherit the rpath entries. Among simply being correct, this also has the advantage that any target can now be loaded correctly by another process which itself sets no rpath happening to point to the qbs lib directory. Change-Id: I8fdf24b74ef60426cea0930b7941479919226fd2 Reviewed-by: Christian Kandeler --- qbs-resources/imports/QbsApp.qbs | 3 ++- qbs-resources/imports/QbsLibrary.qbs | 4 ++-- qbs-resources/imports/QbsProduct.qbs | 2 ++ 3 files changed, 6 insertions(+), 3 deletions(-) (limited to 'qbs-resources/imports') diff --git a/qbs-resources/imports/QbsApp.qbs b/qbs-resources/imports/QbsApp.qbs index a81efca6a..8e671764d 100644 --- a/qbs-resources/imports/QbsApp.qbs +++ b/qbs-resources/imports/QbsApp.qbs @@ -17,9 +17,10 @@ QbsProduct { fileTagsFilter: product.type .concat(qbs.buildVariant === "debug" ? ["debuginfo_app"] : []) qbs.install: true - qbs.installDir: qbsbuildconfig.appInstallDir qbs.installSourceBase: destinationDirectory + qbs.installDir: targetInstallDir } + targetInstallDir: qbsbuildconfig.appInstallDir Group { name: "logging" prefix: FileInfo.joinPaths(product.sourceDirectory, "../shared/logging") + '/' diff --git a/qbs-resources/imports/QbsLibrary.qbs b/qbs-resources/imports/QbsLibrary.qbs index 8757b790c..a6bc7366d 100644 --- a/qbs-resources/imports/QbsLibrary.qbs +++ b/qbs-resources/imports/QbsLibrary.qbs @@ -22,9 +22,10 @@ QbsProduct { fileTagsFilter: product.type.concat("dynamiclibrary_symlink") .concat(qbs.buildVariant === "debug" ? ["debuginfo_dll"] : []) qbs.install: install - qbs.installDir: qbsbuildconfig.libInstallDir qbs.installSourceBase: destinationDirectory + qbs.installDir: targetInstallDir } + targetInstallDir: qbsbuildconfig.libInstallDir Group { fileTagsFilter: ["dynamiclibrary_import"] qbs.install: install @@ -42,7 +43,6 @@ QbsProduct { Depends { name: "Qt"; submodules: ["core"] } Depends { name: "qbsbuildconfig" } - cpp.rpaths: qbsbuildconfig.libRPaths cpp.includePaths: [product.sourceDirectory] cpp.defines: product.visibilityType === "static" ? ["QBS_STATIC_LIB"] : [] } diff --git a/qbs-resources/imports/QbsProduct.qbs b/qbs-resources/imports/QbsProduct.qbs index a90037bc6..ff5915d00 100644 --- a/qbs-resources/imports/QbsProduct.qbs +++ b/qbs-resources/imports/QbsProduct.qbs @@ -6,6 +6,7 @@ Product { Depends { name: "Qt.core"; versionAtLeast: minimumQtVersion } property string minimumQtVersion: "5.6.0" property bool install: true + property string targetInstallDir cpp.defines: { var res = ["QT_NO_CAST_FROM_ASCII", "QT_NO_PROCESS_COMBINED_ARGUMENT_START"]; if (qbs.toolchain.contains("msvc")) @@ -15,4 +16,5 @@ Product { return res; } cpp.enableExceptions: true + cpp.rpaths: qbsbuildconfig.libRPaths } -- cgit v1.2.3