aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorAlberto Mardegan <mardy@users.sourceforge.net>2019-11-07 20:06:41 +0300
committerAlberto Mardegan <mardy@users.sourceforge.net>2019-11-12 09:32:32 +0000
commita8bb88572d2f0c39d3841d082cd956593cfe403e (patch)
treed7c118284a4de5a40b372f6c076f742635ac275b /share
parentfaa280045d783d2fbe815fa83c8c143faf02ecf7 (diff)
GCC: avoid duplicating objects in linker command line
Long command lines are especially a problem when building statically in MXE. This commit tries to replicate the logic employed by qmake, where before adding a new object to the command line, all of its previous appearences get removed. Fixes: QBS-1273 Change-Id: I51c843c4a7cfc170ed4fab30deae6c4229690dd0 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'share')
-rw-r--r--share/qbs/modules/cpp/CppModule.qbs1
-rw-r--r--share/qbs/modules/cpp/gcc.js12
2 files changed, 13 insertions, 0 deletions
diff --git a/share/qbs/modules/cpp/CppModule.qbs b/share/qbs/modules/cpp/CppModule.qbs
index efda896da..bdd6d2750 100644
--- a/share/qbs/modules/cpp/CppModule.qbs
+++ b/share/qbs/modules/cpp/CppModule.qbs
@@ -191,6 +191,7 @@ Module {
property bool useRPathLink
property string rpathLinkFlag
property bool discardUnusedData
+ property bool removeDuplicateLibraries: true
property stringList assemblerFlags
PropertyOptions {
diff --git a/share/qbs/modules/cpp/gcc.js b/share/qbs/modules/cpp/gcc.js
index 639191da6..574fe769b 100644
--- a/share/qbs/modules/cpp/gcc.js
+++ b/share/qbs/modules/cpp/gcc.js
@@ -80,8 +80,20 @@ function collectLibraryDependencies(product, isDarwin) {
var objectByFilePath = {};
var tagForLinkingAgainstSharedLib = product.cpp.imageFormat === "pe"
? "dynamiclibrary_import" : "dynamiclibrary";
+ var removeDuplicateLibraries = product.cpp.removeDuplicateLibraries
function addObject(obj, addFunc) {
+ /* If the object is already known, remove its previous usage and insert
+ * it again in the new desired position. This preserves the order of
+ * the other objects, and is analogous to what qmake does (see the
+ * mergeLflags parameter in UnixMakefileGenerator::findLibraries()).
+ */
+ if (removeDuplicateLibraries && (obj.filePath in objectByFilePath)) {
+ var oldObj = objectByFilePath[obj.filePath];
+ var i = objects.indexOf(oldObj);
+ if (i >= 0)
+ objects.splice(i, 1);
+ }
addFunc.call(objects, obj);
objectByFilePath[obj.filePath] = obj;
}