From 2029f79155af8b3fdff3b9a66ee25b7ff274c327 Mon Sep 17 00:00:00 2001 From: Martchus Date: Sun, 18 Sep 2016 18:45:08 +0200 Subject: [PATCH 18/32] Merge shared and static library trees Allow installation of shared and static build in the same prefix Change-Id: I1de08df42d83d411aae519691cd3cde1fd6f3d1d --- configure.pri | 16 +++++++++++++++- mkspecs/features/default_post.prf | 11 +++++++++++ mkspecs/features/device_config.prf | 9 ++++++++- mkspecs/features/qt.prf | 17 +++++++++++++++++ mkspecs/features/spec_pre.prf | 11 ++++++++--- qmake/generators/makefile.cpp | 11 +++++++---- qtbase.pro | 10 ++++++++-- 7 files changed, 74 insertions(+), 11 deletions(-) diff --git a/configure.pri b/configure.pri index 365a16403eb..85acb3757aa 100644 --- a/configure.pri +++ b/configure.pri @@ -668,7 +668,12 @@ defineTest(qtConfOutput_machineTuple) { defineTest(qtConfOutput_commitOptions) { # qdevice.pri needs to be written early, because the compile tests require it. - write_file($$QT_BUILD_TREE/mkspecs/qdevice.pri, $${currentConfig}.output.devicePro)|error() + shared|actually_a_shared_build { + DEVICE_PRI_SUFFIX = .pri + } else { + DEVICE_PRI_SUFFIX = .static.pri + } + write_file($$QT_BUILD_TREE/mkspecs/qdevice$$DEVICE_PRI_SUFFIX, $${currentConfig}.output.devicePro)|error() } # Output is written after configuring each Qt module, @@ -1430,3 +1435,12 @@ defineTest(createConfigStatus) { QMAKE_POST_CONFIGURE += \ "createConfigStatus()" + +# merge shared and static library trees +contains(CONFIG, static) { + CONFIG -= shared + QT_CONFIG += static jpeg gif + QT_CONFIG -= shared + # prevent smart library merge from messing cyclic dependency between freetype2 and harfbuzz + CONFIG += no_smart_library_merge +} diff --git a/mkspecs/features/default_post.prf b/mkspecs/features/default_post.prf index ac799047ab8..60b63922670 100644 --- a/mkspecs/features/default_post.prf +++ b/mkspecs/features/default_post.prf @@ -1,5 +1,16 @@ # This file is loaded by qmake right after loading the actual project file. +win32:contains(CONFIG, static) { + # Ensure defines are set correctly for static build + DEFINES -= QT_SHARED + DEFINES *= QT_STATIC QT_DESIGNER_STATIC + contains(QT_CONFIG, angle): DEFINES *= QT_OPENGL_ES_2_ANGLE_STATIC + # Ensure we link against all dependencies statically + QMAKE_LFLAGS += -static -static-libstdc++ -static-libgcc + # Prevent qmake from finding the prl file for shared libs + QMAKE_EXT_PRL = .static.prl +} + contains(TEMPLATE, ".*(lib|app)"):CONFIG += have_target !have_target:!force_qt: CONFIG -= qt diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf index c15559e1740..dd09ac749d8 100644 --- a/mkspecs/features/device_config.prf +++ b/mkspecs/features/device_config.prf @@ -4,7 +4,14 @@ # supposed to be influenced by -device-option then. host_build: return() -DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.pri +shared|actually_a_shared_build { + DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.pri +} else { + DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.static.pri + !exists($$DEVICE_PRI) { + DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.pri + } +} exists($$DEVICE_PRI):include($$DEVICE_PRI) unset(DEVICE_PRI) diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index da1f44a88a1..8096d01c341 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -254,6 +254,23 @@ for(ever) { !isEmpty(MODULE_WINRT_CAPABILITIES_DEVICE): \ WINRT_MANIFEST.capabilities_device_default += $$MODULE_WINRT_CAPABILITIES_DEVICE } + + # Ensure linking against all required static libraries as defined in mingw-w64-g++ mkspec + win32:contains(CONFIG, static) { + isEqual(MODULE_NAME, QtCore) { + LIBS$$var_sfx += $$QMAKE_LIBS_CORE + } else:isEqual(MODULE_NAME, QtGui) { + LIBS$$var_sfx += $$QMAKE_LIBS_GUI_STATIC + } else:isEqual(MODULE_NAME, QtNetwork) { + LIBS$$var_sfx += $$QMAKE_LIBS_NETWORK_STATIC + } else:isEqual(MODULE_NAME, QtDBus) { + LIBS$$var_sfx += $$QMAKE_LIBS_DBUS_STATIC + } else:isEqual(MODULE_NAME, QtWidgets) { + LIBS$$var_sfx += $$QMAKE_LIBS_WIDGETS_STATIC + } else:isEqual(MODULE_NAME, QtOpenGL) { + LIBS$$var_sfx += $$QMAKE_LIBS_OPENGL + } + } } !isEmpty(BAD_QT):error("Unknown module(s) in QT$$var_sfx: $$replace(BAD_QT, _private$, -private)") diff --git a/mkspecs/features/spec_pre.prf b/mkspecs/features/spec_pre.prf index 51ea3a8321a..275e080ae4e 100644 --- a/mkspecs/features/spec_pre.prf +++ b/mkspecs/features/spec_pre.prf @@ -14,9 +14,14 @@ QMAKE_EXT_H = .h .hpp .hh .hxx QMAKE_EXT_H_MOC = .cpp QMAKE_EXT_JS = .js QMAKE_EXT_LEX = .l -QMAKE_EXT_LIBTOOL = .la -QMAKE_EXT_PKGCONFIG = .pc -QMAKE_EXT_PRL = .prl +QMAKE_EXT_PKGCONFIG = .pc +contains(CONFIG, static) { + QMAKE_EXT_LIBTOOL = .static.la + QMAKE_EXT_PRL = .static.prl +} else { + QMAKE_EXT_LIBTOOL = .la + QMAKE_EXT_PRL = .prl +} QMAKE_EXT_UI = .ui QMAKE_EXT_YACC = .y diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 23ac736fc06..16531d556e0 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -3259,6 +3259,9 @@ MakefileGenerator::pkgConfigFileName(bool fixify, bool onlyPrependDestdir) if (project->isActiveConfig("debug")) { ret += "d"; } + if (project->isActiveConfig("staticlib")) { + ret.insert(0, QStringLiteral("Static")); + } ret += Option::pkgcfg_ext; QString subdir = project->first("QMAKE_PKGCONFIG_DESTDIR").toQString(); if(!subdir.isEmpty()) { @@ -3435,11 +3438,11 @@ MakefileGenerator::writePkgConfigFile() t << Qt::endl; // requires - const QString requiresString = project->values("QMAKE_PKGCONFIG_REQUIRES").join(' '); - if (!requiresString.isEmpty()) { - t << "Requires: " << requiresString << Qt::endl; + t << "Requires:"; + const auto pkgconfigRequires = project->values("QMAKE_PKGCONFIG_REQUIRES"); + for (const auto &required : pkgconfigRequires) { + t << (project->isActiveConfig("staticlib") ? QStringLiteral(" Static") : QStringLiteral(" ")) << required.toQString(); } - t << Qt::endl; } diff --git a/qtbase.pro b/qtbase.pro index c0ce0972ef4..5a2deaf31d2 100644 --- a/qtbase.pro +++ b/qtbase.pro @@ -20,6 +20,12 @@ CLEAN_DEPS += qmake-clean # recursive distclean proceeds, including beyond qtbase. DISTCLEAN_DEPS += qmake-clean +shared|actually_a_shared_build { + DEVICE_PRI_SUFFIX = .pri +} else { + DEVICE_PRI_SUFFIX = .static.pri +} + # Files created by configure. # config.status (and configure.cache, which is the same for Windows) # are omitted for convenience of rebuilds. @@ -27,7 +33,7 @@ QMAKE_DISTCLEAN += \ config.summary \ config.tests/.qmake.cache \ mkspecs/qconfig.pri \ - mkspecs/qdevice.pri \ + mkspecs/qdevice$$DEVICE_PRI_SUFFIX \ mkspecs/qmodule.pri \ src/corelib/global/qconfig.h \ src/corelib/global/qconfig_p.h \ @@ -78,7 +84,7 @@ prefix_build|!equals(PWD, $$OUT_PWD) { mkspecs.path = $$[QT_HOST_DATA]/mkspecs mkspecs.files = \ $$OUT_PWD/mkspecs/qconfig.pri $$OUT_PWD/mkspecs/qmodule.pri \ - $$OUT_PWD/mkspecs/qdevice.pri \ + $$OUT_PWD/mkspecs/qdevice$$DEVICE_PRI_SUFFIX \ $$files($$PWD/mkspecs/*) mkspecs.files -= $$PWD/mkspecs/modules $$PWD/mkspecs/modules-inst INSTALLS += mkspecs -- 2.44.0