qt5-static: Added Thiago's lto patch (1bd27f)

.. but don't use it for now (the configure script work isn't
done). Instead LTO can be attempted via QMAKE_CFLAGS and
QMAKE_LFLAGS by setting _ltcg="yes". This is also disabled
for now as it doesn't work.

adipose's lto investigations can be found at:
https://github.com/Alexpux/MINGW-packages/issues/186
This commit is contained in:
Ray Donnelly
2014-09-19 22:20:30 +01:00
parent 33bb7a3f9f
commit 12b0739f4f
4 changed files with 536 additions and 32 deletions

View File

@@ -0,0 +1,203 @@
From 1bd27f24fb7f7d82f4b67cffe43e0af644709106 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@intel.com>
Date: Thu, 26 Jun 2014 14:56:06 -0700
Subject: [PATCH] Add link-time optimization support for Clang, GCC and ICC
GCC currently requires fat object files for static libraries, since the
linker would otherwise not load the .o file from the archive at all and
the linking would fail with a lot of undefined references. Clang on
Linux also needs this, but it has no equivalent flag, so enabling LTCG
for Clang on static libraries will result in linker error.
This commit does not add support for enabling it in configure. It can be
enabled on a per-project basis by doing CONFIG += ltcg or by passing
-config ltcg to qmake's command-line.
Change-Id: I52cf99f1ed9f1701e23a3b457ba3502fd28126ce
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
---
mkspecs/common/clang.conf | 6 ++++-
mkspecs/common/gcc-base.conf | 3 +++
mkspecs/features/ltcg.prf | 54 +++++++++++++++++++++++++++++++++++++++++
mkspecs/features/win32/ltcg.prf | 5 ----
mkspecs/linux-icc/qmake.conf | 3 +++
mkspecs/macx-icc/qmake.conf | 3 +++
7 files changed, 71 insertions(+), 6 deletions(-)
create mode 100644 mkspecs/features/ltcg.prf
delete mode 100644 mkspecs/features/win32/ltcg.prf
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
index d58b44b..6235296 100644
--- a/mkspecs/common/clang.conf
+++ b/mkspecs/common/clang.conf
@@ -16,8 +16,12 @@ QMAKE_PCH_OUTPUT_EXT = .pch
QMAKE_CFLAGS_ISYSTEM = -isystem
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
+QMAKE_CFLAGS_LTCG = -flto
+
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
-QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index fcff502a..06d87d7 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -48,6 +48,7 @@ QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
QMAKE_CFLAGS_SPLIT_SECTIONS += -ffunction-sections
+QMAKE_CFLAGS_LTCG = -flto
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS
@@ -62,12 +63,14 @@ QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
QMAKE_CXXFLAGS_EXCEPTIONS_OFF += $$QMAKE_CFLAGS_EXCEPTIONS_OFF
QMAKE_CXXFLAGS_SPLIT_SECTIONS += $$QMAKE_CFLAGS_SPLIT_SECTIONS
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS +=
QMAKE_LFLAGS_DEBUG +=
QMAKE_LFLAGS_APP +=
QMAKE_LFLAGS_RELEASE +=
QMAKE_LFLAGS_EXCEPTIONS_OFF +=
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -fuse-linker-plugin
QMAKE_CFLAGS_SSE2 += -msse2
QMAKE_CFLAGS_SSE3 += -msse3
diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf
new file mode 100644
index 0000000..b418135
--- /dev/null
+++ b/mkspecs/features/ltcg.prf
@@ -0,0 +1,54 @@
+CONFIG(release, debug|release) {
+ # We need fat object files when creating static libraries on some platforms
+ # so the linker will know to load a particular object from the library
+ # in the first place. With GCC, we have -ffat-lto-objects. MSVC
+ # seems to work just fine. For other compilers, we disable LTCG
+ # for static libraries.
+ msvc {
+ # Nothing to do
+ } else: gcc {
+ !clang:!intel_icc {
+ static|fat-lto {
+ QMAKE_CFLAGS_LTCG += -ffat-lto-objects
+ QMAKE_CXXFLAGS_LTCG += -ffat-lto-objects
+ } else {
+ QMAKE_CFLAGS_LTCG += -fno-fat-lto-objects
+ QMAKE_CXXFLAGS_LTCG += -fno-fat-lto-objects
+ }
+ linux {
+ # Get the number of online processors, like _SC_NPROCESSORS_ONLN
+ isEmpty(QMAKE_NPROCESSORS_ONLN) {
+ QMAKE_NPROCESSORS_ONLN = $$system("grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo 1")
+ cache(QMAKE_NPROCESSORS_ONLN, set stash)
+ }
+
+ # Override LTO number of jobs
+ QMAKE_LFLAGS_LTCG -= -flto
+ QMAKE_LFLAGS_LTCG += -flto=$$QMAKE_NPROCESSORS_ONLN
+ }
+ } else: static {
+ QMAKE_CFLAGS_LTCG =
+ 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
+ } else {
+ QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG
+ QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP
+ QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB
+ }
+ }
+
+ QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
+ QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
+ QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
+}
diff --git a/mkspecs/features/win32/ltcg.prf b/mkspecs/features/win32/ltcg.prf
deleted file mode 100644
index f6f1299..0000000
--- a/mkspecs/features/win32/ltcg.prf
+++ /dev/null
@@ -1,5 +0,0 @@
-CONFIG(release, debug|release) {
- QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
- QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
- QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
-}
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index c0caca0..8119c8a 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -24,6 +24,7 @@ QMAKE_CFLAGS_YACC =
QMAKE_CFLAGS_ISYSTEM = -isystem
QMAKE_CFLAGS_THREAD = -D_REENTRANT
QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
+QMAKE_CFLAGS_LTCG = -ipo
QMAKE_CFLAGS_SSE2 += -xSSE2
QMAKE_CFLAGS_SSE3 += -xSSE3
@@ -49,6 +50,7 @@ QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
# Disabling exceptions disabled - workaround for QTBUG-36577
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_INCDIR =
QMAKE_LIBDIR =
@@ -70,6 +72,7 @@ QMAKE_LFLAGS_NOUNDEF = -Wl,-z,defs
QMAKE_LFLAGS_RPATH = -Wl,-rpath,
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link,
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LIBS =
QMAKE_LIBS_DYNLOAD = -ldl
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index 370a738..88b0497 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -23,6 +23,7 @@ QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_THREAD =
QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
+QMAKE_CFLAGS_LTCG = -ipo
QMAKE_CFLAGS_SSE2 += -msse2
QMAKE_CFLAGS_SSE3 += -msse3
@@ -54,6 +55,7 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
# Disabled, due to invalid C++11 code on Apple headers
#QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LINK = icpc
QMAKE_LINK_SHLIB = icpc
@@ -66,6 +68,7 @@ QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
QMAKE_LFLAGS_SONAME = -install_name$${LITERAL_WHITESPACE}
QMAKE_LFLAGS_THREAD =
QMAKE_LFLAGS_RPATH =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_VERSION = -current_version$${LITERAL_WHITESPACE}
QMAKE_LFLAGS_COMPAT_VERSION = -compatibility_version$${LITERAL_WHITESPACE}
--
2.1.0

