diff options
author | Alberto Mardegan <mardy@users.sourceforge.net> | 2019-11-07 20:06:41 +0300 |
---|---|---|
committer | Alberto Mardegan <mardy@users.sourceforge.net> | 2019-11-12 09:32:32 +0000 |
commit | a8bb88572d2f0c39d3841d082cd956593cfe403e (patch) | |
tree | d7c118284a4de5a40b372f6c076f742635ac275b /share | |
parent | faa280045d783d2fbe815fa83c8c143faf02ecf7 (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.qbs | 1 | ||||
-rw-r--r-- | share/qbs/modules/cpp/gcc.js | 12 |
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; } |