diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2014-11-22 21:00:34 -0800 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2014-12-01 21:33:31 +0100 |
commit | fe6f4b9ad7eff15e6201baea9dad737c792a328c (patch) | |
tree | 87405892971b9b8eec7ee2656993b67bbe30cf10 /mkspecs/features | |
parent | 2b258dc80b34dc785257efa2292457e32da9408d (diff) |
Fix linking of sources without LTCG to a static lib with LTCG
Whenever a binary is created and linked against a static lib that was
compiled with LTCG, the final linking step requires the compiler flags
so that the pre-compiled data in the shared library can get properly
compiled.
This could happen for a static build of Qt with LTCG, but also happens
frequently for Qt's own build when linking regular libraries and
applications against QtBootstrap or QtPlatformSupport. The linking fails
when the target is a shared library (example: QtWaylandClient linking
against QtPlatformSupport).
The .prl file actually contains the "ltcg" flag, so the best solution
would actually be to process that flag there and add link_ltcg if any
dependent .prl has "ltcg", but I couldn't find out how to do that.
Change-Id: I4a75a14d1dcb8c2089a427285e25d5555df7d7d3
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Diffstat (limited to 'mkspecs/features')
-rw-r--r-- | mkspecs/features/link_ltcg.prf | 18 | ||||
-rw-r--r-- | mkspecs/features/ltcg.prf | 18 | ||||
-rw-r--r-- | mkspecs/features/qt_functions.prf | 1 | ||||
-rw-r--r-- | mkspecs/features/qt_module_pris.prf | 2 |
4 files changed, 22 insertions, 17 deletions
diff --git a/mkspecs/features/link_ltcg.prf b/mkspecs/features/link_ltcg.prf new file mode 100644 index 0000000000..537021f11b --- /dev/null +++ b/mkspecs/features/link_ltcg.prf @@ -0,0 +1,18 @@ +gcc { + # When doing link-time code generation, we need to pass the compiler + # flags during linking the stage too. This file is processed after + # default_post.prf, so the QMAKE_CXXFLAGS already contains + # QMAKE_CXXFLAGS_DEBUG or _RELEASE. + use_c_linker { + # use_c_linker.prf is in effect, use the C flags + QMAKE_LFLAGS_LTCG += $$QMAKE_CFLAGS $$QMAKE_CFLAGS_LTCG + QMAKE_LFLAGS_APP += $$QMAKE_CFLAGS_APP + QMAKE_LFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB + QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB + } else { + QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG + QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP + QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB + QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB + } +} diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf index 1459ccdc40..b0765a85c3 100644 --- a/mkspecs/features/ltcg.prf +++ b/mkspecs/features/ltcg.prf @@ -31,25 +31,9 @@ CONFIG(release, debug|release) { QMAKE_CXXFLAGS_LTCG = QMAKE_LFLAGS_LTCG = } - - # When doing link-time code generation, we need to pass the compiler - # flags during linking stage too. This file is processed after - # default_post.prf, so the QMAKE_CXXFLAGS already contains - # QMAKE_CXXFLAGS_DEBUG or _RELEASE. - use_c_linker { - # use_c_linker.prf is in effect, use the C flags - QMAKE_LFLAGS_LTCG += $$QMAKE_CFLAGS $$QMAKE_CFLAGS_LTCG - QMAKE_LFLAGS_APP += $$QMAKE_CFLAGS_APP - QMAKE_LFLAGS_SHLIB += $$QMAKE_CFLAGS_SHLIB - QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB - } else { - QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG - QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP - QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB - QMAKE_LFLAGS_PLUGIN += $$QMAKE_CFLAGS_SHLIB - } } + load(link_ltcg) QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf index a9a622dd1d..7961f6512a 100644 --- a/mkspecs/features/qt_functions.prf +++ b/mkspecs/features/qt_functions.prf @@ -68,6 +68,7 @@ defineTest(qtAddModule) { using_privates = true export(using_privates) } + contains(MODULE_CONFIG, ltcg): CONFIG += link_ltcg qtProcessModuleFlags(CONFIG, QT.$${1}.CONFIG) qtProcessModuleFlags(DEFINES, QT.$${1}.DEFINES) diff --git a/mkspecs/features/qt_module_pris.prf b/mkspecs/features/qt_module_pris.prf index 9a876caf5e..03a8e5db71 100644 --- a/mkspecs/features/qt_module_pris.prf +++ b/mkspecs/features/qt_module_pris.prf @@ -66,6 +66,8 @@ MODULE_FWD_PRI = $$mod_work_pfx/qt_lib_$${MODULE_ID}.pri module_build_type = internal_module: \ module_build_type += internal_module + ltcg: \ + module_build_type += ltcg !isEmpty(MODULE_CONFIG): \ module_config = "QT.$${MODULE_ID}.CONFIG = $$MODULE_CONFIG" else: \ |