summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.cpp47
-rw-r--r--config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.pro3
-rw-r--r--config_help.txt3
-rw-r--r--dist/changes-5.9.46
-rw-r--r--doc/global/macros.qdocconf1
-rw-r--r--mkspecs/common/msvc-desktop.conf6
-rw-r--r--mkspecs/common/msvc-version.conf5
-rw-r--r--mkspecs/features/qt_example_installs.prf18
-rw-r--r--mkspecs/features/testcase.prf2
-rw-r--r--mkspecs/win32-g++/qmake.conf9
-rw-r--r--mkspecs/win32-icc/qmake.conf15
-rw-r--r--qmake/library/ioutils.cpp23
-rw-r--r--qmake/library/qmakebuiltins.cpp13
-rw-r--r--qmake/library/qmakeglobals.cpp15
-rw-r--r--qmake/option.cpp5
-rw-r--r--src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp2
-rw-r--r--src/corelib/doc/src/qtcore-index.qdoc7
-rw-r--r--src/corelib/io/qprocess_win.cpp3
-rw-r--r--src/corelib/io/qsettings.cpp5
-rw-r--r--src/gui/configure.json21
-rw-r--r--src/gui/doc/src/qtgui.qdoc5
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.cpp17
-rw-r--r--src/plugins/platformthemes/gtk3/qgtk3theme.h2
-rw-r--r--src/plugins/styles/mac/qmacstyle_mac.mm8
-rw-r--r--src/sql/doc/src/qtsql.qdoc5
-rw-r--r--src/testlib/doc/src/qttest-index.qdoc5
-rw-r--r--src/widgets/kernel/qwidget.cpp3
-rw-r--r--tests/auto/tools/qmakelib/evaltest.cpp46
-rw-r--r--tests/auto/tools/qmakelib/tst_qmakelib.cpp97
-rw-r--r--tests/auto/tools/qmakelib/tst_qmakelib.h5
30 files changed, 264 insertions, 138 deletions
diff --git a/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.cpp b/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.cpp
deleted file mode 100644
index 2dde2914a2..0000000000
--- a/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the config.tests of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <D3D11.h>
-
-int main(int, char**)
-{
- D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;
- (void)qdtd;
- return 0;
-}
diff --git a/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.pro b/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.pro
deleted file mode 100644
index f1e530ab6e..0000000000
--- a/config.tests/win/angle_d3d11_qdtd/angle_d3d11_qdtd.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-SOURCES = angle_d3d11_qdtd.cpp
-CONFIG -= qt
-CONFIG += console
diff --git a/config_help.txt b/config_help.txt
index 9c424391a9..0bb440b556 100644
--- a/config_help.txt
+++ b/config_help.txt
@@ -121,6 +121,9 @@ Build options:
-gcov ................ Instrument with the GCov code coverage tool [no]
-sanitize {address|thread|memory|undefined}
Instrument with the specified compiler sanitizer.
+ Note that some sanitizers cannot be combined;
+ for example, -sanitize address cannot be combined with
+ -sanitize thread.
-c++std <edition> .... Select C++ standard <edition> [c++1z/c++14/c++11]
(Not supported with MSVC)
diff --git a/dist/changes-5.9.4 b/dist/changes-5.9.4
index 0bb768424f..f0cc6007c2 100644
--- a/dist/changes-5.9.4
+++ b/dist/changes-5.9.4
@@ -65,6 +65,12 @@ QtCore
QtNetwork
---------
+ - Bearer Management:
+ * [QTBUG-40332] The nativewifi (Windows) bearer plugin was determined
+ to be causing network interference in the form of system-wide higher
+ latency and has been disabled. The CoreWlan (macOS) plugin has also
+ been disabled.
+
- QUdpSocket:
* [QTBUG-64718] Fixed a regression from Qt 5.9.3 caused by an apparent
Win32 API quirk we triggered when using readDatagram(), resulting in
diff --git a/doc/global/macros.qdocconf b/doc/global/macros.qdocconf
index 5544da425a..dbf8c5cc6a 100644
--- a/doc/global/macros.qdocconf
+++ b/doc/global/macros.qdocconf
@@ -18,6 +18,7 @@ macro.QA = "\\e{Qt Assistant}"
macro.QD = "\\e{Qt Designer}"
macro.QL = "\\e{Qt Linguist}"
macro.QQV = "\\e{Qt QML Viewer}"
+macro.QtVersion = "$QT_VERSION"
macro.param = "\\e"
macro.raisedaster.HTML = "<sup>*</sup>"
macro.rarrow.HTML = "&rarr;"
diff --git a/mkspecs/common/msvc-desktop.conf b/mkspecs/common/msvc-desktop.conf
index 1a38f70205..b7d2eecc82 100644
--- a/mkspecs/common/msvc-desktop.conf
+++ b/mkspecs/common/msvc-desktop.conf
@@ -15,7 +15,7 @@
MAKEFILE_GENERATOR = MSVC.NET
QMAKE_PLATFORM = win32
QMAKE_COMPILER = msvc
-CONFIG += incremental flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
+CONFIG += flat debug_and_release debug_and_release_target precompile_header autogen_precompile_source embed_manifest_dll embed_manifest_exe
DEFINES += UNICODE _UNICODE WIN32
QMAKE_COMPILER_DEFINES += _WIN32
contains(QMAKE_TARGET.arch, x86_64) {
@@ -23,6 +23,7 @@ contains(QMAKE_TARGET.arch, x86_64) {
QMAKE_COMPILER_DEFINES += _WIN64
}
+QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Od
QMAKE_CFLAGS_OPTIMIZE = -O2
QMAKE_CFLAGS_OPTIMIZE_SIZE = -O1
@@ -94,7 +95,8 @@ QMAKE_EXTENSION_SHLIB = dll
QMAKE_PREFIX_STATICLIB =
QMAKE_EXTENSION_STATICLIB = lib
-QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib user32.lib advapi32.lib
+QMAKE_LIBS =
+QMAKE_LIBS_GUI = gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib
QMAKE_LIBS_NETWORK = ws2_32.lib
QMAKE_LIBS_OPENGL = glu32.lib opengl32.lib gdi32.lib user32.lib
QMAKE_LIBS_OPENGL_ES2 = gdi32.lib user32.lib
diff --git a/mkspecs/common/msvc-version.conf b/mkspecs/common/msvc-version.conf
index 395c0535a9..e8c94cf18f 100644
--- a/mkspecs/common/msvc-version.conf
+++ b/mkspecs/common/msvc-version.conf
@@ -86,6 +86,11 @@ greaterThan(QMAKE_MSC_VER, 1909) {
# API is used in direct2d, but also in multimedia, positioning and sensors.
# We can try again with a later version of Visual Studio.
# QMAKE_CXXFLAGS_STRICTCXX = -permissive-
+ # MSVC partially supports the following, but '__cplusplus' definition is set
+ # as for C++98 until MSVC fully conforms with C++14, see
+ # https://developercommunity.visualstudio.com/content/problem/139261/msvc-incorrectly-defines-cplusplus.html
+ # QMAKE_CXXFLAGS_CXX14 = -std:c++14
+ # QMAKE_CXXFLAGS_CXX1Z = -std:c++latest
}
greaterThan(QMAKE_MSC_VER, 1910) {
diff --git a/mkspecs/features/qt_example_installs.prf b/mkspecs/features/qt_example_installs.prf
index 668669e4cd..c9ce926b1a 100644
--- a/mkspecs/features/qt_example_installs.prf
+++ b/mkspecs/features/qt_example_installs.prf
@@ -44,19 +44,25 @@ contains(TEMPLATE, .*app): \
for(ex, EXAMPLE_FILES): \
sourcefiles += $$files($$absolute_path($$ex, $$_PRO_FILE_PWD_))
for(res, RESOURCES) {
- rfile = $$cat($$absolute_path($$res, $$_PRO_FILE_PWD_), lines)
- for(rline, rfile) {
+ !contains(res, \\.qrc$): \
+ next()
+ rfile = $$absolute_path($$res, $$_PRO_FILE_PWD_)
+ rpath = $$dirname(rfile)
+ rcont = $$cat($$rfile, lines)
+ for (rline, rcont) {
resrc = $$replace(rline, ^[ \\t]*<file[^>]*>([^<]+)</file>[ \\t]*$, \\1)
!equals(resrc, $$rline): \
- sourcefiles += $$resrc
+ sourcefiles += $$absolute_path($$resrc, $$rpath)
}
}
for(res, RC_FILE) {
- rfile = $$cat($$absolute_path($$res, $$_PRO_FILE_PWD_), lines)
- for(rline, rfile) {
+ rfile = $$absolute_path($$res, $$_PRO_FILE_PWD_)
+ rpath = $$dirname(rfile)
+ rcont = $$cat($$rfile, lines)
+ for (rline, rcont) {
resrc = $$replace(rline, "^\\d+\\s+ICON\\s+[^\"]*\"([^\"]+)\"\$", \\1)
!equals(resrc, $$rline): \
- sourcefiles += $$resrc
+ sourcefiles += $$absolute_path($$resrc, $$rpath)
}
}
sourcefiles += \
diff --git a/mkspecs/features/testcase.prf b/mkspecs/features/testcase.prf
index 3e1537dde0..8d51c9d028 100644
--- a/mkspecs/features/testcase.prf
+++ b/mkspecs/features/testcase.prf
@@ -44,7 +44,7 @@ unix {
$${type}.commands += $${TEST_TARGET_DIR}/$(QMAKE_TARGET)
} else {
# Windows
- !isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $${TEST_TARGET_DIR}$${QMAKE_DIR_SEP}
+ !isEmpty(TEST_TARGET_DIR): TEST_TARGET_DIR = $$shell_path($$TEST_TARGET_DIR)$${QMAKE_DIR_SEP}
$${type}.commands += $${TEST_TARGET_DIR}$(TARGET)
}
diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf
index d728047765..12f3567754 100644
--- a/mkspecs/win32-g++/qmake.conf
+++ b/mkspecs/win32-g++/qmake.conf
@@ -16,8 +16,11 @@ include(../common/g++-base.conf)
MAKEFILE_GENERATOR = MINGW
QMAKE_PLATFORM = win32 mingw
CONFIG += debug_and_release debug_and_release_target precompile_header
-DEFINES += UNICODE _UNICODE
-QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
+DEFINES += UNICODE _UNICODE WIN32
+QMAKE_COMPILER_DEFINES += __GNUC__ _WIN32
+# can't add 'DEFINES += WIN64' and 'QMAKE_COMPILER_DEFINES += _WIN64' defines for
+# x86_64 platform similar to 'msvc-desktop.conf' toolchain, because, unlike for MSVC,
+# 'QMAKE_TARGET.arch' is inherently unavailable.
QMAKE_CC = $${CROSS_COMPILE}gcc
QMAKE_LEX = flex
@@ -32,6 +35,8 @@ QMAKE_CFLAGS_AESNI = -maes
QMAKE_CFLAGS_SHANI = -msha
QMAKE_CXX = $${CROSS_COMPILE}g++
+QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
+QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
QMAKE_CXXFLAGS_RTTI_ON = -frtti
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
diff --git a/mkspecs/win32-icc/qmake.conf b/mkspecs/win32-icc/qmake.conf
index a539bfba72..cc9c6e7363 100644
--- a/mkspecs/win32-icc/qmake.conf
+++ b/mkspecs/win32-icc/qmake.conf
@@ -4,7 +4,7 @@
# Written for Intel C++ Compiler on Windows / icl 16.0 or higher
#
-# Use the Microsoft (R) C/C++ Optimizing Compiler configuration,
+# Use the Microsoft C/C++ Optimizing Compiler configuration,
# since ICC on Windows pretends to be MSVC
include(../common/msvc-desktop.conf)
@@ -13,11 +13,14 @@ include(../common/msvc-desktop.conf)
QMAKE_COMPILER += intel_icl
+QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
+
QMAKE_CC = icl
-QMAKE_CFLAGS = -nologo -Zm200 /Qprec /Qwd1744,1738,809,3373
-QMAKE_CFLAGS_WARN_ON = -W3 /Qwd673
-QMAKE_CFLAGS_WARN_OFF = -W0 /Qwd673
-QMAKE_CFLAGS_DEBUG = -Od -Zi -MDd
+QMAKE_CFLAGS = -nologo -Zc:wchar_t -Qprec -Zm200 -Qdiag-disable:1744,1738,809,3373
+QMAKE_CFLAGS_WARN_ON = -W3 -Qdiag-disable:673
+QMAKE_CFLAGS_WARN_OFF = -W0 -Qdiag-disable:673
+QMAKE_CFLAGS_DEBUG = $$QMAKE_CFLAGS_OPTIMIZE_DEBUG -Zi -MDd
+QMAKE_CFLAGS_UTF8_SOURCE = -Qoption,cpp,--unicode_source_kind,UTF-8
QMAKE_CFLAGS_LTCG = -Qipo
QMAKE_CFLAGS_DISABLE_LTCG = -Qno-ipo
@@ -46,7 +49,7 @@ QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
QMAKE_CXXFLAGS_CXX11 = -Qstd=c++11
# ICC supports the following but Qt won't compile
#QMAKE_CXXFLAGS_CXX14 = -Qstd=c++14
-#QMAKE_CXXFLAGS_CXX1Z = -Qstd=c++1z
+#QMAKE_CXXFLAGS_CXX1Z = -Qstd=c++17
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
QMAKE_CXXFLAGS_DISABLE_LTCG = $$QMAKE_CFLAGS_DISABLE_LTCG
diff --git a/qmake/library/ioutils.cpp b/qmake/library/ioutils.cpp
index 684bcb9a37..afd41912fe 100644
--- a/qmake/library/ioutils.cpp
+++ b/qmake/library/ioutils.cpp
@@ -66,21 +66,22 @@ IoUtils::FileType IoUtils::fileType(const QString &fileName)
bool IoUtils::isRelativePath(const QString &path)
{
- if (path.startsWith(QLatin1Char('/')))
- return false;
#ifdef QMAKE_BUILTIN_PRFS
if (path.startsWith(QLatin1String(":/")))
return false;
#endif
#ifdef Q_OS_WIN
- if (path.startsWith(QLatin1Char('\\')))
- return false;
- // Unlike QFileInfo, this won't accept a relative path with a drive letter.
- // Such paths result in a royal mess anyway ...
+ // Unlike QFileInfo, this considers only paths with both a drive prefix and
+ // a subsequent (back-)slash absolute:
if (path.length() >= 3 && path.at(1) == QLatin1Char(':') && path.at(0).isLetter()
- && (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\')))
+ && (path.at(2) == QLatin1Char('/') || path.at(2) == QLatin1Char('\\'))) {
return false;
-#endif
+ }
+ // (... unless, of course, they're UNC, which qmake fails on anyway)
+#else
+ if (path.startsWith(QLatin1Char('/')))
+ return false;
+#endif // Q_OS_WIN
return true;
}
@@ -100,6 +101,12 @@ QString IoUtils::resolvePath(const QString &baseDir, const QString &fileName)
return QString();
if (isAbsolutePath(fileName))
return QDir::cleanPath(fileName);
+#ifdef Q_OS_WIN // Add drive to otherwise-absolute path:
+ if (fileName.at(0).unicode() == '/' || fileName.at(0).unicode() == '\\') {
+ Q_ASSERT(isAbsolutePath(baseDir));
+ return QDir::cleanPath(baseDir.left(2) + fileName);
+ }
+#endif // Q_OS_WIN
return QDir::cleanPath(baseDir + QLatin1Char('/') + fileName);
}
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index 759bff314e..83c3d1d643 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -1177,9 +1177,9 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
if (args.count() > 2) {
evalError(fL1S("absolute_path(path[, base]) requires one or two arguments."));
} else {
- QString rstr = QDir::cleanPath(
- QDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory())
- .absoluteFilePath(args.at(0).toQString(m_tmp1)));
+ QString arg = args.at(0).toQString(m_tmp1);
+ QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
+ QString rstr = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
ret << (rstr.isSharedWith(m_tmp1)
? args.at(0)
: args.count() > 1 && rstr.isSharedWith(m_tmp2)
@@ -1191,9 +1191,10 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
if (args.count() > 2) {
evalError(fL1S("relative_path(path[, base]) requires one or two arguments."));
} else {
- QDir baseDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory());
- QString rstr = baseDir.relativeFilePath(baseDir.absoluteFilePath(
- args.at(0).toQString(m_tmp1)));
+ QString arg = args.at(0).toQString(m_tmp1);
+ QString baseDir = args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory();
+ QString absArg = arg.isEmpty() ? baseDir : IoUtils::resolvePath(baseDir, arg);
+ QString rstr = QDir(baseDir).relativeFilePath(absArg);
ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0)));
}
break;
diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp
index b6dc8b20b6..d733d479cf 100644
--- a/qmake/library/qmakeglobals.cpp
+++ b/qmake/library/qmakeglobals.cpp
@@ -68,6 +68,7 @@
#endif
QT_BEGIN_NAMESPACE
+using namespace QMakeInternal; // for IoUtils
#define fL1S(s) QString::fromLatin1(s)
@@ -96,9 +97,9 @@ QString QMakeGlobals::cleanSpec(QMakeCmdLineParserState &state, const QString &s
{
QString ret = QDir::cleanPath(spec);
if (ret.contains(QLatin1Char('/'))) {
- QString absRet = QDir(state.pwd).absoluteFilePath(ret);
+ QString absRet = IoUtils::resolvePath(state.pwd, ret);
if (QFile::exists(absRet))
- ret = QDir::cleanPath(absRet);
+ ret = absRet;
}
return ret;
}
@@ -126,10 +127,10 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
user_template_prefix = arg;
break;
case ArgCache:
- cachefile = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
+ cachefile = args[*pos] = IoUtils::resolvePath(state.pwd, arg);
break;
case ArgQtConf:
- qtconf = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
+ qtconf = args[*pos] = IoUtils::resolvePath(state.pwd, arg);
break;
default:
if (arg.startsWith(QLatin1Char('-'))) {
@@ -259,11 +260,11 @@ QStringList QMakeGlobals::splitPathList(const QString &val) const
{
QStringList ret;
if (!val.isEmpty()) {
- QDir bdir;
+ QString cwd(QDir::currentPath());
const QStringList vals = val.split(dirlist_sep);
ret.reserve(vals.length());
for (const QString &it : vals)
- ret << QDir::cleanPath(bdir.absoluteFilePath(it));
+ ret << IoUtils::resolvePath(cwd, it);
}
return ret;
}
@@ -318,7 +319,7 @@ bool QMakeGlobals::initProperties()
return false;
data = proc.readAll();
#else
- if (FILE *proc = QT_POPEN(QString(QMakeInternal::IoUtils::shellQuote(qmake_abslocation)
+ if (FILE *proc = QT_POPEN(QString(IoUtils::shellQuote(qmake_abslocation)
+ QLatin1String(" -query")).toLocal8Bit(), QT_POPEN_READ)) {
char buff[1024];
while (!feof(proc))
diff --git a/qmake/option.cpp b/qmake/option.cpp
index 9737f1f680..baad644280 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -28,6 +28,7 @@
#include "option.h"
#include "cachekeys.h"
+#include <ioutils.h>
#include <qdir.h>
#include <qregexp.h>
#include <qhash.h>
@@ -38,6 +39,8 @@
QT_BEGIN_NAMESPACE
+using namespace QMakeInternal;
+
EvalHandler Option::evalHandler;
QMakeGlobals *Option::globals;
ProFileCache *Option::proFileCache;
@@ -325,7 +328,7 @@ Option::init(int argc, char **argv)
#endif
if(Option::qmake_mode == Option::QMAKE_GENERATE_NOTHING)
Option::qmake_mode = default_mode(argv0);
- if(!argv0.isEmpty() && !QFileInfo(argv0).isRelative()) {
+ if (!argv0.isEmpty() && IoUtils::isAbsolutePath(argv0)) {
globals->qmake_abslocation = argv0;
} else if (argv0.contains(QLatin1Char('/'))
#ifdef Q_OS_WIN
diff --git a/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
index a1372976ae..ba31972aa1 100644
--- a/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
+++ b/src/corelib/doc/snippets/code/src_corelib_concurrent_qthreadpool.cpp
@@ -55,7 +55,7 @@ class HelloWorldTask : public QRunnable
{
qDebug() << "Hello world from thread" << QThread::currentThread();
}
-}
+};
HelloWorldTask *hello = new HelloWorldTask();
// QThreadPool takes ownership and deletes 'hello' automatically
diff --git a/src/corelib/doc/src/qtcore-index.qdoc b/src/corelib/doc/src/qtcore-index.qdoc
index 9004c018ed..04af0e9416 100644
--- a/src/corelib/doc/src/qtcore-index.qdoc
+++ b/src/corelib/doc/src/qtcore-index.qdoc
@@ -104,17 +104,18 @@
\section1 Licenses and Attributions
Qt Core is available under commercial licenses from \l{The Qt Company}.
- In addition, it is available under the
+ In addition, it is available under free software licenses. Since Qt 5.4,
+ these free software licenses are
\l{GNU Lesser General Public License, version 3}, or
the \l{GNU General Public License, version 2}.
See \l{Qt Licensing} for further details.
Executables on Windows potentially link
against \l{The qtmain Library}. This library is available
- under commercial licenses, and in addition under the
+ under commercial licenses and also under the
\l{BSD 3-clause "New" or "Revised" License}.
- Furthermore Qt Core potentially contains third party
+ Furthermore, Qt Core in Qt \QtVersion may contain third party
modules under following permissive licenses:
\generatelist{groupsbymodule attributions-qtcore}
diff --git a/src/corelib/io/qprocess_win.cpp b/src/corelib/io/qprocess_win.cpp
index 8da6d6b16e..e19d45841f 100644
--- a/src/corelib/io/qprocess_win.cpp
+++ b/src/corelib/io/qprocess_win.cpp
@@ -101,7 +101,8 @@ static void qt_create_pipe(Q_PIPE *pipe, bool isInputPipe)
unsigned int attempts = 1000;
forever {
_snwprintf(pipeName, sizeof(pipeName) / sizeof(pipeName[0]),
- L"\\\\.\\pipe\\qt-%X", QRandomGenerator::global()->generate());
+ L"\\\\.\\pipe\\qt-%lX-%X", long(QCoreApplication::applicationPid()),
+ QRandomGenerator::global()->generate());
DWORD dwOpenMode = FILE_FLAG_OVERLAPPED;
DWORD dwOutputBufferSize = 0;
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index bbc66120b5..4b1b9888d8 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -2366,6 +2366,11 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
limitations is to store the settings using the IniFormat
instead of the NativeFormat.
+ \li On Windows, when the Windows system registry is used, QSettings
+ does not preserve the original type of the value. Therefore,
+ the type of the value might change when a new value is set. For
+ example, a value with type \c REG_EXPAND_SZ will change to \c REG_SZ.
+
\li On \macos and iOS, allKeys() will return some extra keys for global
settings that apply to all applications. These keys can be
read using value() but cannot be changed, only shadowed.
diff --git a/src/gui/configure.json b/src/gui/configure.json
index a7f08f2cc0..dab66fafb4 100644
--- a/src/gui/configure.json
+++ b/src/gui/configure.json
@@ -166,25 +166,20 @@
"label": "Fontconfig",
"test": {
"head": [
- "#include <ft2build.h>",
- "#include FT_FREETYPE_H",
"#include <fontconfig/fontconfig.h>",
"#ifndef FC_RGBA_UNKNOWN",
"# error This version of fontconfig is tool old, it is missing the FC_RGBA_UNKNOWN define",
- "#endif",
- "#if ((FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH) < 20110)",
- "# error This version of freetype is too old.",
"#endif"
],
"main": [
- "FT_Face face = 0;",
"FcPattern *pattern = 0;"
]
},
"sources": [
- { "type": "pkgConfig", "args": "fontconfig freetype2" },
- { "type": "freetype", "libs": "-lfontconfig -lfreetype" }
- ]
+ { "type": "pkgConfig", "args": "fontconfig" },
+ { "type": "freetype", "libs": "-lfontconfig" }
+ ],
+ "use": "freetype"
},
"gbm": {
"label": "GBM",
@@ -612,7 +607,13 @@
"angle_d3d11_qdtd": {
"label": "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT",
"type": "compile",
- "test": "win/angle_d3d11_qdtd"
+ "test": {
+ "include": "d3d11.h",
+ "main": [
+ "D3D11_QUERY_DATA_TIMESTAMP_DISJOINT qdtd;",
+ "(void) qdtd;"
+ ]
+ }
},
"directwrite2": {
"label": "DirectWrite 2",
diff --git a/src/gui/doc/src/qtgui.qdoc b/src/gui/doc/src/qtgui.qdoc
index da3d419735..010659df8c 100644
--- a/src/gui/doc/src/qtgui.qdoc
+++ b/src/gui/doc/src/qtgui.qdoc
@@ -215,12 +215,13 @@
\section1 Licenses and Attributions
Qt GUI is available under commercial licenses from \l{The Qt Company}.
- In addition, it is available under the
+ In addition, it is available under free software licenses. Since Qt 5.4,
+ these free software licenses are
\l{GNU Lesser General Public License, version 3}, or
the \l{GNU General Public License, version 2}.
See \l{Qt Licensing} for further details.
- Furthermore Qt GUI potentially contains third party
+ Furthermore, Qt GUI in Qt \QtVersion may contain third-party
modules under following permissive licenses:
\generatelist{groupsbymodule attributions-qtgui}
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
index 6447776f25..077955eb4e 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.cpp
@@ -153,7 +153,7 @@ bool QGtk3Theme::usePlatformNativeDialog(DialogType type) const
case ColorDialog:
return true;
case FileDialog:
- return true;
+ return useNativeFileDialog();
case FontDialog:
return true;
default:
@@ -167,6 +167,8 @@ QPlatformDialogHelper *QGtk3Theme::createPlatformDialogHelper(DialogType type) c
case ColorDialog:
return new QGtk3ColorDialogHelper;
case FileDialog:
+ if (!useNativeFileDialog())
+ return nullptr;
return new QGtk3FileDialogHelper;
case FontDialog:
return new QGtk3FontDialogHelper;
@@ -185,4 +187,17 @@ QPlatformMenuItem* QGtk3Theme::createPlatformMenuItem() const
return new QGtk3MenuItem;
}
+bool QGtk3Theme::useNativeFileDialog()
+{
+ /* Require GTK3 >= 3.15.5 to avoid running into this bug:
+ * https://bugzilla.gnome.org/show_bug.cgi?id=725164
+ *
+ * While this bug only occurs when using widget-based file dialogs
+ * (native GTK3 dialogs are fine) we have to disable platform file
+ * dialogs entirely since we can't avoid creation of a platform
+ * dialog helper.
+ */
+ return gtk_check_version(3, 15, 5) == 0;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platformthemes/gtk3/qgtk3theme.h b/src/plugins/platformthemes/gtk3/qgtk3theme.h
index 52036680c6..abc5dbfd17 100644
--- a/src/plugins/platformthemes/gtk3/qgtk3theme.h
+++ b/src/plugins/platformthemes/gtk3/qgtk3theme.h
@@ -59,6 +59,8 @@ public:
QPlatformMenuItem* createPlatformMenuItem() const Q_DECL_OVERRIDE;
static const char *name;
+private:
+ static bool useNativeFileDialog();
};
QT_END_NAMESPACE
diff --git a/src/plugins/styles/mac/qmacstyle_mac.mm b/src/plugins/styles/mac/qmacstyle_mac.mm
index db02ab1fe9..1e68fbbc7a 100644
--- a/src/plugins/styles/mac/qmacstyle_mac.mm
+++ b/src/plugins/styles/mac/qmacstyle_mac.mm
@@ -3206,13 +3206,12 @@ void QMacStyle::drawPrimitive(PrimitiveElement pe, const QStyleOption *opt, QPai
}
break;
case PE_IndicatorMenuCheckMark: {
- if (!(opt->state & State_On))
- break;
QColor pc;
- if (opt->state & State_Selected)
+ if (opt->state & State_On)
pc = opt->palette.highlightedText().color();
else
pc = opt->palette.text().color();
+
QCFType<CGColorRef> checkmarkColor = CGColorCreateGenericRGB(static_cast<CGFloat>(pc.redF()),
static_cast<CGFloat>(pc.greenF()),
static_cast<CGFloat>(pc.blueF()),
@@ -4208,8 +4207,7 @@ void QMacStyle::drawControl(ControlElement ce, const QStyleOption *opt, QPainter
const int xp = mi->rect.x() + macItemFrame;
checkmarkOpt.rect = QRect(xp, mi->rect.y() - checkmarkOpt.fontMetrics.descent(), mw, mh);
- checkmarkOpt.state |= State_On; // Always on. Never rendered when off.
- checkmarkOpt.state.setFlag(State_Selected, active);
+ checkmarkOpt.state.setFlag(State_On, active);
checkmarkOpt.state.setFlag(State_Enabled, enabled);
if (widgetSize == QStyleHelper::SizeMini)
checkmarkOpt.state |= State_Mini;
diff --git a/src/sql/doc/src/qtsql.qdoc b/src/sql/doc/src/qtsql.qdoc
index 56d714becf..f0d74739b0 100644
--- a/src/sql/doc/src/qtsql.qdoc
+++ b/src/sql/doc/src/qtsql.qdoc
@@ -54,12 +54,13 @@
\section1 Licenses and Attributions
Qt SQL is available under commercial licenses from \l{The Qt Company}.
- In addition, it is available under the
+ In addition, it is available under free software licenses. Since Qt 5.4,
+ these free software licenses are
\l{GNU Lesser General Public License, version 3}, or
the \l{GNU General Public License, version 2}.
See \l{Qt Licensing} for further details.
- Furthermore Qt SQL potentially contains third party
+ Furthermore, Qt SQL in Qt \QtVersion may contain third party
modules under following permissive licenses:
\generatelist{groupsbymodule attributions-qtsql}
diff --git a/src/testlib/doc/src/qttest-index.qdoc b/src/testlib/doc/src/qttest-index.qdoc
index 36ebfee463..f5b077e8e8 100644
--- a/src/testlib/doc/src/qttest-index.qdoc
+++ b/src/testlib/doc/src/qttest-index.qdoc
@@ -53,12 +53,13 @@
\section1 Licenses and Attributions
Qt Test is available under commercial licenses from \l{The Qt Company}.
- In addition, it is available under the
+ In addition, it is available under free software licenses. Since Qt 5.4,
+ these free software licenses are
\l{GNU Lesser General Public License, version 3}, or
the \l{GNU General Public License, version 2}.
See \l{Qt Licensing} for further details.
- Furthermore Qt Test potentially contains third party
+ Furthermore, Qt Test in Qt \QtVersion may contain third party
modules under following permissive licenses:
\generatelist{groupsbymodule attributions-qttestlib}
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 680c179bd9..a973bee2cd 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1482,7 +1482,8 @@ void QWidgetPrivate::create_sys(WId window, bool initializeWindow, bool destroyO
if (q->windowType() != Qt::Desktop || q->testAttribute(Qt::WA_NativeWindow)) {
win->create();
// Enable nonclient-area events for QDockWidget and other NonClientArea-mouse event processing.
- win->handle()->setFrameStrutEventsEnabled(true);
+ if (QPlatformWindow *platformWindow = win->handle())
+ platformWindow->setFrameStrutEventsEnabled(true);
}
data.window_flags = win->flags();
diff --git a/tests/auto/tools/qmakelib/evaltest.cpp b/tests/auto/tools/qmakelib/evaltest.cpp
index 387a2fb84e..786b9e72f1 100644
--- a/tests/auto/tools/qmakelib/evaltest.cpp
+++ b/tests/auto/tools/qmakelib/evaltest.cpp
@@ -34,6 +34,12 @@
#include <qmakeglobals.h>
#include <qmakeevaluator.h>
+#ifdef Q_OS_WIN
+# define EVAL_DRIVE "R:"
+#else
+# define EVAL_DRIVE
+#endif
+
void tst_qmakelib::addAssignments()
{
QTest::newRow("assignment")
@@ -1599,20 +1605,28 @@ void tst_qmakelib::addReplaceFunctions(const QString &qindir)
<< true;
QTest::newRow("$$absolute_path(): file & path")
- << "VAR = $$absolute_path(dir/file.ext, /root/sub)"
- << "VAR = /root/sub/dir/file.ext"
+ << "VAR = $$absolute_path(dir/file.ext, " EVAL_DRIVE "/root/sub)"
+ << "VAR = " EVAL_DRIVE "/root/sub/dir/file.ext"
<< ""
<< true;
+#ifdef Q_OS_WIN
+ QTest::newRow("$$absolute_path(): driveless file & absolute path")
+ << "VAR = $$absolute_path(/root/sub/dir/file.ext, " EVAL_DRIVE "/other)"
+ << "VAR = " EVAL_DRIVE "/root/sub/dir/file.ext"
+ << ""
+ << true;
+#endif
+
QTest::newRow("$$absolute_path(): absolute file & path")
- << "VAR = $$absolute_path(/root/sub/dir/file.ext, /other)"
- << "VAR = /root/sub/dir/file.ext"
+ << "VAR = $$absolute_path(" EVAL_DRIVE "/root/sub/dir/file.ext, " EVAL_DRIVE "/other)"
+ << "VAR = " EVAL_DRIVE "/root/sub/dir/file.ext"
<< ""
<< true;
QTest::newRow("$$absolute_path(): empty file & path")
- << "VAR = $$absolute_path('', /root/sub)"
- << "VAR = /root/sub"
+ << "VAR = $$absolute_path('', " EVAL_DRIVE "/root/sub)"
+ << "VAR = " EVAL_DRIVE "/root/sub"
<< ""
<< true;
@@ -1634,14 +1648,22 @@ void tst_qmakelib::addReplaceFunctions(const QString &qindir)
<< ""
<< true;
+#ifdef Q_OS_WIN
+ QTest::newRow("$$relative_path(): driveless file & absolute path")
+ << "VAR = $$relative_path(/root/sub/dir/file.ext, " EVAL_DRIVE "/root/sub)"
+ << "VAR = dir/file.ext"
+ << ""
+ << true;
+#endif
+
QTest::newRow("$$relative_path(): absolute file & path")
- << "VAR = $$relative_path(/root/sub/dir/file.ext, /root/sub)"
+ << "VAR = $$relative_path(" EVAL_DRIVE "/root/sub/dir/file.ext, " EVAL_DRIVE "/root/sub)"
<< "VAR = dir/file.ext"
<< ""
<< true;
QTest::newRow("$$relative_path(): empty file & path")
- << "VAR = $$relative_path('', /root/sub)"
+ << "VAR = $$relative_path('', " EVAL_DRIVE "/root/sub)"
<< "VAR = ."
<< ""
<< true;
@@ -2593,20 +2615,20 @@ void tst_qmakelib::addTestFunctions(const QString &qindir)
<< true;
QTest::newRow("touch(): missing target")
- << "touch(/does/not/exist, files/other.txt): OK = 1"
+ << "touch(" EVAL_DRIVE "/does/not/exist, files/other.txt): OK = 1"
<< "OK = UNDEF"
#ifdef Q_OS_WIN
- << "##:1: Cannot open /does/not/exist: The system cannot find the path specified."
+ << "##:1: Cannot open " EVAL_DRIVE "/does/not/exist: The system cannot find the path specified."
#else
<< "##:1: Cannot touch /does/not/exist: No such file or directory."
#endif
<< true;
QTest::newRow("touch(): missing reference")
- << "touch(" + wpath + ", /does/not/exist): OK = 1"
+ << "touch(" + wpath + ", " EVAL_DRIVE "/does/not/exist): OK = 1"
<< "OK = UNDEF"
#ifdef Q_OS_WIN
- << "##:1: Cannot open reference file /does/not/exist: The system cannot find the path specified."
+ << "##:1: Cannot open reference file " EVAL_DRIVE "/does/not/exist: The system cannot find the path specified."
#else
<< "##:1: Cannot stat() reference file /does/not/exist: No such file or directory."
#endif
diff --git a/tests/auto/tools/qmakelib/tst_qmakelib.cpp b/tests/auto/tools/qmakelib/tst_qmakelib.cpp
index b1250f4f1a..4a4b20fe50 100644
--- a/tests/auto/tools/qmakelib/tst_qmakelib.cpp
+++ b/tests/auto/tools/qmakelib/tst_qmakelib.cpp
@@ -42,6 +42,7 @@ void tst_qmakelib::initTestCase()
#endif
m_prop.insert(ProKey("P1"), ProString("prop val"));
m_prop.insert(ProKey("QT_HOST_DATA/get"), ProString(m_indir));
+ m_prop.insert(ProKey("QT_HOST_DATA/src"), ProString(m_indir));
QVERIFY(!m_indir.isEmpty());
QVERIFY(QDir(m_outdir).removeRecursively());
@@ -224,21 +225,99 @@ void tst_qmakelib::pathUtils()
QVERIFY(IoUtils::isRelativePath(fn0));
QString fn1 = "/a/unix/file/path";
- QVERIFY(IoUtils::isAbsolutePath(fn1));
QCOMPARE(IoUtils::pathName(fn1).toString(), QStringLiteral("/a/unix/file/"));
QCOMPARE(IoUtils::fileName(fn1).toString(), QStringLiteral("path"));
+}
-#ifdef Q_OS_WIN
- QString fn0a = "c:file/path";
- QVERIFY(IoUtils::isRelativePath(fn0a));
+void tst_qmakelib::ioUtilRelativity_data()
+{
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<bool>("relative");
- QString fn1a = "c:\\file\\path";
- QVERIFY(IoUtils::isAbsolutePath(fn1a));
+ static const struct {
+ const char *name;
+ const char *path;
+ bool relative;
+ } rows[] = {
+ { "resource", ":/resource",
+#ifdef QMAKE_BUILTIN_PRFS
+ false
+#else
+ true
#endif
+ },
+#ifdef Q_OS_WIN // all the complications:
+ // (except UNC: unsupported)
+ { "drive-abs", "c:/path/to/file", false },
+ { "drive-abs-bs", "c:\\path\\to\\file", false },
+ { "drive-path", "c:path/to/file.txt", true },
+ { "drive-path-bs", "c:path\\to\\file.txt", true },
+ { "rooted", "/Users/qt/bin/true", true },
+ { "rooted-bs", "\\Users\\qt\\bin\\true", true },
+ { "drive-rel", "c:file.txt", true },
+ { "subdir-bs", "path\\to\\file", true },
+#else
+ { "rooted", "/usr/bin/false", false },
+#endif // Q_OS_WIN
+ { "subdir", "path/to/file", true },
+ { "simple", "file.name", true },
+ { "empty", "", true }
+ };
+
+ for (unsigned int i = sizeof(rows) / sizeof(rows[0]); i-- > 0; )
+ QTest::newRow(rows[i].name) << QString::fromLatin1(rows[i].path)
+ << rows[i].relative;
+}
+
+void tst_qmakelib::ioUtilRelativity()
+{
+ QFETCH(QString, path);
+ QFETCH(bool, relative);
+
+ QCOMPARE(IoUtils::isRelativePath(path), relative);
+}
+
+void tst_qmakelib::ioUtilResolve_data()
+{
+ QTest::addColumn<QString>("base");
+ QTest::addColumn<QString>("path");
+ QTest::addColumn<QString>("expect");
+
+ static const struct {
+ const char *name;
+ const char *base;
+ const char *path;
+ const char *expect;
+ } data[] = {
+#ifdef Q_OS_WIN // all the complications:
+ { "drive-drive", "a:/ms/dir", "z:/root/file", "z:/root/file" },
+ { "drive-drive-bs", "a:\\ms\\dir", "z:\\root\\file", "z:/root/file" },
+ { "drive-root", "a:/ms/dir", "/root/file", "a:/root/file" },
+ { "drive-root-bs", "a:\\ms\\dir", "\\root\\file", "a:/root/file" },
+ { "drive-sub", "a:/ms/dir", "sub/file", "a:/ms/dir/sub/file" },
+ { "drive-sub-bs", "a:\\ms\\dir", "sub\\file", "a:/ms/dir/sub/file" },
+ { "drive-rel", "a:/ms/dir", "file.txt", "a:/ms/dir/file.txt" },
+ { "drive-rel-bs", "a:\\ms\\dir", "file.txt", "a:/ms/dir/file.txt" },
+#else
+ { "abs-abs", "/a/unix/dir", "/root/file", "/root/file" },
+ { "abs-sub", "/a/unix/dir", "sub/file", "/a/unix/dir/sub/file" },
+ { "abs-rel", "/a/unix/dir", "file.txt", "/a/unix/dir/file.txt" },
+#endif // Q_OS_WIN
+ };
+
+ for (unsigned i = sizeof(data) / sizeof(data[0]); i-- > 0; )
+ QTest::newRow(data[i].name) << QString::fromLatin1(data[i].base)
+ << QString::fromLatin1(data[i].path)
+ << QString::fromLatin1(data[i].expect);
+}
+
+void tst_qmakelib::ioUtilResolve()
+{
+ QFETCH(QString, base);
+ QFETCH(QString, path);
+ QFETCH(QString, expect);
- QString fnbase = "/another/dir";
- QCOMPARE(IoUtils::resolvePath(fnbase, fn0), QStringLiteral("/another/dir/file/path"));
- QCOMPARE(IoUtils::resolvePath(fnbase, fn1), QStringLiteral("/a/unix/file/path"));
+ QCOMPARE(IoUtils::resolvePath(base, path), expect);
}
void QMakeTestHandler::print(const QString &fileName, int lineNo, int type, const QString &msg)
diff --git a/tests/auto/tools/qmakelib/tst_qmakelib.h b/tests/auto/tools/qmakelib/tst_qmakelib.h
index e75dedb7ec..acfeb43ecd 100644
--- a/tests/auto/tools/qmakelib/tst_qmakelib.h
+++ b/tests/auto/tools/qmakelib/tst_qmakelib.h
@@ -48,7 +48,12 @@ private slots:
void quoteArgUnix();
void quoteArgWin_data();
void quoteArgWin();
+
void pathUtils();
+ void ioUtilRelativity_data();
+ void ioUtilRelativity();
+ void ioUtilResolve_data();
+ void ioUtilResolve();
void proString();
void proStringList();