summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-01-07 01:00:08 +0100
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-01-07 01:00:08 +0100
commitc497f79ad460afeb76eb1ade0de86d46bbb11a91 (patch)
tree10ebe88ea0c3566c2bd33968bbd4401122c9b689
parent8cf812231405e011b422a1505d9a219618fe5cee (diff)
parentecdccce8e468784e050b65052da193bb40e2d9b9 (diff)
Merge remote-tracking branch 'origin/5.12' into dev
-rw-r--r--mkspecs/features/data/dumpvcvars.bat44
-rw-r--r--mkspecs/features/toolchain.prf347
-rw-r--r--mkspecs/winrt-arm-msvc2015/qmake.conf1
-rw-r--r--mkspecs/winrt-arm-msvc2017/qmake.conf1
-rw-r--r--mkspecs/winrt-x64-msvc2015/qmake.conf1
-rw-r--r--mkspecs/winrt-x64-msvc2017/qmake.conf1
-rw-r--r--mkspecs/winrt-x86-msvc2015/qmake.conf1
-rw-r--r--mkspecs/winrt-x86-msvc2017/qmake.conf1
-rw-r--r--qmake/Makefile.unix6
-rw-r--r--qmake/Makefile.unix.win322
-rw-r--r--qmake/doc/src/qmake-manual.qdoc11
-rw-r--r--qmake/generators/makefile.cpp19
-rw-r--r--qmake/generators/makefile.h1
-rw-r--r--qmake/generators/unix/unixmake2.cpp2
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp201
-rw-r--r--qmake/generators/win32/winmakefile.cpp2
-rw-r--r--qmake/library/qmakebuiltins.cpp40
-rw-r--r--qmake/library/registry.cpp (renamed from qmake/generators/win32/registry.cpp)0
-rw-r--r--qmake/library/registry_p.h (renamed from qmake/generators/win32/registry_p.h)0
-rw-r--r--src/android/templates/build.gradle2
-rw-r--r--src/corelib/global/qendian.h4
-rw-r--r--src/corelib/kernel/qcore_mac_objc.mm7
-rw-r--r--src/corelib/kernel/qmetatype.cpp6
-rw-r--r--src/network/ssl/qdtls.cpp1
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp11
-rw-r--r--tests/auto/corelib/kernel/qtimer/BLACKLIST2
-rw-r--r--tests/auto/tools/qmakelib/qmakelib.pro2
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp134
28 files changed, 389 insertions, 461 deletions
diff --git a/mkspecs/features/data/dumpvcvars.bat b/mkspecs/features/data/dumpvcvars.bat
new file mode 100644
index 0000000000..4721da2e39
--- /dev/null
+++ b/mkspecs/features/data/dumpvcvars.bat
@@ -0,0 +1,44 @@
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+::
+:: Copyright (C) 2018 The Qt Company Ltd.
+:: Contact: https://www.qt.io/licensing/
+::
+:: This file is part of the tools applications of the Qt Toolkit.
+::
+:: $QT_BEGIN_LICENSE:GPL-EXCEPT$
+:: 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 General Public License Usage
+:: Alternatively, this file may be used under the terms of the GNU
+:: General Public License version 3 as published by the Free Software
+:: Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+:: 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-3.0.html.
+::
+:: $QT_END_LICENSE$
+::
+:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+@echo off
+
+REM We clear INCLUDE and LIB, because we want to obtain pristine values.
+REM PATH cannot be cleared, because then the script does not even run,
+REM and it would be counterproductive anyway (see toolchain.prf).
+set INCLUDE=
+set LIB=
+
+call %* || exit 1
+REM VS2015 does not set errorlevel in case of failure.
+if "%INCLUDE%" == "" exit 1
+
+echo =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
+echo %INCLUDE%
+echo %LIB%
+echo %PATH%
diff --git a/mkspecs/features/toolchain.prf b/mkspecs/features/toolchain.prf
index 1a76e50b49..2a7cbabc54 100644
--- a/mkspecs/features/toolchain.prf
+++ b/mkspecs/features/toolchain.prf
@@ -1,12 +1,11 @@
-
-defineReplace(qtMakeExpand) {
- out = "$$1"
- for(ever) {
- m = $$replace(out, ".*\\$\\(EXPORT_([^)]+)\\).*", \\1)
- equals(m, $$out): \
- return($$out)
- out = $$replace(out, "\\$\\(EXPORT_$$m\\)", $$eval($$m))
- }
+defineTest(qtToolchainError) {
+ msg = \
+ $$1 \
+ "===================" \
+ $$2 \
+ "===================" \
+ $$3
+ error($$join(msg, $$escape_expand(\\n)))
}
defineTest(qtCompilerError) {
@@ -16,13 +15,8 @@ defineTest(qtCompilerError) {
what = " host"
else: \
what = " target"
- msg = \
- "Cannot run$$what compiler '$$1'. Output:" \
- "===================" \
- $$2 \
- "===================" \
- "Maybe you forgot to setup the environment?"
- error($$join(msg, $$escape_expand(\\n)))
+ qtToolchainError("Cannot run$$what compiler '$$1'. Output:", $$2, \
+ "Maybe you forgot to setup the environment?")
}
cross_compile:host_build: \
@@ -30,6 +24,142 @@ cross_compile:host_build: \
else: \
target_prefix = QMAKE_CXX
+#
+# Determine and cache the compiler version
+#
+
+defineReplace(qtVariablesFromMSVC) {
+ ret = $$system("$$1 -nologo -E $$2 $$system_quote($$PWD/data/macros.cpp) 2>NUL", lines, ec)
+ !equals(ec, 0): qtCompilerError($$1, $$ret)
+ return($$ret)
+}
+
+defineReplace(qtVariablesFromGCC) {
+ ret = $$system("$$1 -E $$system_quote($$PWD/data/macros.cpp) \
+ 2>$$QMAKE_SYSTEM_NULL_DEVICE", lines, ec)
+ !equals(ec, 0): qtCompilerError($$1, $$ret)
+ return($$ret)
+}
+
+isEmpty($${target_prefix}.COMPILER_MACROS) {
+ msvc {
+ clang_cl {
+ # We need to obtain the cl.exe version first
+ vars = $$qtVariablesFromMSVC(cl)
+ for (v, vars) {
+ isEmpty(v)|contains(v, $${LITERAL_HASH}.*): next()
+ eval($$v)
+ }
+ isEmpty(QMAKE_MSC_FULL_VER): error("Could not determine the Visual Studio version")
+
+ QMAKE_CFLAGS_MSVC_COMPAT = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", \
+ "-fms-compatibility-version=\\1.\\2.\\3")
+ cache($${target_prefix}.QMAKE_CFLAGS_MSVC_COMPAT, set stash, QMAKE_CFLAGS_MSVC_COMPAT)
+ $${target_prefix}.COMPILER_MACROS += QMAKE_CFLAGS_MSVC_COMPAT
+ vars = $$qtVariablesFromMSVC($$QMAKE_CXX, $$QMAKE_CFLAGS_MSVC_COMPAT)
+ } else {
+ vars = $$qtVariablesFromMSVC($$QMAKE_CXX)
+ }
+ } else: gcc|ghs {
+ vars = $$qtVariablesFromGCC($$QMAKE_CXX)
+ }
+ for (v, vars) {
+ !contains(v, "[A-Z_]+ = .*"): next()
+ # Set both <varname> for the outer scope ...
+ eval($$v)
+ v ~= s/ .*//
+ isEmpty($$v): error("Compiler produced empty value for $${v}.")
+ # ... and save QMAKE_(HOST_)?CXX.<varname> in the cache.
+ cache($${target_prefix}.$$v, set stash, $$v)
+ $${target_prefix}.COMPILER_MACROS += $$v
+ }
+ cache($${target_prefix}.COMPILER_MACROS, set stash)
+} else {
+ # load from the cache
+ for (i, $${target_prefix}.COMPILER_MACROS): \
+ $$i = $$eval($${target_prefix}.$$i)
+}
+
+# Populate QMAKE_COMPILER_DEFINES and some compatibility variables.
+# The $$format_number() calls strip leading zeros to avoid misinterpretation as octal.
+QMAKE_COMPILER_DEFINES += __cplusplus=$$QT_COMPILER_STDCXX
+!isEmpty(QMAKE_MSC_VER): \
+ QMAKE_COMPILER_DEFINES += _MSC_VER=$$QMAKE_MSC_VER _MSC_FULL_VER=$$QMAKE_MSC_FULL_VER
+!isEmpty(QMAKE_ICC_VER): \
+ QMAKE_COMPILER_DEFINES += __INTEL_COMPILER=$$QMAKE_ICC_VER __INTEL_COMPILER_UPDATE=$$QMAKE_ICC_UPDATE_VER
+!isEmpty(QMAKE_APPLE_CC): \
+ QMAKE_COMPILER_DEFINES += __APPLE_CC__=$$QMAKE_APPLE_CC
+!isEmpty(QMAKE_APPLE_CLANG_MAJOR_VERSION): \
+ QMAKE_COMPILER_DEFINES += __clang__ \
+ __clang_major__=$$QMAKE_APPLE_CLANG_MAJOR_VERSION \
+ __clang_minor__=$$QMAKE_APPLE_CLANG_MINOR_VERSION \
+ __clang_patchlevel__=$$QMAKE_APPLE_CLANG_PATCH_VERSION
+!isEmpty(QMAKE_CLANG_MAJOR_VERSION): \
+ QMAKE_COMPILER_DEFINES += __clang__ \
+ __clang_major__=$$QMAKE_CLANG_MAJOR_VERSION \
+ __clang_minor__=$$QMAKE_CLANG_MINOR_VERSION \
+ __clang_patchlevel__=$$QMAKE_CLANG_PATCH_VERSION
+!isEmpty(QMAKE_GCC_MAJOR_VERSION): \
+ QMAKE_COMPILER_DEFINES += \
+ __GNUC__=$$QMAKE_GCC_MAJOR_VERSION \
+ __GNUC_MINOR__=$$QMAKE_GCC_MINOR_VERSION \
+ __GNUC_PATCHLEVEL__=$$QMAKE_GCC_PATCH_VERSION
+!isEmpty(QMAKE_GHS_VERSION): \
+ QMAKE_COMPILER_DEFINES += __ghs__ __GHS_VERSION_NUMBER=$$QMAKE_GHS_VERSION
+
+QMAKE_CFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
+
+clang_cl|intel_icl {
+ include(../common/msvc-based-version.conf)
+} else: msvc {
+ include(../common/msvc-version.conf)
+}
+
+#
+# Determine and cache the default search paths
+#
+
+defineReplace(qtMakeExpand) {
+ out = "$$1"
+ for(ever) {
+ m = $$replace(out, ".*\\$\\(EXPORT_([^)]+)\\).*", \\1)
+ equals(m, $$out): \
+ return($$out)
+ out = $$replace(out, "\\$\\(EXPORT_$$m\\)", $$eval($$m))
+ }
+}
+
+defineReplace(qtSplitPathList) {
+ paths = $$split(1, $$QMAKE_DIRLIST_SEP)
+ ret =
+ for (p, paths): \
+ ret += $$clean_path($$p)
+ return($$ret)
+}
+
+defineReplace(qtNmakePathList) {
+ paths =
+ for (p, 1): \
+ paths += $$shell_path($$p)
+ paths ~= s,$${LITERAL_HASH},^$${LITERAL_HASH},g
+ paths ~= s,\\$,\$\$,g
+ return($$join(paths, $$QMAKE_DIRLIST_SEP))
+}
+
+msvc {
+ arch = $$lower($$VCPROJ_ARCH)
+ equals(arch, x64): \ # may be "win32" or undefined
+ arch = amd64
+ else: !equals(arch, arm):!equals(arch, arm64): \ # may be "win32" or undefined
+ arch = x86
+ # Consider only WinRT and ARM64 desktop builds to be cross-builds -
+ # the host is assumed to be Intel and capable of running the target
+ # executables (so building for x64 on x86 will break).
+ winrt|equals(arch, arm64): \
+ CONFIG += msvc_cross
+}
+
isEmpty($${target_prefix}.INCDIRS) {
#
# Get default include and library paths from compiler
@@ -169,9 +299,89 @@ isEmpty($${target_prefix}.INCDIRS) {
}
}
}
+ } else: msvc_cross {
+ # Use a batch file, because %VAR% in the system() call expands to
+ # the pre-script-call value, and !VAR! cannot be enabled outside
+ # a batch file without invoking another shell instance.
+ cmd = $$system_quote($$system_path($$PWD/data/dumpvcvars.bat))
+
+ hostArch = $$QMAKE_HOST.arch
+ equals(hostArch, x86_64): \
+ hostArch = amd64
+ !equals(arch, $$hostArch): \
+ arch = $${hostArch}_$$arch
+
+ isEmpty(MSVC_VER): \
+ error("Mkspec does not specify MSVC_VER. Cannot continue.")
+ versionAtLeast(MSVC_VER, 15.0) {
+ dir = $$(VSINSTALLDIR)
+ isEmpty(dir): \
+ dir = $$read_registry(HKLM, \
+ "Software\\Microsoft\\VisualStudio\\SxS\\VS7\\$$MSVC_VER", 32)
+ isEmpty(dir): \
+ error("Failed to find the Visual Studio installation directory.")
+ cmd += $$system_quote($$dir\\VC\\Auxiliary\\Build\\vcvarsall.bat) $$arch
+ } else {
+ dir = $$(VCINSTALLDIR)
+ isEmpty(dir): \
+ dir = $$read_registry(HKLM, \
+ "Software\\Microsoft\\VisualStudio\\$$MSVC_VER\\Setup\\VC\\ProductDir", 32)
+ isEmpty(dir): \
+ error("Failed to find the Visual C installation directory.")
+ cmd += $$system_quote($$dir\\vcvarsall.bat) $$arch
+ }
+ winrt: cmd += store
+
+ isEmpty(WINSDK_VER): \
+ error("Mkspec does not specify WINSDK_VER. Cannot continue.")
+ # We prefer the environment variable, because that may work around
+ # a broken registry entry after uninstalling a newer SDK.
+ # However, we do that only if the major+minor SDK version matches
+ # the one requested by the mkspec, as we might be building for a
+ # newer target than the host.
+ winsdk_ver = $$(WindowsSDKVersion)
+ !isEmpty(winsdk_ver) {
+ winsdk_ver ~= s,\\\\$,, # Work around SDK breakage.
+ !equals(WINSDK_VER, $$replace(winsdk_ver, ^(\\d+\\.\\d+).*$, \\1)): \
+ winsdk_ver =
+ }
+ !isEmpty(winsdk_ver) {
+ cmd += $$winsdk_ver
+ } else {
+ winsdk_ver = $$read_registry(HKLM, \
+ "Software\\Microsoft\\Microsoft SDKs\\Windows\\v$$WINSDK_VER\\ProductVersion", 32)
+ isEmpty(winsdk_ver): \
+ error("Windows SDK $$WINSDK_VER requested by mkspec is not installed. Cannot continue.")
+ cmd += $${winsdk_ver}.0
+ }
+
+ output = $$system("$$cmd 2>&1", lines, ec)
+ !equals(ec, 0): \
+ qtToolchainError("SDK setup script failed. Output:", $$output, \
+ "Command was: $$cmd")
+ lines = $$output
+ for(ever) {
+ isEmpty(lines): \
+ break()
+ line = $$take_first(lines)
+ equals(line, "=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+="): \
+ break()
+ }
+ !count(lines, 3): \
+ qtToolchainError("SDK setup script returned unexpected output:", $$output, \
+ "Command was: $$cmd")
+
+ # These contain only paths for the target.
+ QMAKE_DEFAULT_INCDIRS = $$qtSplitPathList($$member(lines, 0))
+ QMAKE_DEFAULT_LIBDIRS = $$qtSplitPathList($$member(lines, 1))
+ # PATH is inherently for the host, and paths that are not shadowed
+ # by vcvarsall.bat are assumed to contain only tools that work for
+ # both host and target builds.
+ QMAKE_DEFAULT_PATH = $$qtSplitPathList($$member(lines, 2))
+ # We de-duplicate, because the script just prepends to the paths for
+ # the host, some of which are identical to the ones for the target.
+ QMAKE_DEFAULT_PATH = $$unique(QMAKE_DEFAULT_PATH)
} else: msvc {
- # This doesn't differentiate between host and target,
- # but neither do the compilers.
LIB = $$getenv("LIB")
QMAKE_DEFAULT_LIBDIRS = $$split(LIB, $$QMAKE_DIRLIST_SEP)
INCLUDE = $$getenv("INCLUDE")
@@ -188,101 +398,22 @@ isEmpty($${target_prefix}.INCDIRS) {
cache($${target_prefix}.INCDIRS, set stash, QMAKE_DEFAULT_INCDIRS)
!isEmpty(QMAKE_DEFAULT_LIBDIRS): \
cache($${target_prefix}.LIBDIRS, set stash, QMAKE_DEFAULT_LIBDIRS)
+ !isEmpty(QMAKE_DEFAULT_PATH): \
+ cache($${target_prefix}.PATH, set stash, QMAKE_DEFAULT_PATH)
} else {
QMAKE_DEFAULT_INCDIRS = $$eval($${target_prefix}.INCDIRS)
QMAKE_DEFAULT_LIBDIRS = $$eval($${target_prefix}.LIBDIRS)
+ QMAKE_DEFAULT_PATH = $$eval($${target_prefix}.PATH)
}
-#
-# Determine and cache the compiler version
-#
-
-defineReplace(qtVariablesFromMSVC) {
- ret = $$system("$$1 -nologo -E $$2 $$system_quote($$PWD/data/macros.cpp) 2>NUL", lines, ec)
- !equals(ec, 0): qtCompilerError($$1, $$ret)
- return($$ret)
-}
-
-defineReplace(qtVariablesFromGCC) {
- ret = $$system("$$1 -E $$system_quote($$PWD/data/macros.cpp) \
- 2>$$QMAKE_SYSTEM_NULL_DEVICE", lines, ec)
- !equals(ec, 0): qtCompilerError($$1, $$ret)
- return($$ret)
-}
-
-isEmpty($${target_prefix}.COMPILER_MACROS) {
- msvc {
- clang_cl {
- # We need to obtain the cl.exe version first
- vars = $$qtVariablesFromMSVC(cl)
- for (v, vars) {
- isEmpty(v)|contains(v, $${LITERAL_HASH}.*): next()
- eval($$v)
- }
- isEmpty(QMAKE_MSC_FULL_VER): error("Could not determine the Visual Studio version")
-
- QMAKE_CFLAGS_MSVC_COMPAT = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", \
- "-fms-compatibility-version=\\1.\\2.\\3")
- cache($${target_prefix}.QMAKE_CFLAGS_MSVC_COMPAT, set stash, QMAKE_CFLAGS_MSVC_COMPAT)
- $${target_prefix}.COMPILER_MACROS += QMAKE_CFLAGS_MSVC_COMPAT
- vars = $$qtVariablesFromMSVC($$QMAKE_CXX, $$QMAKE_CFLAGS_MSVC_COMPAT)
- } else {
- vars = $$qtVariablesFromMSVC($$QMAKE_CXX)
- }
- } else: gcc|ghs {
- vars = $$qtVariablesFromGCC($$QMAKE_CXX)
- }
- for (v, vars) {
- !contains(v, "[A-Z_]+ = .*"): next()
- # Set both <varname> for the outer scope ...
- eval($$v)
- v ~= s/ .*//
- isEmpty($$v): error("Compiler produced empty value for $${v}.")
- # ... and save QMAKE_(HOST_)?CXX.<varname> in the cache.
- cache($${target_prefix}.$$v, set stash, $$v)
- $${target_prefix}.COMPILER_MACROS += $$v
- }
- cache($${target_prefix}.COMPILER_MACROS, set stash)
-} else {
- # load from the cache
- for (i, $${target_prefix}.COMPILER_MACROS): \
- $$i = $$eval($${target_prefix}.$$i)
+msvc_cross {
+ qmake_inc_exp.name = INCLUDE
+ qmake_inc_exp.value = $$qtNmakePathList($$QMAKE_DEFAULT_INCDIRS)
+ qmake_lib_exp.name = LIB
+ qmake_lib_exp.value = $$qtNmakePathList($$QMAKE_DEFAULT_LIBDIRS)
+ qmake_path_exp.name = PATH
+ qmake_path_exp.value = $$qtNmakePathList($$QMAKE_DEFAULT_PATH)
+ QMAKE_EXPORTED_VARIABLES += qmake_inc_exp qmake_lib_exp qmake_path_exp
}
unset(target_prefix)
-
-# Populate QMAKE_COMPILER_DEFINES and some compatibility variables.
-# The $$format_number() calls strip leading zeros to avoid misinterpretation as octal.
-QMAKE_COMPILER_DEFINES += __cplusplus=$$QT_COMPILER_STDCXX
-!isEmpty(QMAKE_MSC_VER): \
- QMAKE_COMPILER_DEFINES += _MSC_VER=$$QMAKE_MSC_VER _MSC_FULL_VER=$$QMAKE_MSC_FULL_VER
-!isEmpty(QMAKE_ICC_VER): \
- QMAKE_COMPILER_DEFINES += __INTEL_COMPILER=$$QMAKE_ICC_VER __INTEL_COMPILER_UPDATE=$$QMAKE_ICC_UPDATE_VER
-!isEmpty(QMAKE_APPLE_CC): \
- QMAKE_COMPILER_DEFINES += __APPLE_CC__=$$QMAKE_APPLE_CC
-!isEmpty(QMAKE_APPLE_CLANG_MAJOR_VERSION): \
- QMAKE_COMPILER_DEFINES += __clang__ \
- __clang_major__=$$QMAKE_APPLE_CLANG_MAJOR_VERSION \
- __clang_minor__=$$QMAKE_APPLE_CLANG_MINOR_VERSION \
- __clang_patchlevel__=$$QMAKE_APPLE_CLANG_PATCH_VERSION
-!isEmpty(QMAKE_CLANG_MAJOR_VERSION): \
- QMAKE_COMPILER_DEFINES += __clang__ \
- __clang_major__=$$QMAKE_CLANG_MAJOR_VERSION \
- __clang_minor__=$$QMAKE_CLANG_MINOR_VERSION \
- __clang_patchlevel__=$$QMAKE_CLANG_PATCH_VERSION
-!isEmpty(QMAKE_GCC_MAJOR_VERSION): \
- QMAKE_COMPILER_DEFINES += \
- __GNUC__=$$QMAKE_GCC_MAJOR_VERSION \
- __GNUC_MINOR__=$$QMAKE_GCC_MINOR_VERSION \
- __GNUC_PATCHLEVEL__=$$QMAKE_GCC_PATCH_VERSION
-!isEmpty(QMAKE_GHS_VERSION): \
- QMAKE_COMPILER_DEFINES += __ghs__ __GHS_VERSION_NUMBER=$$QMAKE_GHS_VERSION
-
-QMAKE_CFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
-QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
-
-clang_cl|intel_icl {
- include(../common/msvc-based-version.conf)
-} else: msvc {
- include(../common/msvc-version.conf)
-}
diff --git a/mkspecs/winrt-arm-msvc2015/qmake.conf b/mkspecs/winrt-arm-msvc2015/qmake.conf
index 8bca6f4af8..bc113d4954 100644
--- a/mkspecs/winrt-arm-msvc2015/qmake.conf
+++ b/mkspecs/winrt-arm-msvc2015/qmake.conf
@@ -15,6 +15,5 @@ QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib One
VCPROJ_ARCH = ARM
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = arm
diff --git a/mkspecs/winrt-arm-msvc2017/qmake.conf b/mkspecs/winrt-arm-msvc2017/qmake.conf
index bf571d620c..1160d5766d 100644
--- a/mkspecs/winrt-arm-msvc2017/qmake.conf
+++ b/mkspecs/winrt-arm-msvc2017/qmake.conf
@@ -15,6 +15,5 @@ QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib One
VCPROJ_ARCH = ARM
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = arm
diff --git a/mkspecs/winrt-x64-msvc2015/qmake.conf b/mkspecs/winrt-x64-msvc2015/qmake.conf
index d503399e3c..d1d1eb6513 100644
--- a/mkspecs/winrt-x64-msvc2015/qmake.conf
+++ b/mkspecs/winrt-x64-msvc2015/qmake.conf
@@ -15,6 +15,5 @@ QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib One
VCPROJ_ARCH = x64
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x64
diff --git a/mkspecs/winrt-x64-msvc2017/qmake.conf b/mkspecs/winrt-x64-msvc2017/qmake.conf
index cb2209fa23..dce896bd47 100644
--- a/mkspecs/winrt-x64-msvc2017/qmake.conf
+++ b/mkspecs/winrt-x64-msvc2017/qmake.conf
@@ -15,6 +15,5 @@ QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib One
VCPROJ_ARCH = x64
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x64
diff --git a/mkspecs/winrt-x86-msvc2015/qmake.conf b/mkspecs/winrt-x86-msvc2015/qmake.conf
index 37ce0e5525..06f059b600 100644
--- a/mkspecs/winrt-x86-msvc2015/qmake.conf
+++ b/mkspecs/winrt-x86-msvc2015/qmake.conf
@@ -14,6 +14,5 @@ QMAKE_LFLAGS += /SAFESEH /MACHINE:X86 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = Win32
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x86
diff --git a/mkspecs/winrt-x86-msvc2017/qmake.conf b/mkspecs/winrt-x86-msvc2017/qmake.conf
index 3c9506bbad..94fb68f6c0 100644
--- a/mkspecs/winrt-x86-msvc2017/qmake.conf
+++ b/mkspecs/winrt-x86-msvc2017/qmake.conf
@@ -14,6 +14,5 @@ QMAKE_LFLAGS += /SAFESEH /MACHINE:X86 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = Win32
WINSDK_VER = 10.0
-WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in
WINRT_MANIFEST.architecture = x86
diff --git a/qmake/Makefile.unix b/qmake/Makefile.unix
index 9e0b51ba55..0f69b6b487 100644
--- a/qmake/Makefile.unix
+++ b/qmake/Makefile.unix
@@ -192,6 +192,9 @@ qmakeevaluator.o: $(QMKLIBSRC)/qmakeevaluator.cpp
qmakebuiltins.o: $(QMKLIBSRC)/qmakebuiltins.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $<
+registry.o: $(QMKLIBSRC)/registry.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $<
+
project.o: $(QMKSRC)/project.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $<
@@ -225,9 +228,6 @@ unixmake.o: $(QMKSRC)/generators/unix/unixmake.cpp
unixmake2.o: $(QMKSRC)/generators/unix/unixmake2.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $<
-registry.o: $(QMKSRC)/generators/win32/registry.cpp
- $(CXX) -c -o $@ $(CXXFLAGS) $<
-
winmakefile.o: $(QMKSRC)/generators/win32/winmakefile.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $<
diff --git a/qmake/Makefile.unix.win32 b/qmake/Makefile.unix.win32
index 48efd6f030..faf09ac11e 100644
--- a/qmake/Makefile.unix.win32
+++ b/qmake/Makefile.unix.win32
@@ -18,4 +18,4 @@ QTSRCS = \
$(SOURCE_PATH)/src/corelib/io/qsettings_win.cpp \
$(SOURCE_PATH)/src/corelib/tools/qlocale_win.cpp \
$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp \
- $(SOURCE_PATH)/qmake/generators/win32/registry.cpp
+ $(SOURCE_PATH)/qmake/library/registry.cpp
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index f99ebbec00..3601fe7748 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -3280,6 +3280,17 @@
Returns the \c string with every special regular expression character
escaped with a backslash. This function is a wrapper around QRegExp::escape.
+ \section2 read_registry(tree, key[, flag])
+
+ Returns the value of registry key \c key inside the tree \c tree.
+
+ Only the trees \c HKEY_CURRENT_USER (\c HKCU) and \c HKEY_LOCAL_MACHINE
+ (\c HKLM) are supported.
+
+ The \c flag may be \c WOW64_32KEY (\c 32) or \c WOW64_64KEY (\c 64).
+
+ \note This function is available only on Windows hosts.
+
\section2 relative_path(filePath[, base])
Returns the path to \c filePath relative to \c base.
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 9e2f449515..3a71f9d3de 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -2212,6 +2212,25 @@ MakefileGenerator::writeExtraVariables(QTextStream &t)
}
}
+// This is a more powerful alternative to the above function.
+// It's meant to be internal, as one can make quite a mess with it.
+void
+MakefileGenerator::writeExportedVariables(QTextStream &t)
+{
+ const auto &vars = project->values("QMAKE_EXPORTED_VARIABLES");
+ if (vars.isEmpty())
+ return;
+ for (const auto &exp : vars) {
+ const ProString &name = project->first(ProKey(exp + ".name"));
+ const ProString &value = project->first(ProKey(exp + ".value"));
+ if (!value.isEmpty())
+ t << name << " = " << value << endl;
+ else
+ t << name << " =\n";
+ }
+ t << endl;
+}
+
bool
MakefileGenerator::writeDummyMakefile(QTextStream &t)
{
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index b5c150e1cb..0c30e74a1d 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -79,6 +79,7 @@ protected:
void writeHeader(QTextStream &t);
void writeSubDirs(QTextStream &t);
void writeMakeQmake(QTextStream &t, bool noDummyQmakeAll = false);
+ void writeExportedVariables(QTextStream &t);
void writeExtraVariables(QTextStream &t);
void writeExtraTargets(QTextStream &t);
void writeExtraCompilerTargets(QTextStream &t);
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 4a6b5c8579..fa283d0291 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -180,6 +180,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
ProStringList &bundledFiles = project->values("QMAKE_BUNDLED_FILES");
+ writeExportedVariables(t);
+
t << "####### Compiler, tools and options\n\n";
t << "CC = " << var("QMAKE_CC") << endl;
t << "CXX = " << var("QMAKE_CXX") << endl;
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index 548d2e8575..aa3d389b67 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -34,23 +34,10 @@
#include <qdiriterator.h>
#include <qset.h>
-#include <registry_p.h>
-
#include <time.h>
QT_BEGIN_NAMESPACE
-static QString nmakePathList(const QStringList &list)
-{
- QStringList pathList;
- pathList.reserve(list.size());
- for (const QString &path : list)
- pathList.append(QDir::cleanPath(path));
-
- return QDir::toNativeSeparators(pathList.join(QLatin1Char(';')))
- .replace('#', QLatin1String("^#")).replace('$', QLatin1String("$$"));
-}
-
NmakeMakefileGenerator::NmakeMakefileGenerator() : usePCH(false), usePCHC(false)
{
@@ -70,194 +57,6 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
if(Option::mkfile::do_stub_makefile)
return MakefileGenerator::writeStubMakefile(t);
#endif
- if (!project->isHostBuild()) {
- const QString msvcVer = project->first("MSVC_VER").toQString();
- if (msvcVer.isEmpty()) {
- fprintf(stderr, "Mkspec does not specify MSVC_VER. Cannot continue.\n");
- return false;
- }
-
- bool winrtBuild = false;
- bool crossPlatformDesktopBuild = false;
- QString arch = project->first("VCPROJ_ARCH").toQString().toLower();
- if (project->isActiveConfig(QStringLiteral("winrt"))) {
- winrtBuild = true;
-
- // Only add explicit support for arm64 cross-platform desktop builds.
- } else if ((arch == QLatin1String("arm64")) && (msvcVer == QStringLiteral("15.0"))) {
- crossPlatformDesktopBuild = true;
- }
-
- if (winrtBuild || crossPlatformDesktopBuild) {
- QString compiler;
- QString compilerArch;
- const ProStringList hostArch = project->values("QMAKE_TARGET.arch");
- if (msvcVer == QStringLiteral("15.0")) {
- if (hostArch.contains("x86_64"))
- compiler = QStringLiteral("HostX64/");
- else
- compiler = QStringLiteral("HostX86/");
- if (arch == QLatin1String("arm")) {
- compiler += QStringLiteral("arm");
- compilerArch = QStringLiteral("arm");
- } else if (arch == QLatin1String("x64")) {
- compiler += QStringLiteral("x64");
- compilerArch = QStringLiteral("amd64");
- } else if (arch == QLatin1String("arm64")) {
- compiler += QStringLiteral("arm64");
- compilerArch = QStringLiteral("arm64");
- } else {
- arch = QStringLiteral("x86");
- compiler += QStringLiteral("x86");
- }
- } else {
- if (arch == QLatin1String("arm")) {
- compiler = QStringLiteral("x86_arm");
- compilerArch = QStringLiteral("arm");
- } else if (arch == QLatin1String("x64")) {
- const ProStringList hostArch = project->values("QMAKE_TARGET.arch");
- if (hostArch.contains("x86_64"))
- compiler = QStringLiteral("amd64");
- else
- compiler = QStringLiteral("x86_amd64");
- compilerArch = QStringLiteral("amd64");
- } else {
- arch = QStringLiteral("x86");
- }
- }
-
- const QString winsdkVer = project->first("WINSDK_VER").toQString();
- if (winsdkVer.isEmpty()) {
- fprintf(stderr, "Mkspec does not specify WINSDK_VER. Cannot continue.\n");
- return false;
- }
- const QString targetVer = project->first("WINTARGET_VER").toQString();
- if (targetVer.isEmpty() && winrtBuild) {
- fprintf(stderr, "Mkspec does not specify WINTARGET_VER. Cannot continue.\n");
- return false;
- }
-
-#ifdef Q_OS_WIN
- QString regKey;
- if (msvcVer == QStringLiteral("15.0"))
- regKey = QStringLiteral("Software\\Microsoft\\VisualStudio\\SxS\\VS7\\") + msvcVer;
- else
- regKey = QStringLiteral("Software\\Microsoft\\VisualStudio\\") + msvcVer + ("\\Setup\\VC\\ProductDir");
- const QString vcInstallDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey, KEY_WOW64_32KEY);
- if (vcInstallDir.isEmpty()) {
- fprintf(stderr, "Failed to find the Visual Studio installation directory.\n");
- return false;
- }
-
- const QString windowsPath = "Software\\Microsoft\\Microsoft SDKs\\Windows\\v";
-
- regKey = windowsPath + winsdkVer + QStringLiteral("\\InstallationFolder");
- const QString kitDir = qt_readRegistryKey(HKEY_LOCAL_MACHINE, regKey, KEY_WOW64_32KEY);
- if (kitDir.isEmpty()) {
- fprintf(stderr, "Failed to find the Windows Kit installation directory.\n");
- return false;
- }
-#else
- const QString vcInstallDir = "/fake/vc_install_dir";
- const QString kitDir = "/fake/sdk_install_dir";
-#endif // Q_OS_WIN
- QStringList incDirs;
- QStringList libDirs;
- QStringList binDirs;
- if (msvcVer == QStringLiteral("15.0")) {
- const QString toolsInstallDir = qgetenv("VCToolsInstallDir");
- if (toolsInstallDir.isEmpty()) {
- fprintf(stderr, "Failed to access tools installation dir.\n");
- return false;
- }
-
- binDirs << toolsInstallDir + QStringLiteral("bin/") + compiler;
- if (arch == QStringLiteral("x64"))
- binDirs << toolsInstallDir + QStringLiteral("bin/HostX86/X86");
- binDirs << kitDir + QStringLiteral("bin/x86");
- binDirs << vcInstallDir + QStringLiteral("Common7/Tools");
- binDirs << vcInstallDir + QStringLiteral("Common7/ide");
- binDirs << vcInstallDir + QStringLiteral("MSBuild/15.0/bin");
-
- incDirs << toolsInstallDir + QStringLiteral("include");
- incDirs << vcInstallDir + QStringLiteral("VC/Auxiliary/VS/include");
-
- const QString crtVersion = qgetenv("UCRTVersion");
- if (crtVersion.isEmpty()) {
- fprintf(stderr, "Failed to access CRT version.\n");
- return false;
- }
- const QString crtInclude = kitDir + QStringLiteral("Include/") + crtVersion;
- const QString crtLib = kitDir + QStringLiteral("Lib/") + crtVersion;
- incDirs << crtInclude + QStringLiteral("/ucrt");
- incDirs << crtInclude + QStringLiteral("/um");
- incDirs << crtInclude + QStringLiteral("/shared");
- incDirs << crtInclude + QStringLiteral("/winrt");
-
- if (winrtBuild) {
- libDirs << toolsInstallDir + QStringLiteral("lib/") + arch + QStringLiteral("/store");
- } else {
- // Desktop projects may require the atl headers and libs.
- incDirs << toolsInstallDir + QStringLiteral("atlmfc/include");
- libDirs << toolsInstallDir + QStringLiteral("atlmfc/lib/") + compilerArch;
- libDirs << toolsInstallDir + QStringLiteral("lib/") + arch;
- }
-
- libDirs << vcInstallDir + QStringLiteral("VC/Auxiliary/VS/lib/") + arch;
-
- libDirs << crtLib + QStringLiteral("/ucrt/") + arch;
- libDirs << crtLib + QStringLiteral("/um/") + arch;
- } else if (msvcVer == QStringLiteral("14.0")) {
- binDirs << vcInstallDir + QStringLiteral("bin/") + compiler;
- binDirs << vcInstallDir + QStringLiteral("bin/"); // Maybe remove for x86 again?
- binDirs << kitDir + QStringLiteral("bin/") + (arch == QStringLiteral("arm") ? QStringLiteral("x86") : arch);
- binDirs << vcInstallDir + QStringLiteral("../Common7/Tools/bin");
- binDirs << vcInstallDir + QStringLiteral("../Common7/Tools");
- binDirs << vcInstallDir + QStringLiteral("../Common7/ide");
- binDirs << kitDir + QStringLiteral("Windows Performance Toolkit/");
-
- incDirs << vcInstallDir + QStringLiteral("include");
- incDirs << vcInstallDir + QStringLiteral("atlmfc/include");
-
- const QString crtVersion = qgetenv("UCRTVersion");
- if (crtVersion.isEmpty()) {
- fprintf(stderr, "Failed to access CRT version.\n");
- return false;
- }
- const QString crtInclude = kitDir + QStringLiteral("Include/") + crtVersion;
- const QString crtLib = kitDir + QStringLiteral("Lib/") + crtVersion;
- incDirs << crtInclude + QStringLiteral("/ucrt");
- incDirs << crtInclude + QStringLiteral("/um");
- incDirs << crtInclude + QStringLiteral("/shared");
- incDirs << crtInclude + QStringLiteral("/winrt");
-
- libDirs << vcInstallDir + QStringLiteral("lib/store/") + compilerArch;
- libDirs << vcInstallDir + QStringLiteral("atlmfc/lib") + compilerArch;
-
- libDirs << crtLib + QStringLiteral("/ucrt/") + arch;
- libDirs << crtLib + QStringLiteral("/um/") + arch;
- } else {
- incDirs << vcInstallDir + QStringLiteral("/include");
- libDirs << vcInstallDir + QStringLiteral("/lib/store/") + compilerArch
- << vcInstallDir + QStringLiteral("/lib/") + compilerArch;
- binDirs << vcInstallDir + QStringLiteral("/bin/") + compiler
- << vcInstallDir + QStringLiteral("/../Common7/IDE");
- libDirs << kitDir + QStringLiteral("/Lib/") + targetVer + ("/um/") + arch;
- incDirs << kitDir + QStringLiteral("/include/um")
- << kitDir + QStringLiteral("/include/shared")
- << kitDir + QStringLiteral("/include/winrt");
- }
-
- binDirs << vcInstallDir + QStringLiteral("/bin");
-
- // Inherit PATH
- binDirs << QString::fromLocal8Bit(qgetenv("PATH")).split(QLatin1Char(';'));
-
- t << "\nINCLUDE = " << nmakePathList(incDirs);
- t << "\nLIB = " << nmakePathList(libDirs);
- t << "\nPATH = " << nmakePathList(binDirs) << '\n';
- }
- }
writeNmakeParts(t);
return MakefileGenerator::writeMakefile(t);
}
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index 13069be60c..6e4b9a1eb5 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -520,6 +520,8 @@ void Win32MakefileGenerator::writeIncPart(QTextStream &t)
void Win32MakefileGenerator::writeStandardParts(QTextStream &t)
{
+ writeExportedVariables(t);
+
t << "####### Compiler, tools and options\n\n";
t << "CC = " << var("QMAKE_CC") << endl;
t << "CXX = " << var("QMAKE_CXX") << endl;
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index f81bec158b..dd7766c8e0 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -52,6 +52,9 @@
# include <qthreadpool.h>
#endif
#include <qversionnumber.h>
+#ifdef Q_OS_WIN
+# include <registry_p.h>
+#endif
#include <algorithm>
@@ -93,7 +96,7 @@ enum ExpandFunc {
E_UPPER, E_LOWER, E_TITLE, E_FILES, E_PROMPT, E_RE_ESCAPE, E_VAL_ESCAPE,
E_REPLACE, E_SORT_DEPENDS, E_RESOLVE_DEPENDS, E_ENUMERATE_VARS,
E_SHADOWED, E_ABSOLUTE_PATH, E_RELATIVE_PATH, E_CLEAN_PATH,
- E_SYSTEM_PATH, E_SHELL_PATH, E_SYSTEM_QUOTE, E_SHELL_QUOTE, E_GETENV
+ E_SYSTEM_PATH, E_SHELL_PATH, E_SYSTEM_QUOTE, E_SHELL_QUOTE, E_GETENV, E_READ_REGISTRY
};
enum TestFunc {
@@ -190,6 +193,7 @@ void QMakeEvaluator::initFunctionStatics()
{ "system_quote", E_SYSTEM_QUOTE, -1, 1, "arg" },
{ "shell_quote", E_SHELL_QUOTE, -1, 1, "arg" },
{ "getenv", E_GETENV, 1, 1, "arg" },
+ { "read_registry", E_READ_REGISTRY, 2, 3, "tree, key, [wow64]" },
};
statics.expands.reserve((int)(sizeof(expandInits)/sizeof(expandInits[0])));
for (unsigned i = 0; i < sizeof(expandInits)/sizeof(expandInits[0]); ++i)
@@ -1214,6 +1218,40 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateBuiltinExpand(
ret << ProString(m_option->getEnv(u1.str()));
break;
}
+#ifdef Q_OS_WIN
+ case E_READ_REGISTRY: {
+ HKEY tree;
+ const auto par = args.at(0);
+ if (!par.compare(QLatin1String("HKCU"), Qt::CaseInsensitive)
+ || !par.compare(QLatin1String("HKEY_CURRENT_USER"), Qt::CaseInsensitive)) {
+ tree = HKEY_CURRENT_USER;
+ } else if (!par.compare(QLatin1String("HKLM"), Qt::CaseInsensitive)
+ || !par.compare(QLatin1String("HKEY_LOCAL_MACHINE"), Qt::CaseInsensitive)) {
+ tree = HKEY_LOCAL_MACHINE;
+ } else {
+ evalError(fL1S("read_registry(): invalid or unsupported registry tree %1.")
+ .arg(par.toQStringView()));
+ goto allfail;
+ }
+ int flags = 0;
+ if (args.count() > 2) {
+ const auto opt = args.at(2);
+ if (opt == "32"
+ || !opt.compare(QLatin1String("wow64_32key"), Qt::CaseInsensitive)) {
+ flags = KEY_WOW64_32KEY;
+ } else if (opt == "64"
+ || !opt.compare(QLatin1String("wow64_64key"), Qt::CaseInsensitive)) {
+ flags = KEY_WOW64_64KEY;
+ } else {
+ evalError(fL1S("read_registry(): invalid option %1.")
+ .arg(opt.toQStringView()));
+ goto allfail;
+ }
+ }
+ ret << ProString(qt_readRegistryKey(tree, args.at(1).toQString(m_tmp1), flags));
+ break;
+ }
+#endif
default:
evalError(fL1S("Function '%1' is not implemented.").arg(func.toQStringView()));
break;
diff --git a/qmake/generators/win32/registry.cpp b/qmake/library/registry.cpp
index 3391ab9512..3391ab9512 100644
--- a/qmake/generators/win32/registry.cpp
+++ b/qmake/library/registry.cpp
diff --git a/qmake/generators/win32/registry_p.h b/qmake/library/registry_p.h
index f9e8bba016..f9e8bba016 100644
--- a/qmake/generators/win32/registry_p.h
+++ b/qmake/library/registry_p.h
diff --git a/src/android/templates/build.gradle b/src/android/templates/build.gradle
index fcd8ae345d..989d0792cf 100644
--- a/src/android/templates/build.gradle
+++ b/src/android/templates/build.gradle
@@ -17,7 +17,7 @@ repositories {
apply plugin: 'com.android.application'
dependencies {
- implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
android {
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h
index f2e5833468..615f523888 100644
--- a/src/corelib/global/qendian.h
+++ b/src/corelib/global/qendian.h
@@ -204,9 +204,9 @@ template <typename T> inline Q_DECL_CONSTEXPR T qToBigEndian(T source)
template <typename T> inline Q_DECL_CONSTEXPR T qFromBigEndian(T source)
{ return source; }
template <typename T> inline Q_DECL_CONSTEXPR T qToLittleEndian(T source)
-{ return qbswap<T>(source); }
+{ return qbswap(source); }
template <typename T> inline Q_DECL_CONSTEXPR T qFromLittleEndian(T source)
-{ return qbswap<T>(source); }
+{ return qbswap(source); }
template <typename T> inline void qToBigEndian(T src, void *dest)
{ qToUnaligned<T>(src, dest); }
template <typename T> inline void qToLittleEndian(T src, void *dest)
diff --git a/src/corelib/kernel/qcore_mac_objc.mm b/src/corelib/kernel/qcore_mac_objc.mm
index 7b78ef11be..bc23e821fd 100644
--- a/src/corelib/kernel/qcore_mac_objc.mm
+++ b/src/corelib/kernel/qcore_mac_objc.mm
@@ -170,8 +170,11 @@ QDebug operator<<(QDebug debug, const QMacAutoReleasePool *pool)
bool qt_mac_applicationIsInDarkMode()
{
#if QT_MACOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_14)
- if (__builtin_available(macOS 10.14, *))
- return [NSApp.effectiveAppearance.name hasSuffix:@"DarkAqua"];
+ if (__builtin_available(macOS 10.14, *)) {
+ auto appearance = [NSApp.effectiveAppearance bestMatchFromAppearancesWithNames:
+ @[ NSAppearanceNameAqua, NSAppearanceNameDarkAqua ]];
+ return [appearance isEqualToString:NSAppearanceNameDarkAqua];
+ }
#endif
return false;
}
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp
index 1ba5f3979c..b9e35e28e4 100644
--- a/src/corelib/kernel/qmetatype.cpp
+++ b/src/corelib/kernel/qmetatype.cpp
@@ -2323,6 +2323,8 @@ void *QMetaType::createExtended(const void *copy) const
*/
void QMetaType::destroyExtended(void *data) const
{
+ if (m_typeId == QMetaType::UnknownType)
+ return;
if (Q_UNLIKELY(m_typedDestructor && !m_destructor))
m_typedDestructor(m_typeId, data);
else
@@ -2339,6 +2341,8 @@ void QMetaType::destroyExtended(void *data) const
*/
void *QMetaType::constructExtended(void *where, const void *copy) const
{
+ if (m_typeId == QMetaType::UnknownType)
+ return nullptr;
if (m_typedConstructor && !m_constructor)
return m_typedConstructor(m_typeId, where, copy);
return nullptr;
@@ -2353,6 +2357,8 @@ void *QMetaType::constructExtended(void *where, const void *copy) const
*/
void QMetaType::destructExtended(void *data) const
{
+ if (m_typeId == QMetaType::UnknownType)
+ return;
if (m_typedDestructor && !m_destructor)
m_typedDestructor(m_typeId, data);
}
diff --git a/src/network/ssl/qdtls.cpp b/src/network/ssl/qdtls.cpp
index bbb22aa527..3185bfa124 100644
--- a/src/network/ssl/qdtls.cpp
+++ b/src/network/ssl/qdtls.cpp
@@ -370,6 +370,7 @@ void QDtlsBasePrivate::setConfiguration(const QSslConfiguration &configuration)
dtlsConfiguration.nextProtocolNegotiationStatus = configuration.nextProtocolNegotiationStatus();
dtlsConfiguration.dtlsCookieEnabled = configuration.dtlsCookieVerificationEnabled();
dtlsConfiguration.allowRootCertOnDemandLoading = configuration.d->allowRootCertOnDemandLoading;
+ dtlsConfiguration.backendConfig = configuration.backendConfiguration();
clearDtlsError();
}
diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
index fb11e4c522..e2bb7dab2a 100644
--- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -124,6 +124,7 @@ private slots:
void compareCustomType();
void compareCustomEqualOnlyType();
void customDebugStream();
+ void unknownType();
};
struct BaseGenericType
@@ -2541,6 +2542,16 @@ void tst_QMetaType::customDebugStream()
qDebug() << v1;
}
+void tst_QMetaType::unknownType()
+{
+ QMetaType invalid(QMetaType::UnknownType);
+ QVERIFY(!invalid.create());
+ QVERIFY(!invalid.sizeOf());
+ QVERIFY(!invalid.metaObject());
+ int buffer = 0xBAD;
+ invalid.construct(&buffer);
+ QCOMPARE(buffer, 0xBAD);
+}
// Compile-time test, it should be possible to register function pointer types
class Undefined;
diff --git a/tests/auto/corelib/kernel/qtimer/BLACKLIST b/tests/auto/corelib/kernel/qtimer/BLACKLIST
index b355bc22c2..e5136624d8 100644
--- a/tests/auto/corelib/kernel/qtimer/BLACKLIST
+++ b/tests/auto/corelib/kernel/qtimer/BLACKLIST
@@ -1,5 +1,3 @@
[remainingTime]
windows
osx
-[basic_chrono]
-osx ci
diff --git a/tests/auto/tools/qmakelib/qmakelib.pro b/tests/auto/tools/qmakelib/qmakelib.pro
index 140bece708..29f17f6a14 100644
--- a/tests/auto/tools/qmakelib/qmakelib.pro
+++ b/tests/auto/tools/qmakelib/qmakelib.pro
@@ -1,6 +1,7 @@
CONFIG += testcase
TARGET = tst_qmakelib
QT = core testlib
+win32: LIBS += -ladvapi32
INCLUDEPATH += ../../../../qmake/library
VPATH += ../../../../qmake/library
@@ -13,6 +14,7 @@ SOURCES += \
parsertest.cpp \
evaltest.cpp \
ioutils.cpp \
+ registry.cpp \
proitems.cpp \
qmakevfs.cpp \
qmakeparser.cpp \
diff --git a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
index eeda17074b..76314564f1 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
@@ -38,49 +38,6 @@
#include <qpa/qplatformtheme.h>
#include <private/qguiapplication_p.h>
-#define CONVENIENCE_FUNC_SYMS(func) \
- { \
- int x1 = QMessageBox::func(0, "Foo", "Bar"); \
- int x3 = QMessageBox::func(0, "Foo", "Bar", "Save"); \
- int x6 = QMessageBox::func(0, "Foo", "Bar", "Save", "Save As"); \
- int x7 = QMessageBox::func(0, "Foo", "Bar", "Save", "Save As", "Dont Save"); \
- int x8 = QMessageBox::func(0, "Foo", "Bar", "Save", "Save As", "Dont Save", 1); \
- int x9 = QMessageBox::func(0, "Foo", "Bar", "Save", "Save As", "Dont Save", 1, 2); \
- int x10 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::YesAll, QMessageBox::Yes); \
- int x11 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::YesAll, QMessageBox::Yes, \
- QMessageBox::No); \
- qDebug("%d %d %d %d %d %d %d %d", x1, x3, x6, x7, x8, x9, x10, x11); \
- { \
- int x4 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, (int)QMessageBox::No); \
- int x5 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, (int)QMessageBox::No); \
- int x6 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, (int)QMessageBox::No); \
- int x7 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, QMessageBox::No); \
- int x8 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, QMessageBox::No); \
- int x9 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No); \
- int x10 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, (int)QMessageBox::No, (int)QMessageBox::Ok); \
- int x11 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, (int)QMessageBox::No, (int)QMessageBox::Ok); \
- int x12 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, (int)QMessageBox::No, (int)QMessageBox::Ok); \
- int x13 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, QMessageBox::No, (int)QMessageBox::Ok); \
- int x14 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, QMessageBox::No, (int)QMessageBox::Ok); \
- int x15 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, (int)QMessageBox::Ok); \
- int x16 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, (int)QMessageBox::No, QMessageBox::Ok); \
- int x17 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, (int)QMessageBox::No, QMessageBox::Ok); \
- int x18 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, (int)QMessageBox::No, QMessageBox::Ok); \
- int x19 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes, QMessageBox::No, QMessageBox::Ok); \
- int x20 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes, QMessageBox::No, QMessageBox::Ok); \
- int x21 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Ok); \
- qDebug("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15, x16, x17, x18, x19, x20, x21); \
- } \
- }
-
-#define CONVENIENCE_FUNC_SYMS_EXTRA(func) \
- { \
- int x1 = QMessageBox::func(0, "Foo", "Bar", (int)QMessageBox::Yes); \
- int x2 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes); \
- int x3 = QMessageBox::func(0, "Foo", "Bar", QMessageBox::Yes | QMessageBox::Default); \
- qDebug("%d %d %d", x1, x2, x3); \
- }
-
class tst_QMessageBox : public QObject
{
Q_OBJECT
@@ -103,7 +60,6 @@ private slots:
void staticSourceCompat();
void instanceSourceCompat();
- void testSymbols();
void incorrectDefaultButton();
void updateSize();
@@ -509,96 +465,6 @@ void tst_QMessageBox::instanceSourceCompat()
#endif
}
-void tst_QMessageBox::testSymbols()
-{
- return;
-
- QMessageBox::Icon icon;
- icon = QMessageBox::NoIcon;
- icon = QMessageBox::Information;
- icon = QMessageBox::Warning;
- icon = QMessageBox::Critical;
- icon = QMessageBox::Question;
-
- QMessageBox mb1;
- QMessageBox mb2(0);
- QMessageBox mb3(&mb1);
- QMessageBox mb3b("title", "text", QMessageBox::Critical, int(QMessageBox::Yes),
- int(QMessageBox::No), int(QMessageBox::Cancel), &mb1, Qt::Dialog);
-
- QMessageBox::Button button = QMessageBox::NoButton;
- button = QMessageBox::Ok;
- button = QMessageBox::Cancel;
- button = QMessageBox::Yes;
- button = QMessageBox::No;
- button = QMessageBox::Abort;
- button = QMessageBox::Retry;
- button = QMessageBox::Ignore;
- button = QMessageBox::YesAll;
- button = QMessageBox::NoAll;
- button = QMessageBox::ButtonMask;
- button = QMessageBox::Default;
- button = QMessageBox::Escape;
- button = QMessageBox::FlagMask;
- QVERIFY(button);
-
- const QString text = QStringLiteral("Foo");
- mb1.setText(text);
- QCOMPARE(mb1.text(), text);
-
- icon = mb1.icon();
- QCOMPARE(icon, QMessageBox::NoIcon);
- mb1.setIcon(QMessageBox::Question);
- QCOMPARE(mb1.icon(), QMessageBox::Question);
-
- QPixmap iconPixmap = mb1.iconPixmap();
- mb1.setIconPixmap(iconPixmap);
- QCOMPARE(mb1.icon(), QMessageBox::NoIcon);
-
- QCOMPARE(mb1.buttonText(QMessageBox::Ok), QLatin1String("OK"));
- QCOMPARE(mb1.buttonText(QMessageBox::Cancel), QString());
- QCOMPARE(mb1.buttonText(QMessageBox::Ok | QMessageBox::Default), QString());
-
- const QString button1 = QStringLiteral("Bar");
- mb2.setButtonText(QMessageBox::Cancel, QStringLiteral("Foo"));
- mb2.setButtonText(QMessageBox::Ok, button1);
- mb2.setButtonText(QMessageBox::Ok | QMessageBox::Default, QStringLiteral("Baz"));
-
- QCOMPARE(mb2.buttonText(QMessageBox::Cancel), QString());
- QCOMPARE(mb2.buttonText(QMessageBox::Ok), button1);
-
- QVERIFY(mb3b.buttonText(QMessageBox::Yes).endsWith("Yes"));
- QCOMPARE(mb3b.buttonText(QMessageBox::YesAll), QString());
- QCOMPARE(mb3b.buttonText(QMessageBox::Ok), QString());
-
- const QString button2 = QStringLiteral("Blah");
- mb3b.setButtonText(QMessageBox::Yes, button2);
- mb3b.setButtonText(QMessageBox::YesAll, QStringLiteral("Zoo"));
- mb3b.setButtonText(QMessageBox::Ok, QStringLiteral("Zoo"));
-
- QCOMPARE(mb3b.buttonText(QMessageBox::Yes), button2);
- QCOMPARE(mb3b.buttonText(QMessageBox::YesAll), QString());
- QCOMPARE(mb3b.buttonText(QMessageBox::Ok), QString());
-
- QCOMPARE(mb1.textFormat(), Qt::AutoText);
- mb1.setTextFormat(Qt::PlainText);
- QCOMPARE(mb1.textFormat(), Qt::PlainText);
-
- CONVENIENCE_FUNC_SYMS(information);
- CONVENIENCE_FUNC_SYMS_EXTRA(information);
- CONVENIENCE_FUNC_SYMS(question);
- CONVENIENCE_FUNC_SYMS_EXTRA(question);
- CONVENIENCE_FUNC_SYMS(warning);
- CONVENIENCE_FUNC_SYMS(critical);
-
- QSize sizeHint = mb1.sizeHint();
- QVERIFY(sizeHint.width() > 20 && sizeHint.height() > 20);
-
- QMessageBox::about(&mb1, "title", "text");
- QMessageBox::aboutQt(&mb1);
- QMessageBox::aboutQt(&mb1, "title");
-}
-
void tst_QMessageBox::detailsText()
{
QMessageBox box;