View File

@@ -15,16 +15,31 @@ _debuggable_release=no
# Using -O0 results in a Qt5WebKitd.dll that is > 2.5GB
# so force -Og. If you really need to, change this back
# to -O0, leave it blank or comment it out.
OPTIM_D="-Og"
# Update: I think specifying anything here leads to huge
# Qt5WebKitd.dll, never commit with this set to anything
# -O0 is the default for GCC anyway, but qt5webkit seems
# to use a different flag if nothing explictly specified
# OPTIM_D="-Og"
if [ "${_variant}" = "-static" ]; then
_namesuff="-static"
_freetype2="-qt-freetype"
_fastbuild="yes"
# _ltcg="yes"
_ltcg="no"
else
_namesuff=
_freetype2="-system-freetype"
_fastbuild="no"
_ltcg="no"
fi
# Thiago's patch doesn't contain the configure script changes
# needed, you may be able to get somewhere with this in the
# meantime (probably not though!)
if [ "${_ltcg}" = "yes" ]; then
LTCG_CFLAGS="-flto-partition=1to1 -flto -ffat-lto-objects"
LTCG_LFLAGS="-flto-partition=1to1 -flto -ffat-lto-objects"
fi
_realname=qt5${_namesuff}
@@ -122,6 +137,7 @@ source=(#"${_pkgfqn}.tar.xz"
http://download.qt-project.org/official_releases/qt/${pkgver%.*}/${_ver_base}/single/${_pkgfqn}.tar.xz
#http://download.qt-project.org/snapshots/qt/${pkgver%.*}/${_ver_base}/2014-05-07_85/src/qt-everywhere-opensource-src-${_ver_base}.tar.xz
#"qt3d"::"git://gitorious.org/qt/qt3d.git"
0001-Add-link-time-optimization-support-for-Clang-GCC-and.patch
0001-qt-5.3.0-oracle-driver-prompt.patch
0002-qt-5.3.0-use-fbclient-instead-of-gds32.patch
0003-qt-5.3.0-use-mingw-built-mysql-library.patch
@@ -154,6 +170,7 @@ source=(#"${_pkgfqn}.tar.xz"
0031-qt-5.3.1-Fix-masm-pri-build-race-condition.patch
0032-qt-5.3.2-Disable-jitted-Regexp-for-Mingw-64-bit-94712.patch)
md5sums=('c4e893678e3d8388ab04d059523d1d78'
'a2fa66089b171ebb76a6e0bda2ef4ca8'
'e3210b753ba04762de2ed4cb9c786bf1'
'356f7fcf93869e92cd232ef70160ab58'
'b0b5cc641cf8ebc2660fa819bede0089'
@@ -218,6 +235,11 @@ prepare() {
# MSYS2 gperf cannot handle \r\n.
find . -name "*.gperf" -exec dos2unix "{}" \;
pushd qtbase > /dev/null
rm -f mkspecs/features/ltcg.prf > /dev/null 2>&1 || true
patch -p1 -i ${srcdir}/0001-Add-link-time-optimization-support-for-Clang-GCC-and.patch
popd
patch -p1 -i ${srcdir}/0001-qt-5.3.0-oracle-driver-prompt.patch
patch -p1 -i ${srcdir}/0002-qt-5.3.0-use-fbclient-instead-of-gds32.patch
patch -p1 -i ${srcdir}/0003-qt-5.3.0-use-mingw-built-mysql-library.patch
@@ -277,6 +299,12 @@ prepare() {
patch -p1 -i ${srcdir}/0030-qt-5.3.1-workaround-ansidecl-h-PTR-define-conflict.patch
popd > /dev/null
# See discussion at https://bugreports.qt-project.org/browse/QTBUG-41292
# I think what is possibly happening instead is that the Debug and Release
# builds are happening in parallel and this causes the error. While Ossi's
# suggestion (below) doesn't fix the problem entirely, it makes the chances
# of it happening near 0. Ossi we should have a different target file for
# RegExpJitTables.h for each of release and debug.
patch -p1 -i ${srcdir}/0031-qt-5.3.1-Fix-masm-pri-build-race-condition.patch
patch -p1 -i ${srcdir}/0032-qt-5.3.2-Disable-jitted-Regexp-for-Mingw-64-bit-94712.patch
@@ -284,13 +312,13 @@ prepare() {
# _ver_num=${_ver_base%%-*}
# sed -i "s/^MODULE_VERSION = .*$/MODULE_VERSION = ${_ver_num}/g" qtenginio/.qmake.conf
local _optim=
local _ARCH_TUNE=
case ${MINGW_CHOST} in
i686*)
_optim="-march=i686 -mtune=core2"
_ARCH_TUNE="-march=i686 -mtune=core2"
;;
x86_64*)
_optim="-march=nocona -mtune=core2"
_ARCH_TUNE="-march=nocona -mtune=core2"
;;
esac
@@ -300,27 +328,30 @@ prepare() {
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61207
# Unlike OPTIM_D, please keep this one down here since it is not user selectable due
# to the GCC bug.
# This is the default, prevent re-appending.
# OPTIM_O="-O2"
if [ "${_variant}" = "-static" -a "${CARCH}" = "i686" ]; then
OPTIM_O="-Os"
else
OPTIM_O="-O2"
fi
if [ "${_debuggable_release}" = "yes" ]; then
QMAKE_LFLAGS_RELEASE=
CFLAGS_MKS_RELEASE="${_optim} ${OPTIM_O} -g"
OPTIM_O=${OPTIM_O}" -g"
else
QMAKE_LFLAGS_RELEASE="-Wl,-s"
CFLAGS_MKS_RELEASE="${_optim} ${OPTIM_O}"
fi
CFLAGS_MKS_DEBUG="${_optim} ${OPTIM_D}"
# If not using MSYS2 make then transform -I${MINGW_PREFIX}/blah or -L${MINGW_PREFIX}/blah from MSYS2 to native
CFLAGS_MKS_RELEASE=$(path_conv_for_make "${CFLAGS_MKS_RELEASE}")
CFLAGS_MKS_DEBUG=$(path_conv_for_make "${CFLAGS_MKS_DEBUG}")
LDFLAGS_MKS=$(path_conv_for_make "${LDFLAGS_MKS}")
sed -i "s|^QMAKE_CFLAGS_RELEASE.*= .*$|QMAKE_CFLAGS_RELEASE = ${CFLAGS_MKS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
sed -i "s|^QMAKE_CFLAGS_DEBUG.*= .*$|QMAKE_CFLAGS_DEBUG = ${CFLAGS_MKS_DEBUG}|g" qtbase/mkspecs/win32-g++/qmake.conf
sed -i "s|^QMAKE_LFLAGS_RELEASE.*= .*$|QMAKE_LFLAGS_RELEASE = ${QMAKE_LFLAGS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
# Append these ones ..
sed -i "s|^QMAKE_CFLAGS .*= \(.*\)$|QMAKE_CFLAGS = \1 ${_ARCH_TUNE} ${LTCG_CFLAGS}|g" qtbase/mkspecs/win32-g++/qmake.conf
if [ -n "$OPTIM_D" ]; then
sed -i "s|^QMAKE_CFLAGS_DEBUG .*= \(.*\)$|QMAKE_CFLAGS_DEBUG = \1 ${OPTIM_D}|g" qtbase/mkspecs/win32-g++/qmake.conf
fi
if [ -n "$OPTIM_O" ]; then
sed -i "s|^QMAKE_CFLAGS_RELEASE .*= \(.*\)$|QMAKE_CFLAGS_RELEASE = \1 ${OPTIM_O}|g" qtbase/mkspecs/win32-g++/qmake.conf
fi
sed -i "s|^QMAKE_LFLAGS =\(.*\)$|QMAKE_LFLAGS = \1 ${LTCG_LFLAGS}|g" qtbase/mkspecs/win32-g++/qmake.conf
# But overwrite this one.
sed -i "s|^QMAKE_LFLAGS_RELEASE .*= \(.*\)$|QMAKE_LFLAGS_RELEASE = ${QMAKE_LFLAGS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
# To keep the build folder name quite small (PATH_MAX limit)
# the source folder (long) is renamed to $CARCH (i686 or x86_64)
@@ -522,3 +553,21 @@ package() {
# ./auto/qscriptjstestsuite/${CONFIG}/tst_qscriptjstestsuite.exe -silent >> qscriptjstestsuite.log
# popd
# done
# i686 build failure with yarr:
# export PATH=/mingw32/bin:$PATH
# export PKG_CONFIG_PATH=/mingw32/lib/pkgconfig
# pushd /e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml
# make
# make[4]: Entering directory '/e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml'
# g++ -Wl,-s -shared -Wl,--out-implib,E:/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/lib/libQt5Qml.dll.a -o ../../lib/Qt5Qml.dll object_script.Qt5Qml.Release -lshell32 -LE:/m2/repo/mingw-w64-qt5/src/i686/qtbase/lib -lQt5Network -lQt5Core .obj/release/Qt5Qml_resource_res.o
# ./.obj/release/YarrInterpreter.o:YarrInterpreter.cpp:(.text+0x622): undefined reference to `JSC::Yarr::wordcharCreate()'
# ./.obj/release/YarrInterpreter.o:YarrInterpreter.cpp:(.text+0x693): undefined reference to `JSC::Yarr::newlineCreate()'
# E:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/ld.exe: ./.obj/release/YarrInterpreter.o: bad reloc address 0x12 in section `.text$_ZN3WTF15BumpPointerPool6createEj[__ZN3WTF15BumpPointerPool6createEj]'
# collect2.exe: error: ld returned 1 exit status
# Makefile.Release:534: recipe for target '../../lib/Qt5Qml.dll' failed
# pushd /e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml
# export PATH=/mingw32/bin:$PATH
# export PKG_CONFIG_PATH=/mingw32/lib/pkgconfig
# E:/m2/repo/mingw-w64-qt5/src/i686/qtbase/bin/qmake.exe -o Makefile qml.pro

View File

@@ -0,0 +1,203 @@
From 1bd27f24fb7f7d82f4b67cffe43e0af644709106 Mon Sep 17 00:00:00 2001
From: Thiago Macieira <thiago.macieira@intel.com>
Date: Thu, 26 Jun 2014 14:56:06 -0700
Subject: [PATCH] Add link-time optimization support for Clang, GCC and ICC
GCC currently requires fat object files for static libraries, since the
linker would otherwise not load the .o file from the archive at all and
the linking would fail with a lot of undefined references. Clang on
Linux also needs this, but it has no equivalent flag, so enabling LTCG
for Clang on static libraries will result in linker error.
This commit does not add support for enabling it in configure. It can be
enabled on a per-project basis by doing CONFIG += ltcg or by passing
-config ltcg to qmake's command-line.
Change-Id: I52cf99f1ed9f1701e23a3b457ba3502fd28126ce
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
---
mkspecs/common/clang.conf | 6 ++++-
mkspecs/common/gcc-base.conf | 3 +++
mkspecs/features/ltcg.prf | 54 +++++++++++++++++++++++++++++++++++++++++
mkspecs/features/win32/ltcg.prf | 5 ----
mkspecs/linux-icc/qmake.conf | 3 +++
mkspecs/macx-icc/qmake.conf | 3 +++
7 files changed, 71 insertions(+), 6 deletions(-)
create mode 100644 mkspecs/features/ltcg.prf
delete mode 100644 mkspecs/features/win32/ltcg.prf
diff --git a/mkspecs/common/clang.conf b/mkspecs/common/clang.conf
index d58b44b..6235296 100644
--- a/mkspecs/common/clang.conf
+++ b/mkspecs/common/clang.conf
@@ -16,8 +16,12 @@ QMAKE_PCH_OUTPUT_EXT = .pch
QMAKE_CFLAGS_ISYSTEM = -isystem
QMAKE_CFLAGS_PRECOMPILE = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
+QMAKE_CFLAGS_LTCG = -flto
+
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
-QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index fcff502a..06d87d7 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -48,6 +48,7 @@ QMAKE_CFLAGS_YACC += -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_HIDESYMS += -fvisibility=hidden
QMAKE_CFLAGS_EXCEPTIONS_OFF += -fno-exceptions
QMAKE_CFLAGS_SPLIT_SECTIONS += -ffunction-sections
+QMAKE_CFLAGS_LTCG = -flto
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS
QMAKE_CXXFLAGS_DEPS += $$QMAKE_CFLAGS_DEPS
@@ -62,12 +63,14 @@ QMAKE_CXXFLAGS_YACC += $$QMAKE_CFLAGS_YACC
QMAKE_CXXFLAGS_HIDESYMS += $$QMAKE_CFLAGS_HIDESYMS -fvisibility-inlines-hidden
QMAKE_CXXFLAGS_EXCEPTIONS_OFF += $$QMAKE_CFLAGS_EXCEPTIONS_OFF
QMAKE_CXXFLAGS_SPLIT_SECTIONS += $$QMAKE_CFLAGS_SPLIT_SECTIONS
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS +=
QMAKE_LFLAGS_DEBUG +=
QMAKE_LFLAGS_APP +=
QMAKE_LFLAGS_RELEASE +=
QMAKE_LFLAGS_EXCEPTIONS_OFF +=
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG -fuse-linker-plugin
QMAKE_CFLAGS_SSE2 += -msse2
QMAKE_CFLAGS_SSE3 += -msse3
diff --git a/mkspecs/features/ltcg.prf b/mkspecs/features/ltcg.prf
new file mode 100644
index 0000000..b418135
--- /dev/null
+++ b/mkspecs/features/ltcg.prf
@@ -0,0 +1,54 @@
+CONFIG(release, debug|release) {
+ # We need fat object files when creating static libraries on some platforms
+ # so the linker will know to load a particular object from the library
+ # in the first place. With GCC, we have -ffat-lto-objects. MSVC
+ # seems to work just fine. For other compilers, we disable LTCG
+ # for static libraries.
+ msvc {
+ # Nothing to do
+ } else: gcc {
+ !clang:!intel_icc {
+ static|fat-lto {
+ QMAKE_CFLAGS_LTCG += -ffat-lto-objects
+ QMAKE_CXXFLAGS_LTCG += -ffat-lto-objects
+ } else {
+ QMAKE_CFLAGS_LTCG += -fno-fat-lto-objects
+ QMAKE_CXXFLAGS_LTCG += -fno-fat-lto-objects
+ }
+ linux {
+ # Get the number of online processors, like _SC_NPROCESSORS_ONLN
+ isEmpty(QMAKE_NPROCESSORS_ONLN) {
+ QMAKE_NPROCESSORS_ONLN = $$system("grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo 1")
+ cache(QMAKE_NPROCESSORS_ONLN, set stash)
+ }
+
+ # Override LTO number of jobs
+ QMAKE_LFLAGS_LTCG -= -flto
+ QMAKE_LFLAGS_LTCG += -flto=$$QMAKE_NPROCESSORS_ONLN
+ }
+ } else: static {
+ QMAKE_CFLAGS_LTCG =
+ 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
+ } else {
+ QMAKE_LFLAGS_LTCG = $$QMAKE_CXXFLAGS $$QMAKE_LFLAGS_LTCG
+ QMAKE_LFLAGS_APP += $$QMAKE_CXXFLAGS_APP
+ QMAKE_LFLAGS_SHLIB += $$QMAKE_CXXFLAGS_SHLIB
+ }
+ }
+
+ QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
+ QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
+ QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
+}
diff --git a/mkspecs/features/win32/ltcg.prf b/mkspecs/features/win32/ltcg.prf
deleted file mode 100644
index f6f1299..0000000
--- a/mkspecs/features/win32/ltcg.prf
+++ /dev/null
@@ -1,5 +0,0 @@
-CONFIG(release, debug|release) {
- QMAKE_CFLAGS *= $$QMAKE_CFLAGS_LTCG
- QMAKE_CXXFLAGS *= $$QMAKE_CXXFLAGS_LTCG
- QMAKE_LFLAGS *= $$QMAKE_LFLAGS_LTCG
-}
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index c0caca0..8119c8a 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -24,6 +24,7 @@ QMAKE_CFLAGS_YACC =
QMAKE_CFLAGS_ISYSTEM = -isystem
QMAKE_CFLAGS_THREAD = -D_REENTRANT
QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
+QMAKE_CFLAGS_LTCG = -ipo
QMAKE_CFLAGS_SSE2 += -xSSE2
QMAKE_CFLAGS_SSE3 += -xSSE3
@@ -49,6 +50,7 @@ QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
# Disabling exceptions disabled - workaround for QTBUG-36577
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_INCDIR =
QMAKE_LIBDIR =
@@ -70,6 +72,7 @@ QMAKE_LFLAGS_NOUNDEF = -Wl,-z,defs
QMAKE_LFLAGS_RPATH = -Wl,-rpath,
QMAKE_LFLAGS_RPATHLINK = -Wl,-rpath-link,
QMAKE_LFLAGS_CXX11 =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LIBS =
QMAKE_LIBS_DYNLOAD = -ldl
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index 370a738..88b0497 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -23,6 +23,7 @@ QMAKE_CFLAGS_STATIC_LIB = $$QMAKE_CFLAGS_SHLIB
QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
QMAKE_CFLAGS_THREAD =
QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
+QMAKE_CFLAGS_LTCG = -ipo
QMAKE_CFLAGS_SSE2 += -msse2
QMAKE_CFLAGS_SSE3 += -msse3
@@ -54,6 +55,7 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
# Disabled, due to invalid C++11 code on Apple headers
#QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
+QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LINK = icpc
QMAKE_LINK_SHLIB = icpc
@@ -66,6 +68,7 @@ QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB
QMAKE_LFLAGS_SONAME = -install_name$${LITERAL_WHITESPACE}
QMAKE_LFLAGS_THREAD =
QMAKE_LFLAGS_RPATH =
+QMAKE_LFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_LFLAGS_VERSION = -current_version$${LITERAL_WHITESPACE}
QMAKE_LFLAGS_COMPAT_VERSION = -compatibility_version$${LITERAL_WHITESPACE}
--
2.1.0

View File

@@ -15,16 +15,31 @@ _debuggable_release=no
# Using -O0 results in a Qt5WebKitd.dll that is > 2.5GB
# so force -Og. If you really need to, change this back
# to -O0, leave it blank or comment it out.
OPTIM_D="-Og"
# Update: I think specifying anything here leads to huge
# Qt5WebKitd.dll, never commit with this set to anything
# -O0 is the default for GCC anyway, but qt5webkit seems
# to use a different flag if nothing explictly specified
# OPTIM_D="-Og"
if [ "${_variant}" = "-static" ]; then
_namesuff="-static"
_freetype2="-qt-freetype"
_fastbuild="yes"
# _ltcg="yes"
_ltcg="no"
else
_namesuff=
_freetype2="-system-freetype"
_fastbuild="no"
_ltcg="no"
fi
# Thiago's patch doesn't contain the configure script changes
# needed, you may be able to get somewhere with this in the
# meantime (probably not though!)
if [ "${_ltcg}" = "yes" ]; then
LTCG_CFLAGS="-flto-partition=1to1 -flto -ffat-lto-objects"
LTCG_LFLAGS="-flto-partition=1to1 -flto -ffat-lto-objects"
fi
_realname=qt5${_namesuff}
@@ -122,6 +137,7 @@ source=(#"${_pkgfqn}.tar.xz"
http://download.qt-project.org/official_releases/qt/${pkgver%.*}/${_ver_base}/single/${_pkgfqn}.tar.xz
#http://download.qt-project.org/snapshots/qt/${pkgver%.*}/${_ver_base}/2014-05-07_85/src/qt-everywhere-opensource-src-${_ver_base}.tar.xz
#"qt3d"::"git://gitorious.org/qt/qt3d.git"
0001-Add-link-time-optimization-support-for-Clang-GCC-and.patch
0001-qt-5.3.0-oracle-driver-prompt.patch
0002-qt-5.3.0-use-fbclient-instead-of-gds32.patch
0003-qt-5.3.0-use-mingw-built-mysql-library.patch
@@ -154,6 +170,7 @@ source=(#"${_pkgfqn}.tar.xz"
0031-qt-5.3.1-Fix-masm-pri-build-race-condition.patch
0032-qt-5.3.2-Disable-jitted-Regexp-for-Mingw-64-bit-94712.patch)
md5sums=('c4e893678e3d8388ab04d059523d1d78'
'a2fa66089b171ebb76a6e0bda2ef4ca8'
'e3210b753ba04762de2ed4cb9c786bf1'
'356f7fcf93869e92cd232ef70160ab58'
'b0b5cc641cf8ebc2660fa819bede0089'
@@ -218,6 +235,11 @@ prepare() {
# MSYS2 gperf cannot handle \r\n.
find . -name "*.gperf" -exec dos2unix "{}" \;
pushd qtbase > /dev/null
rm -f mkspecs/features/ltcg.prf > /dev/null 2>&1 || true
patch -p1 -i ${srcdir}/0001-Add-link-time-optimization-support-for-Clang-GCC-and.patch
popd
patch -p1 -i ${srcdir}/0001-qt-5.3.0-oracle-driver-prompt.patch
patch -p1 -i ${srcdir}/0002-qt-5.3.0-use-fbclient-instead-of-gds32.patch
patch -p1 -i ${srcdir}/0003-qt-5.3.0-use-mingw-built-mysql-library.patch
@@ -277,6 +299,12 @@ prepare() {
patch -p1 -i ${srcdir}/0030-qt-5.3.1-workaround-ansidecl-h-PTR-define-conflict.patch
popd > /dev/null
# See discussion at https://bugreports.qt-project.org/browse/QTBUG-41292
# I think what is possibly happening instead is that the Debug and Release
# builds are happening in parallel and this causes the error. While Ossi's
# suggestion (below) doesn't fix the problem entirely, it makes the chances
# of it happening near 0. Ossi we should have a different target file for
# RegExpJitTables.h for each of release and debug.
patch -p1 -i ${srcdir}/0031-qt-5.3.1-Fix-masm-pri-build-race-condition.patch
patch -p1 -i ${srcdir}/0032-qt-5.3.2-Disable-jitted-Regexp-for-Mingw-64-bit-94712.patch
@@ -284,13 +312,13 @@ prepare() {
# _ver_num=${_ver_base%%-*}
# sed -i "s/^MODULE_VERSION = .*$/MODULE_VERSION = ${_ver_num}/g" qtenginio/.qmake.conf
local _optim=
local _ARCH_TUNE=
case ${MINGW_CHOST} in
i686*)
_optim="-march=i686 -mtune=core2"
_ARCH_TUNE="-march=i686 -mtune=core2"
;;
x86_64*)
_optim="-march=nocona -mtune=core2"
_ARCH_TUNE="-march=nocona -mtune=core2"
;;
esac
@@ -300,27 +328,30 @@ prepare() {
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61207
# Unlike OPTIM_D, please keep this one down here since it is not user selectable due
# to the GCC bug.
# This is the default, prevent re-appending.
# OPTIM_O="-O2"
if [ "${_variant}" = "-static" -a "${CARCH}" = "i686" ]; then
OPTIM_O="-Os"
else
OPTIM_O="-O2"
fi
if [ "${_debuggable_release}" = "yes" ]; then
QMAKE_LFLAGS_RELEASE=
CFLAGS_MKS_RELEASE="${_optim} ${OPTIM_O} -g"
OPTIM_O=${OPTIM_O}" -g"
else
QMAKE_LFLAGS_RELEASE="-Wl,-s"
CFLAGS_MKS_RELEASE="${_optim} ${OPTIM_O}"
fi
CFLAGS_MKS_DEBUG="${_optim} ${OPTIM_D}"
# If not using MSYS2 make then transform -I${MINGW_PREFIX}/blah or -L${MINGW_PREFIX}/blah from MSYS2 to native
CFLAGS_MKS_RELEASE=$(path_conv_for_make "${CFLAGS_MKS_RELEASE}")
CFLAGS_MKS_DEBUG=$(path_conv_for_make "${CFLAGS_MKS_DEBUG}")
LDFLAGS_MKS=$(path_conv_for_make "${LDFLAGS_MKS}")
sed -i "s|^QMAKE_CFLAGS_RELEASE.*= .*$|QMAKE_CFLAGS_RELEASE = ${CFLAGS_MKS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
sed -i "s|^QMAKE_CFLAGS_DEBUG.*= .*$|QMAKE_CFLAGS_DEBUG = ${CFLAGS_MKS_DEBUG}|g" qtbase/mkspecs/win32-g++/qmake.conf
sed -i "s|^QMAKE_LFLAGS_RELEASE.*= .*$|QMAKE_LFLAGS_RELEASE = ${QMAKE_LFLAGS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
# Append these ones ..
sed -i "s|^QMAKE_CFLAGS .*= \(.*\)$|QMAKE_CFLAGS = \1 ${_ARCH_TUNE} ${LTCG_CFLAGS}|g" qtbase/mkspecs/win32-g++/qmake.conf
if [ -n "$OPTIM_D" ]; then
sed -i "s|^QMAKE_CFLAGS_DEBUG .*= \(.*\)$|QMAKE_CFLAGS_DEBUG = \1 ${OPTIM_D}|g" qtbase/mkspecs/win32-g++/qmake.conf
fi
if [ -n "$OPTIM_O" ]; then
sed -i "s|^QMAKE_CFLAGS_RELEASE .*= \(.*\)$|QMAKE_CFLAGS_RELEASE = \1 ${OPTIM_O}|g" qtbase/mkspecs/win32-g++/qmake.conf
fi
sed -i "s|^QMAKE_LFLAGS =\(.*\)$|QMAKE_LFLAGS = \1 ${LTCG_LFLAGS}|g" qtbase/mkspecs/win32-g++/qmake.conf
# But overwrite this one.
sed -i "s|^QMAKE_LFLAGS_RELEASE .*= \(.*\)$|QMAKE_LFLAGS_RELEASE = ${QMAKE_LFLAGS_RELEASE}|g" qtbase/mkspecs/win32-g++/qmake.conf
# To keep the build folder name quite small (PATH_MAX limit)
# the source folder (long) is renamed to $CARCH (i686 or x86_64)
@@ -522,3 +553,21 @@ package() {
# ./auto/qscriptjstestsuite/${CONFIG}/tst_qscriptjstestsuite.exe -silent >> qscriptjstestsuite.log
# popd
# done
# i686 build failure with yarr:
# export PATH=/mingw32/bin:$PATH
# export PKG_CONFIG_PATH=/mingw32/lib/pkgconfig
# pushd /e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml
# make
# make[4]: Entering directory '/e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml'
# g++ -Wl,-s -shared -Wl,--out-implib,E:/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/lib/libQt5Qml.dll.a -o ../../lib/Qt5Qml.dll object_script.Qt5Qml.Release -lshell32 -LE:/m2/repo/mingw-w64-qt5/src/i686/qtbase/lib -lQt5Network -lQt5Core .obj/release/Qt5Qml_resource_res.o
# ./.obj/release/YarrInterpreter.o:YarrInterpreter.cpp:(.text+0x622): undefined reference to `JSC::Yarr::wordcharCreate()'
# ./.obj/release/YarrInterpreter.o:YarrInterpreter.cpp:(.text+0x693): undefined reference to `JSC::Yarr::newlineCreate()'
# E:/msys64/mingw32/bin/../lib/gcc/i686-w64-mingw32/4.9.1/../../../../i686-w64-mingw32/bin/ld.exe: ./.obj/release/YarrInterpreter.o: bad reloc address 0x12 in section `.text$_ZN3WTF15BumpPointerPool6createEj[__ZN3WTF15BumpPointerPool6createEj]'
# collect2.exe: error: ld returned 1 exit status
# Makefile.Release:534: recipe for target '../../lib/Qt5Qml.dll' failed
# pushd /e/m2/repo/mingw-w64-qt5/src/i686/qtdeclarative/src/qml
# export PATH=/mingw32/bin:$PATH
# export PKG_CONFIG_PATH=/mingw32/lib/pkgconfig
# E:/m2/repo/mingw-w64-qt5/src/i686/qtbase/bin/qmake.exe -o Makefile qml.pro