Merge remote-tracking branch 'gerrit/dev' into HEAD

This commit is contained in:
Oswald Buddenhagen 2017-02-01 21:00:55 +01:00
commit dcd5cb9736
426 changed files with 5700 additions and 4300 deletions

8
.gitignore vendored
View File

@ -89,6 +89,7 @@ bin/makeqpf*
bin/pixeltool*
bin/qmake*
bin/qdoc*
bin/qfloat16-tables*
bin/qt3to4*
bin/qttracereplay*
bin/rcc*
@ -120,6 +121,7 @@ config.opt
config.status
config.summary
config.log
config.cache
mkspecs/default
mkspecs/default-host
mkspecs/qconfig.pri
@ -127,13 +129,16 @@ mkspecs/qdevice.pri
mkspecs/qfeatures.pri
mkspecs/qhost.pri
moc_*.cpp
qmake/qmake
qmake/qmake.exe
qmake/Makefile.bak
qmake/qmake_pch.pch
src/corelib/global/qconfig.cpp
src/corelib/global/qconfig.h
src/corelib/global/qconfig.h.qmake
src/corelib/global/qconfig_p.h
src/corelib/global/qfeatures.h
src/corelib/global/qfloat16tables.cpp
src/platformsupport/*_interface.*
src/platformsupport/*_adaptor.*
ui_*.h
@ -155,6 +160,9 @@ translations/*_untranslated.ts
qrc_*.cpp
*.version
*.version.in
qt*-config.h
qt*-config_p.h
qt*-config.pri
# Test generated files
QObject.log

View File

@ -3,7 +3,7 @@
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec of the Qt Toolkit.
** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
@ -37,4 +37,10 @@
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"
#include <alloca.h>
int main(int, char **)
{
alloca(1);
return 0;
}

View File

@ -0,0 +1 @@
SOURCES = alloca.cpp

View File

@ -1 +0,0 @@
_MSC_FULL_VER

View File

@ -72,6 +72,8 @@ Build options:
-debug ............... Build Qt with debugging turned on [no]
-debug-and-release ... Build two versions of Qt, with and without
debugging turned on [yes] (Apple and Windows only)
-optimize-debug ...... Enable debug-friendly optimizations in debug builds
[auto] (Not supported with MSVC)
-optimized-tools ..... Build optimized host tools even in debug build [no]
-force-debug-info .... Create symbol files for release builds [no]
-separate-debug-info . Split off debug information to separate files [no]
@ -104,7 +106,6 @@ Build options:
-c++std <edition> .... Select C++ standard <edition> [c++1z/c++14/c++11]
(Not supported with MSVC)
-rtti ................ Build with Runtime Type Information [yes] (MSVC only)
-sse2 ................ Use SSE2 instructions [auto]
-sse3/-ssse3/-sse4.1/-sse4.2/-avx/-avx2/-avx512

109
configure vendored
View File

@ -82,6 +82,11 @@ if [ x"$1" = x"-top-level" ]; then
relpathMangled=`dirname "$relpath"`
outpathPrefix=../
shift
else
if [ -f ../.qmake.super ]; then
echo >&2 "ERROR: You cannot configure qtbase separately within a top-level build."
exit 1
fi
fi
OPT_CMDLINE= # expanded version for the script
@ -522,6 +527,16 @@ done
if [ "$OPT_HELP" = "yes" ]; then
cat $relpath/config_help.txt
if [ -n "$CFG_TOPLEVEL" ]; then
IFS='
'
for i in $relpathMangled/qt*/config_help.txt; do
if [ x"$i" != x"$relpath/config_help.txt" ]; then
echo
cat "$i"
fi
done
fi
exit 0
fi
@ -529,8 +544,8 @@ fi
# platform detection
#-------------------------------------------------------------------------------
PLATFORM_NOTES=
if [ -z "$PLATFORM" ]; then
PLATFORM_NOTES=
case "$UNAME_SYSTEM:$UNAME_RELEASE" in
Darwin:*)
PLATFORM=macx-clang
@ -540,9 +555,7 @@ if [ -z "$PLATFORM" ]; then
#PLATFORM=aix-g++-64
PLATFORM=aix-xlc
#PLATFORM=aix-xlc-64
PLATFORM_NOTES="
- Also available for AIX: aix-g++ aix-g++-64 aix-xlc-64
"
PLATFORM_NOTES="AIX: aix-g++ aix-g++-64 aix-xlc-64"
;;
GNU:*)
PLATFORM=hurd-g++
@ -559,14 +572,10 @@ if [ -z "$PLATFORM" ]; then
FreeBSD:*)
if [ "$(uname -r | cut -d. -f1)" -ge 10 ]; then
PLATFORM=freebsd-clang
PLATFORM_NOTES="
- Also available for FreeBSD: freebsd-g++
"
PLATFORM_NOTES="FreeBSD: freebsd-g++"
else
PLATFORM=freebsd-g++
PLATFORM_NOTES="
- Also available for FreeBSD: freebsd-clang
"
PLATFORM_NOTES="FreeBSD: freebsd-clang"
fi
;;
OpenBSD:*)
@ -582,18 +591,14 @@ if [ -z "$PLATFORM" ]; then
#PLATFORM=irix-g++
PLATFORM=irix-cc
#PLATFORM=irix-cc-64
PLATFORM_NOTES="
- Also available for IRIX: irix-g++ irix-cc-64
"
PLATFORM_NOTES="IRIX: irix-g++ irix-cc-64"
;;
HP-UX:*)
case "$UNAME_MACHINE" in
ia64)
#PLATFORM=hpuxi-acc-32
PLATFORM=hpuxi-acc-64
PLATFORM_NOTES="
- Also available for HP-UXi: hpuxi-acc-32
"
PLATFORM_NOTES="HP-UXi: hpuxi-acc-32"
;;
*)
#PLATFORM=hpux-g++
@ -601,39 +606,29 @@ if [ -z "$PLATFORM" ]; then
#PLATFORM=hpux-acc-64
#PLATFORM=hpux-cc
#PLATFORM=hpux-acc-o64
PLATFORM_NOTES="
- Also available for HP-UX: hpux-g++ hpux-acc-64 hpux-acc-o64
"
PLATFORM_NOTES="HP-UX: hpux-g++ hpux-acc-64 hpux-acc-o64"
;;
esac
;;
OSF1:*)
#PLATFORM=tru64-g++
PLATFORM=tru64-cxx
PLATFORM_NOTES="
- Also available for Tru64: tru64-g++
"
PLATFORM_NOTES="Tru64: tru64-g++"
;;
Linux:*)
PLATFORM=linux-g++
PLATFORM_NOTES="
- Also available for Linux: linux-clang linux-kcc linux-icc linux-cxx
"
PLATFORM_NOTES="Linux: linux-clang linux-kcc linux-icc linux-cxx"
;;
SunOS:5*)
#PLATFORM=solaris-g++
PLATFORM=solaris-cc
#PLATFORM=solaris-cc64
PLATFORM_NOTES="
- Also available for Solaris: solaris-g++ solaris-cc-64
"
PLATFORM_NOTES="Solaris: solaris-g++ solaris-cc-64"
;;
ReliantUNIX-*:*|SINIX-*:*)
PLATFORM=reliant-cds
#PLATFORM=reliant-cds-64
PLATFORM_NOTES="
- Also available for Reliant UNIX: reliant-cds-64
"
PLATFORM_NOTES="Reliant UNIX: reliant-cds-64"
;;
CYGWIN*:*)
PLATFORM=cygwin-g++
@ -644,23 +639,17 @@ if [ -z "$PLATFORM" ]; then
OpenUNIX:*)
#PLATFORM=unixware-g++
PLATFORM=unixware-cc
PLATFORM_NOTES="
- Also available for OpenUNIX: unixware-g++
"
PLATFORM_NOTES="OpenUNIX: unixware-g++"
;;
UnixWare:*)
#PLATFORM=unixware-g++
PLATFORM=unixware-cc
PLATFORM_NOTES="
- Also available for UnixWare: unixware-g++
"
PLATFORM_NOTES="UnixWare: unixware-g++"
;;
SCO_SV:*)
#PLATFORM=sco-g++
PLATFORM=sco-cc
PLATFORM_NOTES="
- Also available for SCO OpenServer: sco-g++
"
PLATFORM_NOTES="SCO OpenServer: sco-g++"
;;
UNIX_SV:*)
PLATFORM=unixware-g++
@ -678,6 +667,7 @@ if [ -z "$PLATFORM" ]; then
exit 2
esac
fi
echo "$PLATFORM_NOTES" > "${outpathPrefix}.config.notes"
#-------------------------------------------------------------------------------
# command line and environment validation
@ -895,11 +885,8 @@ Prefix=$relpath
EOF
fi
[ -z "$CFG_HOST_QT_TOOLS_PATH" ] && CFG_HOST_QT_TOOLS_PATH="$outpath/bin"
CFG_QMAKE_PATH="$CFG_HOST_QT_TOOLS_PATH/qmake"
#-------------------------------------------------------------------------------
# run configure tests
# configure and build top-level makefile
#-------------------------------------------------------------------------------
# recreate command line for qmake
@ -913,40 +900,12 @@ done
set +f
IFS=$SAVED_IFS
#-------------------------------------------------------------------------------
# configure and build top-level makefile
#-------------------------------------------------------------------------------
if [ -n "$CFG_TOPLEVEL" ]; then
cd ..
fi
"$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" "$relpathMangled" -- "$@" || exit
#-------------------------------------------------------------------------------
# final notes for the user
#-------------------------------------------------------------------------------
if [ -n "$PLATFORM_NOTES" ]; then
echo
echo "Platform notes:"
echo "$PLATFORM_NOTES"
if [ -n "$CFG_HOST_QT_TOOLS_PATH" ]; then
"$CFG_HOST_QT_TOOLS_PATH/qmake" -qtconf "$QTCONFFILE" "$relpathMangled" -- "$@"
else
echo
"$outpath/bin/qmake" "$relpathMangled" -- "$@"
fi
QT_INSTALL_PREFIX=`sed -ne 's/^Prefix=//p' < "$outpath/qmake/builtin-qt.conf"`
MAKE=`basename "$MAKE"`
echo
echo Qt is now configured for building. Just run \'$MAKE\'.
if [ "$outpath" = "$QT_INSTALL_PREFIX" ]; then
echo Once everything is built, Qt is installed.
echo You should not run \'$MAKE install\'.
else
echo Once everything is built, you must run \'$MAKE install\'.
echo Qt will be installed into $QT_INSTALL_PREFIX
fi
echo
echo Prior to reconfiguration, make sure you remove any leftovers from
echo the previous build.
echo

View File

@ -28,13 +28,40 @@
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
set ARGS=%*
set QTSRC=%~dp0
set QTSRC=%QTSRC:~0,-1%
set QTDIR=%CD%
rem Parse command line
set TOPLEVEL=false
set TOPQTSRC=%QTSRC%
set TOPQTDIR=%QTDIR%
if /i not "%~1" == "-top-level" goto notoplevel
set ARGS=%ARGS:~10%
set TOPLEVEL=true
for %%P in ("%TOPQTSRC%") do set TOPQTSRC=%%~dpP
set TOPQTSRC=%TOPQTSRC:~0,-1%
for %%P in ("%QTDIR%") do set TOPQTDIR=%%~dpP
set TOPQTDIR=%TOPQTDIR:~0,-1%
goto wastoplevel
:notoplevel
if not exist ..\.qmake.super goto wastoplevel
echo ERROR: You cannot configure qtbase separately within a top-level build. >&2
exit /b 1
:wastoplevel
set SYNCQT=
set PLATFORM=
set MAKE=
call :doargs %ARGS%
if errorlevel 1 exit /b
goto doneargs
:doargs
if "%~1" == "" goto doneargs
if "%~1" == "" exit /b
if "%~1" == "/?" goto help
if "%~1" == "-?" goto help
@ -44,25 +71,127 @@ set QTDIR=%CD%
if /i "%~1" == "-help" goto help
if /i "%~1" == "--help" goto help
if /i "%~1" == "-redo" goto redo
if /i "%~1" == "--redo" goto redo
if /i "%~1" == "-platform" goto platform
if /i "%~1" == "--platform" goto platform
if /i "%~1" == "-no-syncqt" goto nosyncqt
if /i "%~1" == "--no-syncqt" goto nosyncqt
if /i "%~1" == "-make-tool" goto maketool
if /i "%~1" == "--make-tool" goto maketool
:nextarg
shift
goto doargs
:help
type %QTSRC%\config_help.txt
if %TOPLEVEL% == false exit /b 1
for /d %%p in ("%TOPQTSRC%"\qt*) do (
if not "%%p" == "%QTSRC%" (
if exist "%%p\config_help.txt" (
echo.
type "%%p\config_help.txt"
)
)
)
exit /b 1
:redo
if not exist "%TOPQTDIR%\config.opt" goto redoerr
set rargs=
for /f "usebackq delims=" %%i in ("%TOPQTDIR%\config.opt") do set rargs=!rargs! "%%i"
call :doargs %rargs%
goto nextarg
:redoerr
echo No config.opt present - cannot redo configuration. >&2
exit /b 1
:platform
shift
if "%~1" == "win32-msvc2012" goto msvc
if "%~1" == "win32-msvc2013" goto msvc
if "%~1" == "win32-msvc2015" goto msvc
if "%~1" == "win32-msvc2017" goto msvc
set PLATFORM=%~1
goto nextarg
:msvc
echo. >&2
echo Notice: re-mapping requested qmake spec to unified 'win32-msvc'. >&2
echo. >&2
set PLATFORM=win32-msvc
goto nextarg
:nosyncqt
set SYNCQT=false
goto nextarg
:maketool
shift
set MAKE=%~1
goto nextarg
:doneargs
echo Please wait while bootstrapping configure ...
rem Find various executables
for %%C in (clang-cl.exe cl.exe icl.exe g++.exe perl.exe jom.exe) do set %%C=%%~$PATH:C
if "%perl.exe%" == "" (
echo Perl not found in PATH. Aborting. >&2
rem Determine host spec
if "%PLATFORM%" == "" (
if not "%icl.exe%" == "" (
set PLATFORM=win32-icc
) else if not "%clang-cl.exe%" == "" (
set PLATFORM=win32-clang-msvc
) else if not "%cl.exe%" == "" (
set PLATFORM=win32-msvc
) else if not "%g++.exe%" == "" (
set PLATFORM=win32-g++
) else (
echo Cannot detect host toolchain. Please use -platform. Aborting. >&2
exit /b 1
)
)
if not exist "%QTSRC%\mkspecs\%PLATFORM%\qmake.conf" (
echo Host platform '%PLATFORM%' is invalid. Aborting. >&2
exit /b 1
)
if "%PLATFORM:win32-g++=%" == "%PLATFORM%" (
if "%MAKE%" == "" (
if not "%jom.exe%" == "" (
set MAKE=jom
) else (
set MAKE=nmake
)
)
set tmpl=win32
) else (
if "%MAKE%" == "" (
set MAKE=mingw32-make
)
set tmpl=unix
)
rem Prepare build dir
if not exist mkspecs (
md mkspecs
if errorlevel 1 goto exit
if errorlevel 1 exit /b
)
if not exist bin (
md bin
if errorlevel 1 exit /b
)
if not exist qmake (
md qmake
if errorlevel 1 exit /b
)
rem Extract Qt's version from .qmake.conf
for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%.qmake.conf) do (
for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%\.qmake.conf) do (
if %%i == MODULE_VERSION (
set QTVERMAJ=%%j
set QTVERMIN=%%k
@ -71,69 +200,85 @@ for /f "eol=# tokens=1,2,3,4 delims=.= " %%i in (%QTSRC%.qmake.conf) do (
)
set QTVERSION=%QTVERMAJ%.%QTVERMIN%.%QTVERPAT%
perl %QTSRC%bin\syncqt.pl -minimal -version %QTVERSION% -module QtCore -outdir "%QTDIR%" %QTSRC%
if errorlevel 1 goto exit
rem Create forwarding headers
if not exist tools\configure (
md tools\configure
if errorlevel 1 goto exit
if "%SYNCQT%" == "" (
if exist "%QTSRC%\.git" (
set SYNCQT=true
) else (
set SYNCQT=false
)
)
if "%SYNCQT%" == "true" (
if not "%perl.exe%" == "" (
echo Running syncqt ...
"%perl.exe%" -w "%QTSRC%\bin\syncqt.pl" -minimal -version %QTVERSION% -module QtCore -outdir "%QTDIR%" %QTSRC%
if errorlevel 1 exit /b
) else (
echo Perl not found in PATH. Aborting. >&2
exit /b 1
)
)
cd tools\configure
if errorlevel 1 goto exit
set make=nmake
if not "%jom.exe%" == "" set make=jom
rem Build qmake
echo Bootstrapping qmake ...
cd qmake
if errorlevel 1 exit /b
echo #### Generated by configure.bat - DO NOT EDIT! ####> Makefile
echo/>> Makefile
echo QTVERSION = %QTVERSION%>> Makefile
rem These must have trailing spaces to avoid misinterpretation as 5>>, etc.
echo QT_VERSION_MAJOR = %QTVERMAJ% >> Makefile
echo QT_VERSION_MINOR = %QTVERMIN% >> Makefile
echo QT_VERSION_PATCH = %QTVERPAT% >> Makefile
if not "%icl.exe%" == "" (
echo CXX = icl>>Makefile
echo EXTRA_CXXFLAGS = /Qstd=c++11 /Zc:forScope>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%cl.exe%" == "" (
echo CXX = cl>>Makefile
echo EXTRA_CXXFLAGS =>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%clang-cl.exe%" == "" (
echo CXX = clang-cl>>Makefile
echo EXTRA_CXXFLAGS = -fms-compatibility-version=19.00.23506 -Wno-microsoft-enum-value>>Makefile
rem This must have a trailing space.
echo QTSRC = %QTSRC% >> Makefile
set tmpl=win32
) else if not "%g++.exe%" == "" (
echo CXX = g++>>Makefile
echo EXTRA_CXXFLAGS =>>Makefile
rem This must NOT have a trailing space.
echo QTSRC = %QTSRC:\=/%>> Makefile
set tmpl=mingw
set make=mingw32-make
echo BUILD_PATH = ..>> Makefile
if "%tmpl%" == "win32" (
echo SOURCE_PATH = %QTSRC%>> Makefile
) else (
echo No suitable compiler found in PATH. Aborting. >&2
cd ..\..
exit /b 1
echo SOURCE_PATH = %QTSRC:\=/%>> Makefile
)
if exist "%QTSRC%\.git" (
echo INC_PATH = ../include>> Makefile
) else (
echo INC_PATH = $^(SOURCE_PATH^)/include>> Makefile
)
echo QT_VERSION = %QTVERSION%>> Makefile
rem These must have trailing spaces to avoid misinterpretation as 5>>, etc.
echo QT_MAJOR_VERSION = %QTVERMAJ% >> Makefile
echo QT_MINOR_VERSION = %QTVERMIN% >> Makefile
echo QT_PATCH_VERSION = %QTVERPAT% >> Makefile
if "%tmpl%" == "win32" (
echo QMAKESPEC = %PLATFORM%>> Makefile
) else (
echo QMAKESPEC = $^(SOURCE_PATH^)/mkspecs/%PLATFORM%>> Makefile
echo CONFIG_CXXFLAGS = -std=c++11 -ffunction-sections>> Makefile
echo CONFIG_LFLAGS = -Wl,--gc-sections>> Makefile
type "%QTSRC%\qmake\Makefile.unix.win32" >> Makefile
type "%QTSRC%\qmake\Makefile.unix.mingw" >> Makefile
)
echo/>> Makefile
type %QTSRC%tools\configure\Makefile.%tmpl% >> Makefile
type "%QTSRC%\qmake\Makefile.%tmpl%" >> Makefile
%make%
if errorlevel 1 (cd ..\.. & exit /b 1)
%MAKE%
if errorlevel 1 (cd .. & exit /b 1)
cd ..\..
cd ..
:conf
configureapp.exe -srcdir %QTSRC% %ARGS%
goto exit
rem Generate qt.conf
:help
type %QTSRC%config_help.txt
> "%QTDIR%\bin\qt.conf" (
@echo [EffectivePaths]
@echo Prefix=..
@echo [Paths]
@echo TargetSpec=dummy
@echo HostSpec=%PLATFORM%
)
if not "%QTDIR%" == "%QTSRC%" (
>> "%QTDIR%\bin\qt.conf" (
@echo [EffectiveSourcePaths]
@echo Prefix=%QTSRC:\=/%
)
)
:exit
rem Launch qmake-based configure
cd "%TOPQTDIR%"
"%QTDIR%\bin\qmake.exe" "%TOPQTSRC%" -- %ARGS%

View File

@ -1,6 +1,5 @@
{
"files": {
"builtinQtConf": "qmake/builtin-qt.conf",
"qconfigSource": "src/corelib/global/qconfig.cpp",
"publicHeader": "src/corelib/global/qconfig.h",
"privateHeader": "src/corelib/global/qconfig_p.h",
@ -94,6 +93,7 @@
"mp": { "type": "boolean", "name": "msvc_mp" },
"nomake": { "type": "addString", "values": [ "examples", "tests", "tools" ] },
"opensource": { "type": "void", "name": "commercial", "value": "no" },
"optimize-debug": { "type": "boolean", "name": "optimize_debug" },
"optimized-qmake": { "type": "boolean", "name": "release_tools" },
"optimized-tools": { "type": "boolean", "name": "release_tools" },
"pch": { "type": "boolean", "name": "precompile_header" },
@ -109,7 +109,6 @@
"reduce-relocations": { "type": "boolean", "name": "reduce_relocations" },
"release": { "type": "enum", "name": "debug", "values": { "yes": "no", "no": "yes" } },
"rpath": "boolean",
"rtti": "boolean",
"sanitize": "sanitize",
"sdk": "string",
"separate-debug-info": { "type": "boolean", "name": "separate_debug_info" },
@ -254,11 +253,6 @@
"type": "compile",
"test": "common/c++98default"
},
"compiler": {
"label": "Compiler",
"type": "checkCompiler",
"log": "compilerDescription"
},
"precompile_header": {
"label": "precompiled header support",
"type": "compile",
@ -269,6 +263,11 @@
"type": "compilerSupportsFlag",
"flag": "-fuse-ld=gold"
},
"optimize_debug": {
"label": "-Og support",
"type": "compilerSupportsFlag",
"flag": "-Og"
},
"enable_new_dtags": {
"label": "new dtags support",
"type": "linkerSupportsFlag",
@ -410,6 +409,11 @@
"type": "compile",
"test": "unix/posix_fallocate"
},
"alloca": {
"label": "alloca()",
"type": "compile",
"test": "common/alloca"
},
"stack_protector": {
"label": "stack protection",
"type": "compilerSupportsFlag",
@ -424,13 +428,14 @@
"features": {
"prepare": {
"output": [ "prepareSpec", "prepareOptions", "preparePaths" ]
"output": [ "prepareSpec", "prepareOptions", "preparePaths", "reloadSpec" ]
},
"machineTuple": {
"condition": "!config.linux || config.android || tests.machineTuple",
"output": [ "machineTuple" ]
},
"commit": {
"condition": "features.machineTuple",
"output": [ "commitOptions" ]
},
"android-style-assets": {
@ -484,6 +489,11 @@
"condition": "!config.msvc && !config.integrity && tests.use_gold_linker",
"output": [ "privateConfig", "useGoldLinker" ]
},
"optimize_debug": {
"label": "Optimize debug build",
"condition": "!config.msvc && (features.debug || features.debug_and_release) && tests.optimize_debug",
"output": [ "privateConfig" ]
},
"architecture": {
"label": "Architecture",
"output": [ "architecture" ]
@ -567,12 +577,6 @@
"autoDetect": false,
"output": [ { "type": "varAppend", "name": "EXTRA_RPATHS", "value": "input.rpaths" } ]
},
"rtti": {
"label": "Build with RTTI",
"comment": "mkspecs/features/win32/default_pre.prf sets no-rtti. Follow default behavior of configure.exe by overriding with rtti.",
"condition": "config.win32",
"output": [ "publicConfig" ]
},
"force_asserts": {
"label": "Force assertions",
"autoDetect": false,
@ -691,11 +695,6 @@
"condition": "features.c++14 && tests.c++1z",
"output": [ "publicFeature", "publicQtConfig" ]
},
"compiler": {
"label": "Compiler version",
"condition": "tests.compiler",
"output": [ "compilerVersion" ]
},
"precompile_header": {
"label": "Using precompiled headers",
"condition": "config.msvc || tests.precompile_header",
@ -895,6 +894,11 @@
"condition": "tests.posix_fallocate",
"output": [ "privateFeature" ]
},
"alloca": {
"label": "alloca()",
"condition": "tests.alloca",
"output": [ "privateFeature" ]
},
"stack-protector-strong": {
"label": "stack protection",
"condition": "config.qnx && tests.stack_protector",
@ -947,6 +951,18 @@
{ "type": "publicQtConfig", "negative": true }
]
},
"network": {
"label": "Qt Network",
"output": [ "privateFeature" ]
},
"sql": {
"label": "Qt Sql",
"output": [ "privateFeature" ]
},
"testlib": {
"label": "Qt Testlib",
"output": [ "privateFeature" ]
},
"widgets": {
"label": "Qt Widgets",
"autoDetect": "!config.tvos && !config.watchos",
@ -957,6 +973,10 @@
{ "type": "publicQtConfig", "negative": true }
]
},
"xml": {
"label": "Qt Xml",
"output": [ "privateFeature" ]
},
"libudev": {
"label": "udev",
"condition": "libs.libudev",
@ -1072,6 +1092,11 @@ Configure with '-qreal float' to create a build that is binary-compatible with 5
"message": "Mode",
"type": "buildMode"
},
{
"type": "feature",
"args": "optimize_debug",
"condition": "!config.msvc && (features.debug || features.debug_and_release)"
},
"shared",
{
"message": "Using C++ standard",
@ -1146,7 +1171,11 @@ Configure with '-qreal float' to create a build that is binary-compatible with 5
"dbus",
"dbus-linked",
"gui",
"widgets"
"network",
"sql",
"testlib",
"widgets",
"xml"
]
}, {
"section": "Support enabled for",

View File

@ -397,50 +397,6 @@ defineTest(qtConfTest_buildParts) {
return(true)
}
defineTest(qtConfTest_checkCompiler) {
contains(QMAKE_CXX, ".*clang.*") {
qtRunLoggedCommand("$$QMAKE_CXX -v 2>&1", versionstr)|return(false)
versionstr = "$$versionstr"
contains(versionstr, "^Apple (clang|LLVM) version .*") {
$${1}.compilerDescription = "Apple Clang"
$${1}.compilerId = "apple_clang"
$${1}.compilerVersion = $$replace(versionstr, "^Apple (clang|LLVM) version ([0-9.]+).*$", "\\2")
} else: contains(versionstr, ".*clang version.*") {
$${1}.compilerDescription = "Clang"
$${1}.compilerId = "clang"
$${1}.compilerVersion = $$replace(versionstr, "^.*clang version ([0-9.]+).*", "\\1")
} else {
return(false)
}
} else: contains(QMAKE_CXX, ".*g\\+\\+.*") {
qtRunLoggedCommand("$$QMAKE_CXX -dumpversion", version)|return(false)
$${1}.compilerDescription = "GCC"
$${1}.compilerId = "gcc"
$${1}.compilerVersion = $$version
} else: contains(QMAKE_CXX, ".*icpc") {
qtRunLoggedCommand("$$QMAKE_CXX -dumpversion", version)|return(false)
$${1}.compilerDescription = "ICC"
$${1}.compilerId = "icc"
$${1}.compilerVersion = $$version
} else: msvc {
command = $$QMAKE_CXX /EP /nologo $$source $$system_quote($$QMAKE_CONFIG_TESTS_DIR/win/msvc_version.cpp)
qtRunLoggedCommand("$$command", version)|return(false)
version = "$$version"
$${1}.compilerDescription = "MSVC"
$${1}.compilerId = "cl"
$${1}.compilerVersion = $$replace(version, "^.*([0-9]{2})([0-9]{2})([0-9]{5}).*$", "\\1.\\2.\\3")
} else {
return(false)
}
$${1}.compilerDescription += $$eval($${1}.compilerVersion)
export($${1}.compilerDescription)
export($${1}.compilerId)
export($${1}.compilerVersion)
$${1}.cache += compilerDescription compilerId compilerVersion
export($${1}.cache)
return(true)
}
# custom outputs
# this reloads the qmakespec as completely as reasonably possible.
@ -453,13 +409,15 @@ defineTest(reloadSpec) {
}
# nobody's going to try to re-load the features above,
# so don't bother with being selective.
QMAKE_INTERNAL_INCLUDED_FEATURES =
QMAKE_INTERNAL_INCLUDED_FEATURES = \
# loading it gets simulated below.
$$[QT_HOST_DATA/src]/mkspecs/features/device_config.prf \
# must be delayed until qdevice.pri is ready.
$$[QT_HOST_DATA/src]/mkspecs/features/mac/toolchain.prf \
$$[QT_HOST_DATA/src]/mkspecs/features/toolchain.prf
_SAVED_CONFIG = $$CONFIG
load(spec_pre)
load(device_config) # avoid that the spec loads it later.
# discard possible settings from an earlier configure run.
discard_from($$[QT_HOST_DATA/get]/mkspecs/qdevice.pri)
# qdevice.pri gets written too late (and we can't write it early
# enough, as it's populated in stages, with later ones depending
# on earlier ones). so inject its variables manually.
@ -502,6 +460,10 @@ defineTest(qtConfOutput_prepareSpec) {
QMAKESPEC = $$[QT_HOST_DATA/src]/mkspecs/$$XSPEC
export(QMAKESPEC)
notes = $$cat($$OUT_PWD/.config.notes, lines)
!isEmpty(notes): \
qtConfAddNote("Also available for $$notes")
# deviceOptions() below contains conditionals coming form the spec,
# so this cannot be delayed for a batch reload.
reloadSpec()
@ -623,9 +585,8 @@ defineTest(qtConfOutput_prepareOptions) {
export($${currentConfig}.output.devicePro)
# reload the spec to make the settings actually take effect.
!isEmpty($${currentConfig}.output.devicePro): \
reloadSpec()
# if any settings were made, the spec will be reloaded later
# to make them take effect.
}
defineTest(qtConfOutput_machineTuple) {
@ -710,6 +671,7 @@ defineReplace(printHostPaths) {
$$printInstallPath(HostLibraries, hostlibdir, lib) \
$$printInstallPath(HostData, hostdatadir, .) \
"Sysroot=$$config.input.sysroot" \
"SysrootifyPrefix=$$qmake_sysrootify" \
"TargetSpec=$$XSPEC" \
"HostSpec=$$[QMAKE_SPEC]"
return($$ret)
@ -818,40 +780,56 @@ defineTest(qtConfOutput_preparePaths) {
addConfStr($$config.rel_input.examplesdir)
addConfStr($$config.rel_input.testsdir)
QT_CONFIGURE_STR_OFFSETS_ALL = $$QT_CONFIGURE_STR_OFFSETS
QT_CONFIGURE_STRS_ALL = $$QT_CONFIGURE_STRS
QT_CONFIGURE_STR_OFFSETS =
QT_CONFIGURE_STRS =
addConfStr($$config.input.sysroot)
addConfStr($$qmake_sysrootify)
addConfStr($$config.rel_input.hostbindir)
addConfStr($$config.rel_input.hostlibdir)
addConfStr($$config.rel_input.hostdatadir)
addConfStr($$XSPEC)
addConfStr($$[QMAKE_SPEC])
$${currentConfig}.output.qconfigSource = \
"/* Installation date */" \
"static const char qt_configure_installation [12+11] = \"qt_instdate=2012-12-20\";" \
"" \
"/* Installation Info */" \
"static const char qt_configure_prefix_path_str [12+256] = \"qt_prfxpath=$$config.input.prefix\";" \
"$${LITERAL_HASH}ifdef QT_BUILD_QMAKE" \
"static const char qt_configure_ext_prefix_path_str [12+256] = \"qt_epfxpath=$$config.input.extprefix\";" \
"static const char qt_configure_host_prefix_path_str [12+256] = \"qt_hpfxpath=$$config.input.hostprefix\";" \
"$${LITERAL_HASH}endif" \
"" \
"static const short qt_configure_str_offsets[] = {" \
$$QT_CONFIGURE_STR_OFFSETS_ALL \
"$${LITERAL_HASH}ifdef QT_BUILD_QMAKE" \
$$QT_CONFIGURE_STR_OFFSETS \
"$${LITERAL_HASH}endif" \
"};" \
"static const char qt_configure_strs[] =" \
$$QT_CONFIGURE_STRS_ALL \
"$${LITERAL_HASH}ifdef QT_BUILD_QMAKE" \
$$QT_CONFIGURE_STRS \
"$${LITERAL_HASH}endif" \
";" \
"" \
"$${LITERAL_HASH}define QT_CONFIGURE_SETTINGS_PATH \"$$config.rel_input.sysconfdir\"" \
"" \
"$${LITERAL_HASH}define QT_CONFIGURE_PREFIX_PATH qt_configure_prefix_path_str + 12"
"$${LITERAL_HASH}ifdef QT_BUILD_QMAKE" \
"$${LITERAL_HASH} define QT_CONFIGURE_SYSROOTIFY_PREFIX $$qmake_sysrootify" \
"$${LITERAL_HASH}endif" \
"" \
"$${LITERAL_HASH}define QT_CONFIGURE_PREFIX_PATH qt_configure_prefix_path_str + 12" \
"$${LITERAL_HASH}ifdef QT_BUILD_QMAKE" \
"$${LITERAL_HASH} define QT_CONFIGURE_EXT_PREFIX_PATH qt_configure_ext_prefix_path_str + 12" \
"$${LITERAL_HASH} define QT_CONFIGURE_HOST_PREFIX_PATH qt_configure_host_prefix_path_str + 12" \
"$${LITERAL_HASH}endif"
export($${currentConfig}.output.qconfigSource)
# populate qmake/builtin-qt.conf
$${currentConfig}.output.builtinQtConf = \
" " \
"===========================================================" \
"==================== qt.conf beginning ====================" \
"===========================================================" \
"[Paths]" \
"ExtPrefix=$$config.input.extprefix" \
"Prefix=$$config.input.prefix" \
$$printInstallPaths() \
"Settings=$$config.rel_input.sysconfdir" \
$$printHostPaths()
export($${currentConfig}.output.builtinQtConf)
# create bin/qt.conf. this doesn't use the regular file output
# mechanism, as the file is relied upon by configure tests.
@ -871,6 +849,22 @@ defineTest(qtConfOutput_preparePaths) {
"Prefix=$$QT_SOURCE_TREE"
write_file($$QT_BUILD_TREE/bin/qt.conf, cont)|error()
reload_properties()
# if a sysroot was configured, the spec will be reloaded later,
# as some specs contain $$[SYSROOT] references.
}
defineTest(qtConfOutput_reloadSpec) {
!isEmpty($${currentConfig}.output.devicePro)| \
!isEmpty(config.input.sysroot): \
reloadSpec()
bypassNesting() {
QMAKE_INTERNAL_INCLUDED_FEATURES -= \
$$[QT_HOST_DATA/src]/mkspecs/features/mac/toolchain.prf \
$$[QT_HOST_DATA/src]/mkspecs/features/toolchain.prf
load(toolchain)
}
}
defineTest(qtConfOutput_shared) {
@ -968,25 +962,6 @@ defineTest(qtConfOutput_debugAndRelease) {
}
}
defineTest(qtConfOutput_compilerVersion) {
!$${2}: return()
name = $$upper($$eval($${currentConfig}.tests.compiler.compilerId))
version = $$eval($${currentConfig}.tests.compiler.compilerVersion)
major = $$section(version, '.', 0, 0)
minor = $$section(version, '.', 1, 1)
patch = $$section(version, '.', 2, 2)
isEmpty(minor): minor = 0
isEmpty(patch): patch = 0
$${currentConfig}.output.publicPro += \
"QT_$${name}_MAJOR_VERSION = $$major" \
"QT_$${name}_MINOR_VERSION = $$minor" \
"QT_$${name}_PATCH_VERSION = $$patch"
export($${currentConfig}.output.publicPro)
}
defineTest(qtConfOutput_compilerFlags) {
# this output also exports the variables locally, so that subsequent compiler tests can use them

497
dist/changes-5.8.0 vendored Normal file
View File

@ -0,0 +1,497 @@
Qt 5.8 introduces many new features and improvements as well as bugfixes
over the 5.7.x series. For more details, refer to the online documentation
included in this distribution. The documentation is also available online:
http://doc.qt.io/qt-5/index.html
The Qt version 5.8 series is binary compatible with the 5.7.x series.
Applications compiled for 5.7 will continue to run with 5.8.
Some of the changes listed in this file include issue tracking numbers
corresponding to tasks in the Qt Bug Tracker:
https://bugreports.qt.io/
Each of these identifiers can be entered in the bug tracker to obtain more
information about a particular change.
This release contains all fixes included in the Qt 5.7.1 release.
****************************************************************************
* License Changes *
****************************************************************************
Static libraries that are linked into executables (winmain and
qopenglextensions) are now licensed under BSD _and_ commercial licenses.
****************************************************************************
* Deprecation Notice *
****************************************************************************
- The following platforms or toolchains are deprecated and will be
removed as of Qt 5.9:
* Apple OS X Mavericks (v10.9)
* Apple iOS 7.x
Deprecated platforms and toolchains continue to work until removed.
- The Q_OBJECT_CHECK macro is deprecated and will be removed in Qt 6. The
internal, template function qt_check_for_QOBJECT_macro that it created in
QObject-derived classes will be removed in Qt 5.9.
****************************************************************************
* Important Behavior Changes *
****************************************************************************
- Support for the following platforms was removed in this version:
* Apple OS X Mountain Lion (v10.8)
* Apple iOS 6.x
configure & build system
------------------------
- The configuration system has been rewritten almost from scratch. This
improved the consistency between builds on Unix and Windows, but some
subtle unintended behavior changes are also possible. Also, some
obsolete options have been entirely removed and will now cause errors.
- It is not permissible any more to manually #define QT_NO_<FEATURE>
anywhere. Instead, configure's -no-feature-* options must be used.
Note that this does not apply to defines which modify behavior rather
than entirely removing features.
- Configure test results are now cached. Use -recheck or -recheck-all
to discard them.
- [QTBUG-32530][QTBUG-42962] The Unix configure won't pick up CFLAGS and
related environment variables any more. Instead, it now accepts QMAKE_*
variable assignments on the command line.
- [QTBUG-52266] Configure won't pick up QMAKESPEC from the environment
any more. Use the -platform option instead.
- Device and simulator libraries are now combined on Apple device
platforms (iOS). This means that there will no longer be any
*_simulator.a libraries and the simulator architectures will simply
reside alongside the device architectures in a single Mach-O file.
- [Darwin] Project files may not override QMAKE_MAC_SDK any more.
QtCore
------
- qFatal will now use std::abort to terminate the application on all
operating systems. Previously, ::abort() or ::exit(1) were called,
depending on the operating system.
- QLibraryInfo::licensee()/licensedProducts() were deprecated and
return empty strings now.
- Destroying a QThread which is still running will now result in
immediate and abnormal program termination.
QtGui
-----
- [QTBUG-54936] QFont::toString() and QFont::key() were modified to save
the font's style name if one is set, invalidating any stored font
identifiers. QFont::fromString() was also adjusted to accommodate the
change.
QtNetwork
---------
- Proxies from system settings will now be used by default. Configure
with -no-system-proxies to disable.
- [QTBUG-53649] libproxy is now turned off by default. Configure with
-libproxy in order to enable it again.
****************************************************************************
* Library *
****************************************************************************
QtCore
------
- Disambiguated the relational operators comparing QByteArray with
QStringRef (and vice versa).
- Added qHash() overloads for QHash, QMultiHash.
- Added QDeadlineTimer, a counterpart to QElapsedTimer, used to mark a
time point in the future (a deadline) and determine whether such a
deadline has passed.
- Qt now relies on type traits from the C++11 standard library.
- [QTBUG-54981] Added Q_NAMESPACE, which can be used to add Q_ENUM_NS/
Q_ENUMS, Q_FLAG_NS/Q_FLAGS and Q_CLASSINFO to a namespace.
- Q_IS_ENUM was deprecated. Use std::is_enum<>::value instead.
- QChar:
* Added missing operator{<,>,<=,>=} comparing against QLatin1String and
QStringRef.
* Added missing operator{==,!=} comparing against QLatin1String.
- QCommandLineOption:
* Added flags() and setFlags() methods. Added ShortOptionStyle and
HiddenFromHelp flags.
- QDateTime:
* Introduced toSecsSinceEpoch, fromSecsSinceEpoch and setSecsSinceEpoch
functions, which use 64-bit integers to represent the number of
seconds.
* The toTime_t, fromTime_t and setTime_t functions are deprecated and
will be removed in Qt 6.0. For new code, use the equivalent functions
with "SecsSinceEpoch" in the name, or the equivalent ones with
millisecond accurancy that have existed since Qt 4.7.
* Added string formatting type Qt::ISODateWithMs.
- QFileInfo:
* QFileInfo now reports file times with millisecond precision on Unix
systems.
- QFileSystemWatcher:
* [QTBUG-55896] Fixed a bug that caused QFileSystemWatcher to mis-handle
file paths that contained non-US-ASCII characters on Apple platforms.
- QJsonDocument:
* [QTBUG-39751] fromVariant can now take a QVariantHash argument.
* Fixed a number of bugs that could cause crashes when loading corrupt
binary JSON data.
- QJsonValue:
* [QTBUG-43077] QJsonValue(Null).toVariant() now returns a QVariant of
type QMetaType::Nullptr instead of an invalid QVariant.
- QLatin1String:
* Added at(), operator[](), mid(), right(), left().
- QLibraryInfo:
* Added QLibraryInfo::version(), which returns the current version of
the Qt library as a QVersionNumber object.
- QLine/QLineF:
* Added center().
- QLockFile:
* Fixed a bug that caused QLockFile to over-sleep while waiting for the
lock file to become available.
- QMetaType:
* std::nullptr_t is now a built-in Qt metatype.
- QModelIndex:
* QModelIndex::child has been deprecated due to its lack of generality.
Use model->index(row, column, index) instead.
- QMutex:
* QMutex now fully models the TimedLockable concept by providing the
try_lock, try_lock_for and try_lock_until functions, therefore making
it usable in Standard Library lock management classes and functions.
- QObject:
* The QT_NO_NARROWING_CONVERSIONS_IN_CONNECT macro has been added. When
using the new connection syntax (PMF-based) this macro makes it
illegal to narrow the arguments carried by the signal, and/or to
perform floating point to integral implicit conversions on them. When
the macro is defined, depending on your compiler a QObject::connect()
statement triggering such conversions will now fail to compile.
- QPersistentModelIndex:
* QPersistentModelIndex::child has been deprecated due to its lack of
generality. Use model->index(row, column, index) instead.
- QStringList:
* Added join(QLatin1String) overload.
- QStringRef:
* Added missing operator{<,>,<=,>=} comparing against QLatin1String and
QString.
- QSysInfo:
* The output of QSysInfo::prettyProductName now includes the Windows
OS/kernel version number. In case of future versions of Windows, a
valid string is now returned.
- QSettings:
* [QTBUG-56124] Fixed a bug that caused QSettings to fail on Apple
platforms when strings with embedded null (\0) bytes were present
- QSharedPointer:
* [QTBUG-52369] Fixed a bug that caused QSharedPointer to fail to compile
if it was initialized with a nullptr literal.
* Fixed a bug that made QSharedPointer delete the pointer it held with the
wrong destructor if the type of the QSharedPointer and that of the object
passed on the constructor were different. Its behavior is now the same as
std::shared_ptr.
- QStandardPaths:
* [QTBUG-55507] Fixed the QStandardPaths::FontsLocation on XDG systems to
be $XDG_DATA_DIR/fonts.
* Fixed handling of potential paths that do not exist on Windows. Now,
QStandardPaths may return storage locations that may not exist on all
platforms.
- QTimer:
* Added support for std::chrono duration objects for QTimer methods,
like QTimer::singleShot and QTimer::setInterval.
- QWaitCondition:
* Added notify_one() and notify_all() to make QWaitCondition be usable from
algorithms that use the Standard Library naming convention.
QtDBus
------
- QDBusConnection:
* Fixed a bug that would cause QDBusConnection::connect() to return true
if a slot was already connected to the same D-Bus signal. QtDBus does
not support multiple connections.
QtGui
-----
- [QFileDialogOptions/QFontDialogOptions/QMessageDialogOptions/
QColorDialogOptions] These classes no longer have value semantics, but
need to be held in QSharedPointer (as they always were). To copy an
instance, use the clone() method.
- QOpenGLTextureBlitter, a utility class to draw textured quads, has been
made public.
- [QTBUG-38825] Fixed QTextEdit to match undo functionality of QLineEdit
to group two sequential inserts into one undo action.
- [QTBUG-51844] Added rotation and uniqueId properties to
QTouchEvent::TouchPoint. This is mainly for the benefit of the TUIO
plugin so far: it now supports tracking physical objects (fiducials)
on the touchscreen surface, as long as the object's ID can fit in a
64-bit integer. QPointingDeviceUniqueId is a wrapper for the ID,
designed to be extensible to support other types of IDs in the future.
- [QTBUG-52510] A stationary touchpoint event is delivered if its
velocity changes. This is to ensure that the application will be
notified when a TUIO fiducial object comes to rest.
- [QTBUG-53076] Add QGuiApplication::applicationDisplayNameChanged()
signal.
- QAbstractTextDocumentLayout:
* Added imageAt() and formatAt() methods, which respectively can be used
to retrieve the source link of the image under the cursor, or the
QTextFormat of the text under the cursor.
- QFont:
* [QTBUG-48043] The default value of QFont::stretch() is now 0 to
indicate any default stretch is acceptable.
- QRegion:
* Is now iterable as a container of QRects: added {c,}{r,}{begin,end}().
- Text handling:
* [QTBUG-51411] Fixed performance hit from showing large QTextDocuments
in a QTextEdit or QTextBrowser. (Regression introduced in Qt 5.3.0)
* [QTBUG-50090] Fixed line spacing with some scalable fonts containing
bitmaps with the Freetype font engine.
* [QTBUG-56346] Fixed QStaticText when manually breaking lines and no
text width was set.
* [QTBUG-56659] Fixed a regression where raster fonts on Windows were
detected as smoothly scalable and thus rendering with said fonts in Qt
Quick would break.
* [QTBUG-51223] Fixed synthesized oblique for non-latin text on
platforms using the basic font database, such as Android.
* [QTBUG-56672] Fixed list of supported sizes for bitmap fonts on
Windows.
* [QTBUG-56714] Fixed a bug where a no-break space would sometimes cause
the first character of the containing line to not be displayed.
* [QTBUG-55856] Fixed rendering of large fonts when a device pixel ratio
is set and the Freetype engine is used.
QtNetwork
---------
- Added QNetworkDatagram class, along with new function receiveDatagram()
in QUdpSocket that returns it, and an overload to writeDatagram() that
can accept it.
- Added QSctpServer and QSctpSocket classes. Note that these need to be
explicitly enabled via a configure option.
- [QTBUG-50956] Added support for HTTP/2 protocol
- QSslSocket:
* [QTBUG-39077] TLS PSK ciphers are possible in server sockets.
* It is now possible to set custom Diffie-Hellman parameters for
QSslSocket-based servers.
- QTcpServer:
* [QTBUG-51288] It is now possible to use QTcpServer with an externally
created QTcpSocket.
QtSql
-----
- QSqlDatabase:
* When connecting to a MySQL server whose version is 5.5.3 or higher,
the default connection charset is now utf8mb4 instead of utf8 to allow
4-byte UTF-8 encodings.
- SQLite:
* Added notification feature to SQLite driver
QTestLib
--------
- [QTBUG-44030] Added QTest::createTouchDevice() for use in autotests
which generate touch events.
- Added ref-cycles perf counter.
- QFETCH variables can now be declared const (QFETCH(const T, name)).
- It is now possible to use variables of types with an explicit operator
bool in the QVERIFY macro.
QtWidgets
---------
- QFormLayout:
* [QTBUG-15990] Added removeRow(), takeRow().
- QMainWindow:
* [QTBUG-56628] Fixed crash using takeCentralWidget when the central
widget was not set.
****************************************************************************
* Platform-specific Changes *
****************************************************************************
- Added technology preview support for Apple tvOS and Apple watchOS.
- Added initial support for Microsoft Visual Studio 2017, which uses the
mkspec "win32-msvc2017". Full support will happen after the final release
of that compiler.
Android
-------
- [QTBUG-48948] Show password while typing is now supported
- [QTBUG-55035][QTBUG-50759] Introduced a mechanism to forward
permission related callbacks on Activity objects to interested
parties.
Apple platforms
---------------
- Added QImage::toCGImage() that returns a CGImage.
- Added functions that convert Qt types QPoint/QPointF, QRect/QRectF and
QSize/QSizeF to and from CGPoint, CGRect and CGSize. Note that QPoint,
QRect and QSize do not provide fromCGXxx functions since that would
silently lose precision.
iOS
---
- Precompiled headers are now supported on iOS.
- Starting from iOS 10, Apple requires all apps that need access to photos
to have the key 'NSPhotoLibraryUsageDescription' in the Info.plist.
Therefore, to get the same support in Qt (when, e.g., using a file
dialog), the Info.plist assigned to QMAKE_INFO_PLIST will need this key
as well.
macOS
-----
- Speech to text dictation now works for Qt text input.
- [QTBUG-33708] Fixed underline position in font rendering.
Linux
-----
- [QTBUG-39959] QWidget-based applications running on the eglfs platform
plugin can now request 180 or 90 degrees rotated output by setting the
QT_QPA_EGLFS_ROTATION environment variable.
- KDE/Gnome themes now implement QPlatformTheme::fileIconPixmap(), showing
file icons.
Windows
-------
- [QTBUG-31476] QFactoryLoader now filters potential plugins by the
".dll" suffix.
- [QTBUG-56239] 'What's this' button is now shown by default only for
QWidget dialogs.
- [QTBUG-53833] QProcess::startDetached() changed behavior on Windows:
it no longer creates a new console window unconditionally, instead it
passes the same creation flags to CreateProcess as QProcess::start().
- Text handling:
* [QTBUG-54740] Fixed embedding fonts in PDF when dpi scaling is active
or when the hinting preference was none or vertical hinting.
* [QTBUG-47485] Fix selecting non-regular fonts when using the Freetype
engine.
* [QTBUG-49346] Fixed rendering error when using the MingLiU fonts at
certain combinations of pixel size and scale.
****************************************************************************
* Tools *
****************************************************************************
configure & build system
------------------------
- The -no-feature-* option family was integrated with the rest of the
configuration system. Numerous existing features were made optional,
and build problems in various reduced configurations were fixed.
This is an ongoing effort known as "Qt Lite".
- Numerous Qt modules outside qtbase now support configure options.
In a module-by-module build, these can be passed to qmake itself,
after a -- option.
- Introduced the qtConfig(<feature>) qmake function to replace the
patterns contains(QT_CONFIG, <feature>) and load(qfeatures)+
contains(QT_DISABLED_FEATURES, <feature>).
Likewise, the C++ macro QT_CONFIG(<feature>) was introduced to
replace the pattern !defined(QT_NO_<FEATURE>).
The old methods are effectively deprecated and will stop working at
some point in the near future.
- Use of -sysroot will now trigger a cross-build even if -platform and
-xplatform are the same.
- The JPEG & GIF handlers and the SQL drivers are now always built as
plugins, even in static builds (static "plugins" in this case).
- [GCC] Include paths from system libraries are now marked as such,
resulting in fewer warnings the user cannot do anything about.
- [Windows] config.status.bat is now created, like on Unix.
- [QTBUG-46974] Fixed location of config.status in top-level builds.
- [QTBUG-38792][Unix] The -redo option is now accepted, like on Windows.
- It's now possible to add more arguments when -redo is used. Note that
these arguments are not saved in turn. Likewise for config.status.
- [QTBUG-32896][iOS/clang] Added missing CFBundleIdentifier to library
template.
- [QTBUG-47624] Fixed abort when some, but not all, XCB dependencies
are met. The feature is now disabled instead, as expected.
- [QTBUG-50838] The Raspberry Pi EGL detection now uses pkg-config.
- [QTBUG-52112][Android] Plugins now have a SONAME, as required by
Android 6+.
- [QTBUG-54438] Fixed launching tests, examples, and build tools in
some configurations.
- [QTBUG-56289][GCC@Windows] Fixed -separate-debug-info.
- [QTBUG-57086] Added support for Visual Studio 2017.
qdbusxml2cpp
------------
- [QTBUG-34126] qdbusxml2cpp now supports the --verbose switch, which
provides more details when parsing invalid XML sources.
qmake
-----
- Added the $$take_first(), $$take_last(), $$num_add(), $$str_size(),
$$str_member(), and $$sorted() functions.
- The error() function can now be called without arguments to exit
silently. Use after write_file() and similar functions which already
print an error message.
- The $$system() function can return the command's exit code now.
- The $$prompt() function can now print the prompt verbatim.
- QMAKE_EXTRA_TARGETS will now consistently treat the target as a file
name (separator adjustment and quoting).
- [QTBUG-16904][VS] Fixed warning about circular dependencies when
Q_OBJECT is used in .cpp files.
- [QTBUG-36256] packageExists() and PKGCONFIG can now be used
regardless of whether Qt itself was built with pkg-config support.
- [QTBUG-43468][WinRT] Added option to use verbatim manifest files.
- [QTBUG-53905] Fixed OBJECTIVE_SOURCES being moc'd twice.
- [QTBUG-55591][VS2015] Added support for the /DEBUG:FASTLINK option.
- [QTBUG-56507] Fixed parallel builds when a lex source refers to a
file generated from a yacc source.
- [QTBUG-56594][MSVC] Fixed PDB files not being installed for static
libraries.
moc
---
- [MSVC] qmake and moc now cooperate to use the Visual Studio environment
variables (set by the VCVARSALL.BAT script) to find system include
files. A possible consequence is that moc parses application headers
slightly differently, depending on #if conditions that depended on
macros that previous versions had not seen #define'd. Implementers of
other buildsystems are advised to pass the --compiler-flavor=msvc option
to moc.

View File

@ -3,7 +3,7 @@
dita.metadata.default.author = Qt Project
dita.metadata.default.permissions = all
dita.metadata.default.publisher = Qt Project
dita.metadata.default.copyryear = 2016
dita.metadata.default.copyryear = 2017
dita.metadata.default.copyrholder = The Qt Company Ltd
dita.metadata.default.audience = programmer

View File

@ -78,7 +78,7 @@ HTML.footer += \
" <ul id=\"menu-footer-submenu\" class=\"right clearfix\"><li id=\"menu-item-1795\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-1795\"><a title=\"Sign into your account.\" href=\"https://account.qt.io/login\">Sign In</a></li>\n" \
" <li id=\"menu-item-10375\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-10375\"><a href=\"mailto:feedback@theqtcompany.com?Subject=Feedback%20about%20doc.qt.io%20site\">Feedback</a></li>\n" \
" <li id=\"menu-item-1494\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1494\"><a href=\"http://qt.io/contact-us/\">Contact us</a></li>\n" \
" <li id=\"menu-item-4472\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4472\"><a href=\"http://qt.io/about-us/\">© 2016 The Qt Company</a></li>\n" \
" <li id=\"menu-item-4472\" class=\"menu-item menu-item-type-custom menu-item-object-custom menu-item-4472\"><a href=\"http://qt.io/about-us/\">© 2017 The Qt Company</a></li>\n" \
" </ul>\n" \
"</div>\n" \
"</div>\n" \

View File

@ -8,7 +8,7 @@ HTML.footer = \
"</div>\n" \
"<div class=\"footer\">\n" \
" <p>\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2016 The Qt Company Ltd.\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2017 The Qt Company Ltd.\n" \
" Documentation contributions included herein are the copyrights of\n" \
" their respective owners.<br>" \
" The documentation provided herein is licensed under the terms of the" \

View File

@ -171,6 +171,7 @@ Cpp.ignoretokens += \
QT_END_NAMESPACE \
QT_FASTCALL \
QT_MUTEX_LOCK_NOEXCEPT \
QT_SIZEPOLICY_CONSTEXPR \
QT_WARNING_DISABLE_DEPRECATED \
QT_WARNING_PUSH \
QT_WARNING_POP \

View File

@ -5,7 +5,7 @@
HTML.footer = \
" </div>\n" \
" <p class=\"copy-notice\">\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2016 The Qt Company Ltd.\n" \
" <acronym title=\"Copyright\">&copy;</acronym> 2017 The Qt Company Ltd.\n" \
" Documentation contributions included herein are the copyrights of\n" \
" their respective owners. " \
" The documentation provided herein is licensed under the terms of the" \

View File

@ -1,6 +1,6 @@
requires(qtHaveModule(widgets))
TEMPLATE = subdirs
# no QSharedMemory
!vxworks:!integrity: SUBDIRS = sharedmemory
qtConfig(sharedmemory): SUBDIRS = sharedmemory
qtHaveModule(network): SUBDIRS += localfortuneserver localfortuneclient

View File

@ -122,8 +122,7 @@ Client::Client(QWidget *parent)
//! [2] //! [3]
connect(tcpSocket, &QIODevice::readyRead, this, &Client::readFortune);
//! [2] //! [4]
typedef void (QAbstractSocket::*QAbstractSocketErrorSignal)(QAbstractSocket::SocketError);
connect(tcpSocket, static_cast<QAbstractSocketErrorSignal>(&QAbstractSocket::error),
connect(tcpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),
//! [3]
this, &Client::displayError);
//! [4]

View File

@ -95,9 +95,7 @@ PaintedWindow::PaintedWindow()
connect(screen(), &QScreen::orientationChanged, this, &PaintedWindow::orientationChanged);
connect(m_animation, &QAbstractAnimation::finished, this, &PaintedWindow::rotationDone);
typedef void (PaintedWindow::*PaintedWindowVoidSlot)();
connect(this, &PaintedWindow::rotationChanged,
this, static_cast<PaintedWindowVoidSlot>(&PaintedWindow::paint));
connect(this, &PaintedWindow::rotationChanged, this, QOverload<>::of(&PaintedWindow::paint));
}
void PaintedWindow::exposeEvent(QExposeEvent *)

View File

@ -61,8 +61,6 @@
#include "glwidget.h"
typedef void (QWidget::*QWidgetVoidSlot)();
MainWindow::MainWindow()
: m_nextX(1), m_nextY(1)
{
@ -131,14 +129,11 @@ MainWindow::MainWindow()
QMenu *helpMenu = menuBar()->addMenu("&Help");
helpMenu->addAction("About Qt", qApp, &QApplication::aboutQt);
connect(m_timer, &QTimer::timeout,
glwidget, static_cast<QWidgetVoidSlot>(&QWidget::update));
connect(m_timer, &QTimer::timeout, glwidget, QOverload<>::of(&QWidget::update));
connect(slider, &QAbstractSlider::valueChanged, glwidget, &GLWidget::setScaling);
connect(transparent, &QCheckBox::toggled, glwidget, &GLWidget::setTransparent);
typedef void (QSpinBox::*QSpinBoxIntSignal)(int);
connect(updateInterval, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
connect(updateInterval, QOverload<int>::of(&QSpinBox::valueChanged),
this, &MainWindow::updateIntervalChanged);
connect(timerBased, &QCheckBox::toggled, this, &MainWindow::timerUsageChanged);
connect(timerBased, &QCheckBox::toggled, updateInterval, &QWidget::setEnabled);
@ -162,7 +157,7 @@ void MainWindow::addNew()
return;
GLWidget *w = new GLWidget(this, false, qRgb(qrand() % 256, qrand() % 256, qrand() % 256));
m_glWidgets << w;
connect(m_timer, &QTimer::timeout, w, static_cast<QWidgetVoidSlot>(&QWidget::update));
connect(m_timer, &QTimer::timeout, w, QOverload<>::of(&QWidget::update));
m_layout->addWidget(w, m_nextY, m_nextX, 1, 1);
if (m_nextX == 3) {
m_nextX = 1;

View File

@ -173,8 +173,6 @@ void OpenGLWindow::keyPressEvent(QKeyEvent *e)
void OpenGLWindow::setAnimating(bool enabled)
{
typedef void (QPaintDeviceWindow::*QPaintDeviceWindowVoidSlot)();
if (enabled) {
// Animate continuously, throttled by the blocking swapBuffers() call the
// QOpenGLWindow internally executes after each paint. Once that is done
@ -182,11 +180,11 @@ void OpenGLWindow::setAnimating(bool enabled)
// obviously assumes that the swap interval (see
// QSurfaceFormat::setSwapInterval()) is non-zero.
connect(this, &QOpenGLWindow::frameSwapped,
this, static_cast<QPaintDeviceWindowVoidSlot>(&QPaintDeviceWindow::update));
this, QOverload<>::of(&QPaintDeviceWindow::update));
update();
} else {
disconnect(this, &QOpenGLWindow::frameSwapped,
this, static_cast<QPaintDeviceWindowVoidSlot>(&QPaintDeviceWindow::update));
this, QOverload<>::of(&QPaintDeviceWindow::update));
}
}

View File

@ -5,5 +5,3 @@ HEADERS += imagescaling.h
target.path = $$[QT_INSTALL_EXAMPLES]/qtconcurrent/imagescaling
INSTALLS += target
wince: DEPLOYMENT_PLUGIN += qgif qjpeg

View File

@ -15,8 +15,3 @@ build_all:!build_pass {
# install
target.path = $$[QT_INSTALL_EXAMPLES]/sql/sqlbrowser
INSTALLS += target
wince {
DEPLOYMENT_PLUGIN += qsqlite
}

View File

@ -7,6 +7,4 @@ QT += sql widgets
target.path = $$[QT_INSTALL_EXAMPLES]/sql/sqlwidgetmapper
INSTALLS += target
wince: DEPLOYMENT_PLUGIN += qsqlite

View File

@ -70,8 +70,7 @@ Screenshot::Screenshot()
delaySpinBox->setSuffix(tr(" s"));
delaySpinBox->setMaximum(60);
typedef void (QSpinBox::*QSpinBoxIntSignal)(int);
connect(delaySpinBox, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
connect(delaySpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &Screenshot::updateCheckBox);
hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"), optionsGroupBox);

View File

@ -80,8 +80,7 @@ Window::Window()
connect(showMessageButton, &QAbstractButton::clicked, this, &Window::showMessage);
connect(showIconCheckBox, &QAbstractButton::toggled, trayIcon, &QSystemTrayIcon::setVisible);
typedef void (QComboBox::*QComboIntSignal)(int);
connect(iconComboBox, static_cast<QComboIntSignal>(&QComboBox::currentIndexChanged),
connect(iconComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &Window::setIcon);
connect(trayIcon, &QSystemTrayIcon::messageClicked, this, &Window::messageClicked);
connect(trayIcon, &QSystemTrayIcon::activated, this, &Window::iconActivated);

View File

@ -363,9 +363,10 @@ void CodeStylePage::initializePage()
baseIncludeLabel->setEnabled(!baseClass.isEmpty());
baseIncludeLineEdit->setEnabled(!baseClass.isEmpty());
QRegularExpression rx("Q[A-Z].*");
if (baseClass.isEmpty()) {
baseIncludeLineEdit->clear();
} else if (QRegExp("Q[A-Z].*").exactMatch(baseClass)) {
} else if (rx.match(baseClass).hasMatch()) {
baseIncludeLineEdit->setText('<' + baseClass + '>');
} else {
baseIncludeLineEdit->setText('"' + baseClass.toLower() + ".h\"");

View File

@ -54,6 +54,8 @@
#include "licensewizard.h"
QString emailRegExp = QStringLiteral(".+@.+");
//! [0] //! [1] //! [2]
LicenseWizard::LicenseWizard(QWidget *parent)
: QWizard(parent)
@ -189,7 +191,7 @@ EvaluatePage::EvaluatePage(QWidget *parent)
emailLabel = new QLabel(tr("&Email address:"));
emailLineEdit = new QLineEdit;
emailLineEdit->setValidator(new QRegExpValidator(QRegExp(".*@.*"), this));
emailLineEdit->setValidator(new QRegularExpressionValidator(QRegularExpression(emailRegExp), this));
emailLabel->setBuddy(emailLineEdit);
//! [21]
@ -264,7 +266,7 @@ DetailsPage::DetailsPage(QWidget *parent)
emailLabel = new QLabel(tr("&Email address:"));
emailLineEdit = new QLineEdit;
emailLineEdit->setValidator(new QRegExpValidator(QRegExp(".*@.*"), this));
emailLineEdit->setValidator(new QRegularExpressionValidator(QRegularExpression(emailRegExp), this));
emailLabel->setBuddy(emailLineEdit);
postalLabel = new QLabel(tr("&Postal address:"));

View File

@ -741,8 +741,8 @@
whitespace and one or several digits again.
The first digits of the regular expression are captured using
parentheses. This enables us to use the QRegExp::cap() or
QRegExp::capturedTexts() functions to extract the matched
parentheses. This enables us to use the QRegularExpressionMatch::captured()
or QRegularExpressionMatch::capturedTexts() functions to extract the matched
characters. If the first and second numbers of the spin box value
differ (e.g., "16 x 24"), we use the first number.

View File

@ -89,11 +89,9 @@ Window::Window()
connect(filterPatternLineEdit, &QLineEdit::textChanged,
this, &Window::filterRegExpChanged);
typedef void (QComboBox::*QComboIntSignal)(int);
connect(filterSyntaxComboBox, static_cast<QComboIntSignal>(&QComboBox::currentIndexChanged),
connect(filterSyntaxComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &Window::filterRegExpChanged);
connect(filterColumnComboBox, static_cast<QComboIntSignal>(&QComboBox::currentIndexChanged),
connect(filterColumnComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &Window::filterColumnChanged);
connect(filterCaseSensitivityCheckBox, &QAbstractButton::toggled,
this, &Window::filterRegExpChanged);

View File

@ -113,10 +113,9 @@ MainWindow::MainWindow()
connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit);
connect(aboutAction, &QAction::triggered, this, &MainWindow::showAboutBox);
//! [4]
typedef void (QSpinBox::*QSpinBoxIntSignal)(int);
connect(pixelSizeSpinBox, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
connect(pixelSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
delegate, &PixelDelegate::setPixelSize);
connect(pixelSizeSpinBox, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
connect(pixelSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &MainWindow::updateView);
//! [4]

View File

@ -282,23 +282,10 @@ void MainWindow::loadLayout()
}
}
class DockWidgetAreaCornerFunctor {
public:
explicit DockWidgetAreaCornerFunctor(QMainWindow *mw, Qt::Corner c, Qt::DockWidgetArea a)
: m_mainWindow(mw), m_area(a), m_corner(c) {}
void operator()() const { m_mainWindow->setCorner(m_corner, m_area); }
private:
QMainWindow *m_mainWindow;
Qt::DockWidgetArea m_area;
Qt::Corner m_corner;
};
static QAction *addCornerAction(const QString &text, QMainWindow *mw, QMenu *menu, QActionGroup *group,
Qt::Corner c, Qt::DockWidgetArea a)
{
QAction *result = menu->addAction(text, mw, DockWidgetAreaCornerFunctor(mw, c, a));
QAction *result = menu->addAction(text, mw, [=]() { mw->setCorner(c, a); });
result->setCheckable(true);
group->addAction(result);
return result;

View File

@ -264,16 +264,6 @@ void MainWindow::updateMenus()
#endif
}
class ActiveMdiSubWindowFunctor {
public:
explicit ActiveMdiSubWindowFunctor(QMdiArea *mdiArea, QMdiSubWindow *activeWindow) : m_mdiArea(mdiArea), m_activeWindow(activeWindow) {}
void operator()() const { m_mdiArea->setActiveSubWindow(m_activeWindow); }
private:
QMdiArea *m_mdiArea;
QMdiSubWindow *m_activeWindow;
};
void MainWindow::updateWindowMenu()
{
windowMenu->clear();
@ -302,7 +292,9 @@ void MainWindow::updateWindowMenu()
text = tr("%1 %2").arg(i + 1)
.arg(child->userFriendlyCurrentFile());
}
QAction *action = windowMenu->addAction(text, mdiSubWindow, ActiveMdiSubWindowFunctor(mdiArea, mdiSubWindow));
QAction *action = windowMenu->addAction(text, mdiSubWindow, [this, mdiSubWindow]() {
mdiArea->setActiveSubWindow(mdiSubWindow);
});
action->setCheckable(true);
action ->setChecked(child == activeMdiChild());
}

View File

@ -342,13 +342,11 @@ void TextEdit::setupTextActions()
comboStyle->addItem("Ordered List (Roman lower)");
comboStyle->addItem("Ordered List (Roman upper)");
typedef void (QComboBox::*QComboIntSignal)(int);
connect(comboStyle, static_cast<QComboIntSignal>(&QComboBox::activated), this, &TextEdit::textStyle);
connect(comboStyle, QOverload<int>::of(&QComboBox::activated), this, &TextEdit::textStyle);
typedef void (QComboBox::*QComboStringSignal)(const QString &);
comboFont = new QFontComboBox(tb);
tb->addWidget(comboFont);
connect(comboFont, static_cast<QComboStringSignal>(&QComboBox::activated), this, &TextEdit::textFamily);
connect(comboFont, QOverload<const QString &>::of(&QComboBox::activated), this, &TextEdit::textFamily);
comboSize = new QComboBox(tb);
comboSize->setObjectName("comboSize");
@ -360,7 +358,7 @@ void TextEdit::setupTextActions()
comboSize->addItem(QString::number(size));
comboSize->setCurrentIndex(standardSizes.indexOf(QApplication::font().pointSize()));
connect(comboSize, static_cast<QComboStringSignal>(&QComboBox::activated), this, &TextEdit::textSize);
connect(comboSize, QOverload<const QString &>::of(&QComboBox::activated), this, &TextEdit::textSize);
}
bool TextEdit::load(const QString &f)

View File

@ -159,8 +159,7 @@ PreviewForm::PreviewForm(QWidget *parent)
new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
okButton = buttonBox->button(QDialogButtonBox::Ok);
typedef void(QComboBox::*ComboBoxIntSignal)(int);
connect(encodingComboBox, static_cast<ComboBoxIntSignal>(&QComboBox::activated),
connect(encodingComboBox, QOverload<int>::of(&QComboBox::activated),
this, &PreviewForm::updateTextEdit);
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);

View File

@ -94,10 +94,10 @@ RegularExpressionDialog::RegularExpressionDialog(QWidget *parent)
connect(optimizeOnFirstUsageOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh);
connect(dontAutomaticallyOptimizeOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh);
connect(offsetSpinBox, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
connect(offsetSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &RegularExpressionDialog::refresh);
connect(matchTypeComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
connect(matchTypeComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &RegularExpressionDialog::refresh);
connect(anchoredMatchOptionCheckBox, &QCheckBox::toggled, this, &RegularExpressionDialog::refresh);

View File

@ -106,10 +106,9 @@ LocationDialog::LocationDialog(QWidget *parent)
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
typedef void (QComboBox::*QComboIntSignal)(int);
connect(formatComboBox, static_cast<QComboIntSignal>(&QComboBox::activated),
connect(formatComboBox, QOverload<int>::of(&QComboBox::activated),
this, &LocationDialog::updateLocationsTable);
connect(scopeComboBox, static_cast<QComboIntSignal>(&QComboBox::activated),
connect(scopeComboBox, QOverload<int>::of(&QComboBox::activated),
this, &LocationDialog::updateLocationsTable);
connect(organizationComboBox->lineEdit(),
&QLineEdit::editingFinished,
@ -117,7 +116,7 @@ LocationDialog::LocationDialog(QWidget *parent)
connect(applicationComboBox->lineEdit(),
&QLineEdit::editingFinished,
this, &LocationDialog::updateLocationsTable);
connect(applicationComboBox, static_cast<QComboIntSignal>(&QComboBox::activated),
connect(applicationComboBox, QOverload<int>::of(&QComboBox::activated),
this, &LocationDialog::updateLocationsTable);
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);

View File

@ -402,7 +402,7 @@ void AddressBook::exportAsVCard()
int index = name.indexOf(" ");
if (index != -1) {
nameList = name.split(QRegExp("\\s+"), QString::SkipEmptyParts);
nameList = name.split(QRegularExpression("\\s+"), QString::SkipEmptyParts);
firstName = nameList.first();
lastName = nameList.last();
} else {

View File

@ -74,8 +74,7 @@ MainWindow::MainWindow()
filterCombo->addItem(tr("Monospaced"), QVariant::fromValue(QFontComboBox::MonospacedFonts));
filterCombo->addItem(tr("Proportional"), QVariant::fromValue(QFontComboBox::ProportionalFonts));
filterCombo->setCurrentIndex(0);
typedef void (QComboBox::*QComboBoxIntSignal)(int);
connect(filterCombo, static_cast<QComboBoxIntSignal>(&QComboBox::currentIndexChanged),
connect(filterCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &MainWindow::filterChanged);
QLabel *fontLabel = new QLabel(tr("Font:"));
@ -114,10 +113,9 @@ MainWindow::MainWindow()
this, &MainWindow::findSizes);
connect(fontCombo, &QFontComboBox::currentFontChanged,
characterWidget, &CharacterWidget::updateFont);
typedef void (QComboBox::*QComboBoxStringSignal)(const QString &);
connect(sizeCombo, static_cast<QComboBoxStringSignal>(&QComboBox::currentIndexChanged),
connect(sizeCombo, QOverload<const QString &>::of(&QComboBox::currentIndexChanged),
characterWidget, &CharacterWidget::updateSize);
connect(styleCombo, static_cast<QComboBoxStringSignal>(&QComboBox::currentIndexChanged),
connect(styleCombo, QOverload<const QString &>::of(&QComboBox::currentIndexChanged),
characterWidget, &CharacterWidget::updateStyle);
//! [4] //! [5]
connect(characterWidget, &CharacterWidget::characterSelected,

View File

@ -71,8 +71,7 @@ QWidget *ImageDelegate::createEditor(QWidget *parent,
else if (index.column() == 2)
comboBox->addItems(IconPreviewArea::iconStateNames());
typedef void (QComboBox::*QComboBoxIntSignal)(int);
connect(comboBox, static_cast<QComboBoxIntSignal>(&QComboBox::activated),
connect(comboBox, QOverload<int>::of(&QComboBox::activated),
this, &ImageDelegate::emitCommitData);
return comboBox;

View File

@ -362,8 +362,7 @@ QWidget *MainWindow::createIconSizeGroupBox()
sizeButtonGroup = new QButtonGroup(this);
sizeButtonGroup->setExclusive(true);
typedef void (QButtonGroup::*QButtonGroupIntBoolSignal)(int, bool);
connect(sizeButtonGroup, static_cast<QButtonGroupIntBoolSignal>(&QButtonGroup::buttonToggled),
connect(sizeButtonGroup, QOverload<int, bool>::of(&QButtonGroup::buttonToggled),
this, &MainWindow::changeSize);
QRadioButton *smallRadioButton = new QRadioButton;
@ -391,8 +390,7 @@ QWidget *MainWindow::createIconSizeGroupBox()
//! [26]
//! [27]
typedef void (QSpinBox::*QSpinBoxIntSignal)(int);
connect(otherSpinBox, static_cast<QSpinBoxIntSignal>(&QSpinBox::valueChanged),
connect(otherSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
this, &MainWindow::triggerChangeSize);
QHBoxLayout *otherSizeLayout = new QHBoxLayout;

View File

@ -33,6 +33,7 @@
QMAKE_CFLAGS_OPTIMIZE = -O2
QMAKE_CFLAGS_OPTIMIZE_FULL = -O3
QMAKE_CFLAGS_OPTIMIZE_DEBUG = -Og
QMAKE_CFLAGS += -pipe
QMAKE_CFLAGS_DEPS += -M

View File

@ -8,7 +8,7 @@ QMAKE_COMPILER = ghs
QMAKE_CFLAGS += --signed_fields --no_commons --diag_suppress=1,82,228,236,381,611,961,997,1795,1974
QMAKE_CFLAGS_DEPS += -MD
QMAKE_CFLAGS_RELEASE += -Ospeed -Olink -Omax -uvfd
QMAKE_CFLAGS_RELEASE += -Ospeed -Olink -Omax
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_CFLAGS_RELEASE -g
QMAKE_CFLAGS_DEBUG += -g -Omaxdebug
QMAKE_CFLAGS_SHLIB +=
@ -34,7 +34,7 @@ QMAKE_CXXFLAGS_EXCEPTIONS_ON += --exceptions
QMAKE_LFLAGS += --signed_fields --no_commons --no_implicit_include --link_once_templates -non_shared --new_outside_of_constructor
QMAKE_LFLAGS_DEBUG += -g -Omaxdebug
QMAKE_LFLAGS_RELEASE += -Ospeed -Olink -Omax -uvfd
QMAKE_LFLAGS_RELEASE += -Ospeed -Olink -Omax
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO += $$QMAKE_LFLAGS_RELEASE -g
QMAKE_LFLAGS_CXX11 += --c++11 --thread_local_storage
QMAKE_LFLAGS_EXCEPTIONS_ON += --exceptions

View File

@ -1,12 +1,11 @@
#
# qmake configuration for Microsoft Visual Studio C/C++ Compiler
# This mkspec is used for all win32-msvcXXXX specs
# This mkspec is used by the win32-msvc and win32-clang-msvc specs
#
isEmpty(MSC_VER)|isEmpty(MSVC_VER): error("Source mkspec must set both MSC_VER and MSVC_VER.")
#
# Baseline: Visual Studio 2005 (8.0), VC++ 14.0
# Version-specific settings go in msvc-version.conf (loaded by default_pre)
#
MAKEFILE_GENERATOR = MSVC.NET
@ -14,7 +13,7 @@ QMAKE_PLATFORM = win32
QMAKE_COMPILER = msvc
CONFIG += incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe
DEFINES += UNICODE WIN32
QMAKE_COMPILER_DEFINES += _MSC_VER=$$MSC_VER _WIN32
QMAKE_COMPILER_DEFINES += _WIN32
contains(QMAKE_TARGET.arch, x86_64) {
DEFINES += WIN64
QMAKE_COMPILER_DEFINES += _WIN64
@ -104,7 +103,4 @@ VCPROJ_EXTENSION = .vcproj
VCSOLUTION_EXTENSION = .sln
VCPROJ_KEYWORD = Qt4VSv1.0
include(msvc-base.conf)
include(windows-gles.conf)
unset(MSC_VER)

View File

@ -1,6 +1,6 @@
#
# qmake configuration for Microsoft Visual Studio C/C++ Compiler
# This mkspec is used for all win32-msvcXXXX and
# This file is used by win32-msvc, win32-clang-msvc, and all
# winrt-XXX-msvcXXX specs
#
@ -8,14 +8,23 @@
# Version-specific changes
#
greaterThan(MSC_VER, 1499) {
isEmpty(QMAKE_MSC_VER): error("msvc-version.conf loaded but QMAKE_MSC_VER isn't set")
MSVC_VER = 8.0
COMPAT_MKSPEC = win32-msvc2005
greaterThan(QMAKE_MSC_VER, 1499) {
# Visual Studio 2008 (9.0) / Visual C++ 15.0 and up
MSVC_VER = 9.0
COMPAT_MKSPEC = win32-msvc2008
QMAKE_CFLAGS_MP = -MP
QMAKE_CXXFLAGS_MP = $$QMAKE_CFLAGS_MP
}
greaterThan(MSC_VER, 1599) {
greaterThan(QMAKE_MSC_VER, 1599) {
# Visual Studio 2010 (10.0) / Visual C++ 16.0 and up
MSVC_VER = 10.0
COMPAT_MKSPEC = win32-msvc2010
MAKEFILE_GENERATOR = MSBUILD
QMAKE_CFLAGS_AVX = -arch:AVX
@ -24,19 +33,23 @@ greaterThan(MSC_VER, 1599) {
VCPROJ_EXTENSION = .vcxproj
}
greaterThan(MSC_VER, 1699) {
greaterThan(QMAKE_MSC_VER, 1699) {
# Visual Studio 2012 (11.0) / Visual C++ 17.0 and up
MSVC_VER = 11.0
COMPAT_MKSPEC = win32-msvc2012
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -D_HAS_EXCEPTIONS=0
QT_CONFIG += c++11
CONFIG += c++11
}
greaterThan(MSC_VER, 1799) {
greaterThan(QMAKE_MSC_VER, 1799) {
# Visual Studio 2013 (12.0) / Visual C++ 18.0 and up
MSVC_VER = 12.0
COMPAT_MKSPEC = win32-msvc2013
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
equals(MSC_VER, 1800) {
equals(QMAKE_MSC_VER, 1800) {
QMAKE_CFLAGS_RELEASE += -Zc:strictStrings
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -Zc:strictStrings
QMAKE_CXXFLAGS_RELEASE += -Zc:strictStrings
@ -44,11 +57,26 @@ greaterThan(MSC_VER, 1799) {
}
}
greaterThan(MSC_VER, 1899) {
greaterThan(QMAKE_MSC_VER, 1899) {
# Visual Studio 2015 (14.0) / Visual C++ 19.0 and up
MSVC_VER = 14.0
COMPAT_MKSPEC = win32-msvc2015
QMAKE_CFLAGS += -Zc:strictStrings
QMAKE_CFLAGS_WARN_ON += -w44456 -w44457 -w44458
QMAKE_CFLAGS_AVX2 = -arch:AVX2
QMAKE_CXXFLAGS += -Zc:strictStrings -Zc:throwingNew
QMAKE_CXXFLAGS_WARN_ON += -w44456 -w44457 -w44458 -wd4577 -wd4467
}
greaterThan(QMAKE_MSC_VER, 1909) {
# Visual Studio 2017 (15.0) / Visual C++ 19.10 and up
MSVC_VER = 15.0
COMPAT_MKSPEC = win32-msvc2017
}
greaterThan(QMAKE_MSC_VER, 1910) {
# No compat spec past MSVC 2017
COMPAT_MKSPEC =
}
!isEmpty(COMPAT_MKSPEC):!$$COMPAT_MKSPEC: CONFIG += $$COMPAT_MKSPEC

View File

@ -9,6 +9,7 @@ QMAKE_COMPILER = msvc
QMAKE_PLATFORM = winrt win32
CONFIG = package_manifest $$CONFIG incremental flat precompile_header autogen_precompile_source debug_and_release debug_and_release_target rtti
DEFINES += UNICODE WIN32 QT_LARGEFILE_SUPPORT Q_BYTE_ORDER=Q_LITTLE_ENDIAN
QMAKE_COMPILER_DEFINES += _WIN32
DEPLOYMENT_PLUGIN += qwinrt
@ -93,9 +94,6 @@ WINRT_ASSETS_PATH = $$PWD/assets
WINRT_MANIFEST.capabilities = defaults
WINRT_MANIFEST.capabilities_device = defaults
include(../msvc-base.conf)
include(../windows-gles.conf)
unset(MSC_VER)
load(qt_config)

View File

@ -16,8 +16,6 @@
include(../common/linux_device_pre.conf)
isEmpty(VIBRANTE_SDK_TOPDIR):error("You must pass -device-option VIBRANTE_SDK_TOPDIR=/path/to/sdk")
QMAKE_INCDIR += \
$${VIBRANTE_SDK_TOPDIR}/include \
$$[QT_SYSROOT]/usr/include
@ -43,4 +41,12 @@ COMPILER_FLAGS += -mtune=cortex-a57.cortex-a53 -march=armv8-a
EGLFS_DEVICE_INTEGRATION = eglfs_kms_egldevice
include(../common/linux_arm_device_post.conf)
# override the default from linux_arm_device_post.conf
defineTest(qtConfSanitizeMkspec) {
isEmpty(VIBRANTE_SDK_TOPDIR): \
error("You must pass -device-option VIBRANTE_SDK_TOPDIR=/path/to/sdk")
deviceSanityCheckCompiler()
}
load(qt_config)

View File

@ -14,8 +14,6 @@
include(../common/linux_device_pre.conf)
isEmpty(VIBRANTE_SDK_TOPDIR):error("You must pass -device-option VIBRANTE_SDK_TOPDIR=/path/to/sdk")
QMAKE_INCDIR += \
$${VIBRANTE_SDK_TOPDIR}/include \
$$[QT_SYSROOT]/usr/include
@ -38,4 +36,12 @@ COMPILER_FLAGS += -mtune=cortex-a15 -march=armv7-a -mfpu=neon-vfpv
EGLFS_DEVICE_INTEGRATION = eglfs_kms_egldevice
include(../common/linux_arm_device_post.conf)
# override the default from linux_arm_device_post.conf
defineTest(qtConfSanitizeMkspec) {
isEmpty(VIBRANTE_SDK_TOPDIR): \
error("You must pass -device-option VIBRANTE_SDK_TOPDIR=/path/to/sdk")
deviceSanityCheckCompiler()
}
load(qt_config)

View File

@ -19,6 +19,7 @@ QMAKE_MAKE = $$(MAKE)
} else {
error("Configure tests are not supported with the $$MAKEFILE_GENERATOR Makefile generator.")
}
QMAKE_MAKE_NAME = $$basename(QMAKE_MAKE)
# Make sure we don't inherit MAKEFLAGS - -i in particular is fatal.
QMAKE_MAKE = "$${SETENV_PFX}MAKEFLAGS=$$SETENV_SFX $$QMAKE_MAKE"

View File

@ -14,12 +14,5 @@
"redo": { "type": "redo" }
}
},
"features": {
"builtins": {
"output": [ "builtins" ]
}
}
}

View File

@ -0,0 +1,28 @@
// Keep this file small. The pre-processed contents are eval'd by qmake.
#ifdef _MSC_VER
QMAKE_MSC_VER = _MSC_VER
QMAKE_MSC_FULL_VER = _MSC_FULL_VER
#endif
#ifdef __INTEL_COMPILER
QMAKE_ICC_VER = __INTEL_COMPILER
QMAKE_ICC_UPDATE_VER = __INTEL_COMPILER_UPDATE
#endif
#ifdef __APPLE_CC__
QMAKE_APPLE_CC = __APPLE_CC__
#endif
#ifdef __clang__
#ifdef __APPLE_CC__
QT_APPLE_CLANG_MAJOR_VERSION = __clang_major__
QT_APPLE_CLANG_MINOR_VERSION = __clang_minor__
QT_APPLE_CLANG_PATCH_VERSION = __clang_patchlevel__
#else
QT_CLANG_MAJOR_VERSION = __clang_major__
QT_CLANG_MINOR_VERSION = __clang_minor__
QT_CLANG_PATCH_VERSION = __clang_patchlevel__
#endif
#endif
#ifdef __GNUC__
QT_GCC_MAJOR_VERSION = __GNUC__
QT_GCC_MINOR_VERSION = __GNUC_MINOR__
QT_GCC_PATCH_VERSION = __GNUC_PATCHLEVEL__
#endif

View File

@ -47,6 +47,11 @@ optimize_full {
}
}
optimize_debug {
QMAKE_CFLAGS_DEBUG += $$QMAKE_CFLAGS_OPTIMIZE_DEBUG
QMAKE_CXXFLAGS_DEBUG += $$QMAKE_CFLAGS_OPTIMIZE_DEBUG
}
debug {
QMAKE_CFLAGS += $$QMAKE_CFLAGS_DEBUG
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_DEBUG
@ -60,7 +65,7 @@ debug {
}
# disable special linker flags for host builds (no proper test for host support yet)
!host_build {
!host_build|!cross_compile {
use_gold_linker: QMAKE_LFLAGS += $$QMAKE_LFLAGS_USE_GOLD
enable_new_dtags: QMAKE_LFLAGS += $$QMAKE_LFLAGS_NEW_DTAGS
}

View File

@ -1,9 +1,5 @@
load(default_post)
# Ensure that we process sdk.prf first, as it will update QMAKE_CXX
# and friends that other features/extra compilers may depend on.
sdk: load(sdk)
!no_objective_c:CONFIG += objective_c
qt {
@ -72,9 +68,9 @@ macx-xcode {
only_active_arch.build = debug
QMAKE_MAC_XCODE_SETTINGS += only_active_arch
} else {
VALID_ARCHS =
device|!simulator: VALID_ARCHS += $$QMAKE_APPLE_DEVICE_ARCHS
simulator: VALID_ARCHS += $$QMAKE_APPLE_SIMULATOR_ARCHS
device|!simulator: VALID_DEVICE_ARCHS = $$QMAKE_APPLE_DEVICE_ARCHS
simulator: VALID_SIMULATOR_ARCHS = $$QMAKE_APPLE_SIMULATOR_ARCHS
VALID_ARCHS = $$VALID_DEVICE_ARCHS $$VALID_SIMULATOR_ARCHS
isEmpty(VALID_ARCHS): \
error("QMAKE_APPLE_DEVICE_ARCHS or QMAKE_APPLE_SIMULATOR_ARCHS must contain at least one architecture")
@ -93,6 +89,78 @@ macx-xcode {
QMAKE_LFLAGS += $$arch_flags
QMAKE_PCH_ARCHS = $$VALID_ARCHS
macos: deployment_target = $$QMAKE_MACOSX_DEPLOYMENT_TARGET
ios: deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET
tvos: deployment_target = $$QMAKE_TVOS_DEPLOYMENT_TARGET
watchos: deployment_target = $$QMAKE_WATCHOS_DEPLOYMENT_TARGET
# If we're doing a simulator and device build, device and simulator
# architectures use different paths and flags for the sysroot and
# deployment target switch, so we must multiplex them across multiple
# architectures using -Xarch. Otherwise we fall back to the simple path.
# This is not strictly necessary, but results in cleaner command lines
# and makes it easier for people to override EXPORT_VALID_ARCHS to limit
# individual rules to a different set of architecture(s) from the overall
# build (such as machtest in QtCore).
simulator:device {
QMAKE_XARCH_CFLAGS =
QMAKE_XARCH_LFLAGS =
QMAKE_EXTRA_VARIABLES += QMAKE_XARCH_CFLAGS QMAKE_XARCH_LFLAGS
for (arch, VALID_ARCHS) {
contains(VALID_SIMULATOR_ARCHS, $$arch) {
sdk = $$simulator.sdk
version_identifier = $$simulator.deployment_identifier
} else {
sdk = $$device.sdk
version_identifier = $$device.deployment_identifier
}
version_min_flags = \
-Xarch_$${arch} \
-m$${version_identifier}-version-min=$$deployment_target
QMAKE_XARCH_CFLAGS_$${arch} = $$version_min_flags \
-Xarch_$${arch} \
-isysroot$$xcodeSDKInfo(Path, $$sdk)
QMAKE_XARCH_LFLAGS_$${arch} = $$version_min_flags \
-Xarch_$${arch} \
-Wl,-syslibroot,$$xcodeSDKInfo(Path, $$sdk)
QMAKE_XARCH_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
QMAKE_XARCH_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS_$${arch})
QMAKE_EXTRA_VARIABLES += \
QMAKE_XARCH_CFLAGS_$${arch} \
QMAKE_XARCH_LFLAGS_$${arch}
}
QMAKE_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS)
} else {
simulator: \
version_identifier = $$simulator.deployment_identifier
else: \
version_identifier = $$device.deployment_identifier
version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag
}
# Enable precompiled headers for multiple architectures
QMAKE_CFLAGS_USE_PRECOMPILE =
for (arch, VALID_ARCHS) {
QMAKE_CFLAGS_USE_PRECOMPILE += \
-Xarch_$${arch} \
-include${QMAKE_PCH_OUTPUT_$${arch}}
}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
}
cache(QMAKE_XCODE_DEVELOPER_PATH, stash)

View File

@ -47,89 +47,3 @@ for(tool, $$list(QMAKE_CC QMAKE_CXX QMAKE_FIX_RPATH QMAKE_AR QMAKE_RANLIB QMAKE_
$$tool = $$sysrooted $$member(value, 1, -1)
cache($$tool_variable, set stash, $$tool)
}
!equals(MAKEFILE_GENERATOR, XCODE) {
macos: deployment_target = $$QMAKE_MACOSX_DEPLOYMENT_TARGET
ios: deployment_target = $$QMAKE_IOS_DEPLOYMENT_TARGET
tvos: deployment_target = $$QMAKE_TVOS_DEPLOYMENT_TARGET
watchos: deployment_target = $$QMAKE_WATCHOS_DEPLOYMENT_TARGET
device|!simulator: device_archs = $$QMAKE_APPLE_DEVICE_ARCHS
simulator: simulator_archs = $$QMAKE_APPLE_SIMULATOR_ARCHS
archs = $$device_archs $$simulator_archs
isEmpty(archs): \
error("QMAKE_APPLE_DEVICE_ARCHS or QMAKE_APPLE_SIMULATOR_ARCHS must contain at least one architecture")
single_arch {
device_archs = $$first(device_archs)
simulator_archs = $$first(simulator_archs)
archs = $$first(archs)
}
# If we're doing a simulator and device build, device and simulator architectures
# use different paths and flags for the sysroot and deployment target switch, so we
# must multiplex them across multiple architectures using -Xarch. Otherwise we fall
# back to the simple path. This is not strictly necessary but results in cleaner
# command lines and makes it easier for people to override EXPORT_VALID_ARCHS to
# limit individual rules to a different set of architecture(s) from the overall
# build (such as machtest in QtCore).
simulator:device {
QMAKE_XARCH_CFLAGS =
QMAKE_XARCH_LFLAGS =
QMAKE_EXTRA_VARIABLES += QMAKE_XARCH_CFLAGS QMAKE_XARCH_LFLAGS
for(arch, archs) {
contains(simulator_archs, $$arch) {
sdk = $$simulator.sdk
version_identifier = $$simulator.deployment_identifier
} else {
sdk = $$device.sdk
version_identifier = $$device.deployment_identifier
}
version_min_flags = \
-Xarch_$${arch} \
-m$${version_identifier}-version-min=$$deployment_target
QMAKE_XARCH_CFLAGS_$${arch} = $$version_min_flags \
-Xarch_$${arch} \
-isysroot$$xcodeSDKInfo(Path, $$sdk)
QMAKE_XARCH_LFLAGS_$${arch} = $$version_min_flags \
-Xarch_$${arch} \
-Wl,-syslibroot,$$xcodeSDKInfo(Path, $$sdk)
QMAKE_XARCH_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
QMAKE_XARCH_LFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS_$${arch})
QMAKE_EXTRA_VARIABLES += \
QMAKE_XARCH_CFLAGS_$${arch} \
QMAKE_XARCH_LFLAGS_$${arch}
}
QMAKE_CFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
QMAKE_CXXFLAGS += $(EXPORT_QMAKE_XARCH_CFLAGS)
QMAKE_LFLAGS += $(EXPORT_QMAKE_XARCH_LFLAGS)
} else {
simulator: \
version_identifier = $$simulator.deployment_identifier
else: \
version_identifier = $$device.deployment_identifier
version_min_flag = -m$${version_identifier}-version-min=$$deployment_target
QMAKE_CFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
QMAKE_CXXFLAGS += -isysroot $$QMAKE_MAC_SDK_PATH $$version_min_flag
QMAKE_LFLAGS += -Wl,-syslibroot,$$QMAKE_MAC_SDK_PATH $$version_min_flag
}
# Enable precompiled headers for multiple architectures
QMAKE_CFLAGS_USE_PRECOMPILE =
for(arch, archs) {
QMAKE_CFLAGS_USE_PRECOMPILE += \
-Xarch_$${arch} \
-include${QMAKE_PCH_OUTPUT_$${arch}}
}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_OBJCXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_PCH_OUTPUT_EXT = _${QMAKE_PCH_ARCH}$${QMAKE_PCH_OUTPUT_EXT}
}

View File

@ -45,6 +45,111 @@ qaxserver {
QT += axserver
}
!import_qpa_plugin {
warning("CONFIG-=import_qpa_plugin is deprecated. Use QTPLUGIN.platforms=- instead.")
QTPLUGIN.platforms = -
} else: qpa_minimal_plugin {
warning("CONFIG+=qpa_minimal_plugin is deprecated. Use QTPLUGIN.platforms=qminimal instead.")
QTPLUGIN.platforms = qminimal
}
!force_import_plugins:!contains(TEMPLATE, ".*app"):!if(contains(TEMPLATE, ".*lib"):dll): \
CONFIG -= import_plugins
# qmake variables cannot contain dashes, so normalize the names first
CLEAN_QT = $$replace(QT, -private$, _private)
CLEAN_QT_PRIVATE = $$replace(QT_PRIVATE, -private$, _private)
qt_module_deps = $$CLEAN_QT $$CLEAN_QT_PRIVATE
all_qt_module_deps = $$resolve_depends(qt_module_deps, "QT.", ".depends" ".run_depends")
QTPLUGIN = $$unique($$list($$lower($$QTPLUGIN)))
import_plugins:qtConfig(static) {
manualplugs = $$QTPLUGIN # User may specify plugins. Mostly legacy.
autoplugs = # Auto-added plugins.
# First round: explicitly specified modules.
plugin_deps = $$all_qt_module_deps
for(ever) {
# Automatically link the default plugins for the linked Qt modules.
for (qtmod, plugin_deps) {
for (ptype, QT.$${qtmod}.plugin_types) {
nptype = $$replace(ptype, [-/], _)
isEmpty(QTPLUGIN.$$nptype) {
for (plug, QT_PLUGINS) {
equals(QT_PLUGIN.$${plug}.TYPE, $$ptype) {
for (dep, QT_PLUGIN.$${plug}.EXTENDS) {
!contains(all_qt_module_deps, $$dep) {
plug =
break()
}
}
autoplugs += $$plug
}
}
} else {
plug = $$eval(QTPLUGIN.$$nptype)
!equals(plug, -): \
autoplugs += $$plug
}
}
}
QTPLUGIN = $$manualplugs $$autoplugs
QTPLUGIN = $$unique(QTPLUGIN)
# Obtain the plugins' Qt dependencies ...
plugin_deps =
for (plug, QTPLUGIN): \
plugin_deps += $$eval(QT_PLUGIN.$${plug}.DEPENDS)
plugin_deps = $$resolve_depends(plugin_deps, "QT.", ".depends" ".run_depends")
plugin_deps -= $$all_qt_module_deps
isEmpty(plugin_deps): \
break()
# ... and start over if any new Qt modules appeared,
# as these may want to load plugins in turn.
all_qt_module_deps += $$plugin_deps
}
extraplugs = $$manualplugs
manualplugs -= $$autoplugs
extraplugs -= $$manualplugs
!isEmpty(extraplugs): \
warning("Redundant entries in QTPLUGIN: $$extraplugs")
!isEmpty(QTPLUGIN) {
IMPORT_FILE_CONT = \
"// This file is autogenerated by qmake. It imports static plugin classes for" \
"// static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS.<plugin> variables." \
"$${LITERAL_HASH}include <QtPlugin>"
for (plug, QTPLUGIN) {
plug_class = $$eval(QT_PLUGIN.$${plug}.CLASS_NAME)
!isEmpty(plug_class): \
IMPORT_FILE_CONT += "Q_IMPORT_PLUGIN($$plug_class)"
else: \
warning("Plugin class name could not be determined for plugin '$$plug'.")
}
IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_plugin_import.cpp
write_file($$IMPORT_CPP, IMPORT_FILE_CONT)|error()
GENERATED_SOURCES += $$IMPORT_CPP
QMAKE_DISTCLEAN += $$IMPORT_CPP
}
}
# Only link against plugins in static builds
!isEmpty(QTPLUGIN):qtConfig(static) {
for (plug, QTPLUGIN) {
# Check if the plugin is known to Qt. We can use this to determine
# the plugin path. Unknown plugins must rely on the default link path.
plug_type = $$eval(QT_PLUGIN.$${plug}.TYPE)
!isEmpty(plug_type) {
plug_path = $$eval(QT_PLUGIN.$${plug}.PATH)
isEmpty(plug_path): \
plug_path = $$[QT_INSTALL_PLUGINS/get]
LIBS += -L$$plug_path/$$plug_type
}
LIBS += -l$${plug}$$qtPlatformTargetSuffix()
}
}
# target variable, flag source variable
defineTest(qtProcessModuleFlags) {
for(flag, $$2) {
@ -59,8 +164,6 @@ defineTest(qtProcessModuleFlags) {
unset(using_privates)
var_sfx =
for(ever) {
# qmake variables cannot contain dashes, so normalize the names first
CLEAN_QT$$var_sfx = $$replace(QT$$var_sfx, -private$, _private)
# Topological resolution of modules based on their QT.<module>.depends variable
FULL_QT$$var_sfx = $$resolve_depends(CLEAN_QT$$var_sfx, "QT.")
# Finally actually add the modules
@ -164,11 +267,8 @@ for(ever) {
message("This is not a bug, but a result of using Qt internals. You have been warned!")
}
qt_module_deps = $$CLEAN_QT $$CLEAN_QT_PRIVATE
qt_module_deps = $$resolve_depends(qt_module_deps, "QT.")
!no_qt_rpath:!static:qtConfig(rpath):!qtConfig(static):\
contains(qt_module_deps, core) {
contains(all_qt_module_deps, core) {
relative_qt_rpath:!isEmpty(QMAKE_REL_RPATH_BASE):contains(INSTALLS, target):\
isEmpty(target.files):isEmpty(target.commands):isEmpty(target.extra) {
# NOT the /dev property, as INSTALLS use host paths
@ -183,17 +283,17 @@ qt_module_deps = $$resolve_depends(qt_module_deps, "QT.")
# libraries which were NOT specified on the command line.
# This means that paths of direct dependencies (QT & QT_PRIVATE)
# don't need to be listed, unlike their private dependencies' paths.
privdep = $$resolve_depends(qt_module_deps, "QT.", ".depends" ".run_depends")
privdep -= $$qt_module_deps
privdep = $$all_qt_module_deps
privdep -= $$resolve_depends(qt_module_deps, "QT.")
rpaths =
for(dep, privdep): \
rpaths += $$eval(QT.$${dep}.libs)
QMAKE_RPATHLINKDIR *= $$unique(rpaths)
}
# static builds: link qml import plugins into the app.
contains(qt_module_deps, qml): \
qtConfig(static):contains(TEMPLATE, .*app):!host_build:!no_import_scan {
# static builds: link qml import plugins into the target.
contains(all_qt_module_deps, qml): \
qtConfig(static):import_plugins:!host_build:!no_import_scan {
exists($$[QT_INSTALL_QML/get]): \
QMLPATHS *= $$[QT_INSTALL_QML/get]
@ -238,140 +338,5 @@ contains(qt_module_deps, qml): \
write_file($$QML_IMPORT_CPP, IMPORT_FILE_CONT)|error()
GENERATED_SOURCES += $$QML_IMPORT_CPP
QMAKE_DISTCLEAN += $$QML_IMPORT_CPP
# copy qml files. this part is platform spesific.
mac {
!shallow_bundle {
# Note: user can override QMAKE_BUNDLE_QML from pro file to change target bundle path
isEmpty(QMAKE_QML_BUNDLE_PATH):QMAKE_QML_BUNDLE_PATH = "Resources/qt_qml"
qmlTargetPath = $$OUT_PWD/$${TARGET}.app/Contents/$$QMAKE_QML_BUNDLE_PATH
qtconfTargetPath = $$OUT_PWD/$${TARGET}.app/Contents/Resources/qt.conf
} else {
# shallow bundle layout (no Contents/Resources)
isEmpty(QMAKE_QML_BUNDLE_PATH):QMAKE_QML_BUNDLE_PATH = "qt_qml"
qmlTargetPath = $CODESIGNING_FOLDER_PATH/$$QMAKE_QML_BUNDLE_PATH
qtconfTargetPath = $CODESIGNING_FOLDER_PATH/qt.conf
}
# set import path in qt.conf to point to the bundeled qml:
QT_CONF_CONTENTS = \
"[Paths]" \
"Imports = $$QMAKE_QML_BUNDLE_PATH" \
"Qml2Imports = $$QMAKE_QML_BUNDLE_PATH"
write_file("$$OUT_PWD/qt.conf", QT_CONF_CONTENTS)|error()
# write qt.conf and copy each qml import dir into the bundle.
# But strip away archives and other files that are not needed:
!isEmpty(QMAKE_POST_LINK): QMAKE_POST_LINK += ";"
QMAKE_POST_LINK += \
"cp $$shell_quote($$OUT_PWD/qt.conf) \"$$qtconfTargetPath\"; " \
"test -d \"$$qmlTargetPath\" && rm -r \"$$qmlTargetPath\"; " \
"mkdir -p \"$$qmlTargetPath\" && " \
"for p in $$QMLPATHS; do" \
"rsync -r --exclude='*.a' --exclude='*.prl' --exclude='*.qmltypes' "
macx-xcode: QMAKE_POST_LINK += "$p/ \"$$qmlTargetPath\"; done"
else: QMAKE_POST_LINK += "\$\$p/ \"$$qmlTargetPath\"; done"
}
}
}
!import_qpa_plugin {
warning("CONFIG-=import_qpa_plugin is deprecated. Use QTPLUGIN.platforms=- instead.")
QTPLUGIN.platforms = -
} else: qpa_minimal_plugin {
warning("CONFIG+=qpa_minimal_plugin is deprecated. Use QTPLUGIN.platforms=qminimal instead.")
QTPLUGIN.platforms = qminimal
}
contains(TEMPLATE, .*app) {
autoplugs =
for (qtmod, qt_module_deps) {
for (ptype, QT.$${qtmod}.plugin_types) {
nptype = $$replace(ptype, [-/], _)
isEmpty(QTPLUGIN.$$nptype) {
for (plug, QT_PLUGINS) {
equals(QT_PLUGIN.$${plug}.TYPE, $$ptype) {
for (dep, QT_PLUGIN.$${plug}.EXTENDS) {
!contains(qt_module_deps, $$dep) {
plug =
break()
}
}
autoplugs += $$plug
}
}
} else {
plug = $$eval(QTPLUGIN.$$nptype)
!equals(plug, -): \
autoplugs += $$plug
}
}
}
manualplugs = $$QTPLUGIN
manualplugs -= $$autoplugs
QTPLUGIN -= $$manualplugs
!isEmpty(QTPLUGIN): \
warning("Redundant entries in QTPLUGIN: $$QTPLUGIN")
QTPLUGIN = $$manualplugs $$autoplugs
}
QT_PLUGIN_VERIFY = DEPLOYMENT_PLUGIN
qtConfig(static) {
QT_PLUGIN_VERIFY += QTPLUGIN
force_import_plugins|contains(TEMPLATE, .*app) {
import_plugins:!isEmpty(QTPLUGIN) {
IMPORT_FILE_CONT = \
"// This file is autogenerated by qmake. It imports static plugin classes for" \
"// static plugins specified using QTPLUGIN and QT_PLUGIN_CLASS.<plugin> variables." \
"$${LITERAL_HASH}include <QtPlugin>"
for(IMPORT_PLUG, $$list($$unique(QTPLUGIN))) {
PLUG_CLASS = $$eval(QT_PLUGIN.$${IMPORT_PLUG}.CLASS_NAME)
!isEmpty(PLUG_CLASS): \
IMPORT_FILE_CONT += "Q_IMPORT_PLUGIN($$PLUG_CLASS)"
else: \
warning("Plugin class name could not be determined for $$IMPORT_PLUG plugin.")
}
IMPORT_CPP = $$OUT_PWD/$$lower($$basename(TARGET))_plugin_import.cpp
write_file($$IMPORT_CPP, IMPORT_FILE_CONT)|error()
GENERATED_SOURCES += $$IMPORT_CPP
QMAKE_DISTCLEAN += $$IMPORT_CPP
}
}
}
for(QT_CURRENT_VERIFY, $$list($$QT_PLUGIN_VERIFY)) {
for(QTPLUG, $$list($$lower($$unique($$QT_CURRENT_VERIFY)))) {
# Check if the plugin is known to Qt. We can use this to determine
# the plugin path. Unknown plugins must rely on the default link path.
QT_PLUGINPATH = $$eval(QT_PLUGIN.$${QTPLUG}.TYPE)
# Generate the plugin linker line
QT_LINKAGE = -l$${QTPLUG}$$qtPlatformTargetSuffix()
# Only link against plugin in static builds
isEqual(QT_CURRENT_VERIFY, QTPLUGIN) {
!isEmpty(QT_PLUGINPATH) {
plugpath = $$eval(QT_PLUGIN.$${QTPLUG}.PATH)
isEmpty(plugpath): \
plugpath = $$[QT_INSTALL_PLUGINS/get]
LIBS *= -L$$plugpath/$$QT_PLUGINPATH
}
LIBS += $$QT_LINKAGE
# if the plugin is linked statically there is no need to deploy it
DEPLOYMENT_PLUGIN -= $$QT_CURRENT_VERIFY
}
# The following block is currently broken, because qt_plugin_XXX.prf files
# are not generated for dynamic builds.
false:isEqual(QT_CURRENT_VERIFY, DEPLOYMENT_PLUGIN):shared:winrt {
QT_ITEM =
debug: QT_ITEM = $${QTPLUG}d4.dll
else: QT_ITEM = $${QTPLUG}4.dll
qt_additional_plugin_$${QTPLUG}.files = $$[QT_INSTALL_PLUGINS/get]/$${QT_PLUGINPATH}/$${QT_ITEM}
qt_additional_plugin_$${QTPLUG}.path = $${QT_PLUGINPATH}
INSTALLS *= qt_additional_plugin_$${QTPLUG}
}
}
}

View File

@ -19,7 +19,7 @@ qtConfig(c++14): CONFIG += c++14
qtConfig(c++1z): CONFIG += c++1z
contains(TEMPLATE, .*lib) {
# module and plugins
!host_build:qtConfig(reduce_exports): CONFIG += hide_symbols
if(!host_build|!cross_compile):qtConfig(reduce_exports): CONFIG += hide_symbols
unix:qtConfig(reduce_relocations): CONFIG += bsymbolic_functions
qtConfig(separate_debug_info): CONFIG += separate_debug_info
@ -100,6 +100,9 @@ warnings_are_errors:warning_clean {
# error: assuming signed overflow does not occur when assuming that (X + c) < X is always false
QMAKE_CXXFLAGS_WARN_ON += -Wno-error=strict-overflow
# GCC 7 includes -Wimplicit-fallthrough in -Wextra, but Qt is not yet free of implicit fallthroughs.
greaterThan(QT_GCC_MAJOR_VERSION, 6): QMAKE_CXXFLAGS_WARN_ON += -Wno-error=implicit-fallthrough
# Work-around for bug https://code.google.com/p/android/issues/detail?id=58135
android: QMAKE_CXXFLAGS_WARN_ON += -Wno-error=literal-suffix
}

View File

@ -183,7 +183,9 @@ defineTest(qtConfCommandline_redo) {
qtConfAddError("No config.opt present - cannot redo configuration.")
return()
}
QMAKE_EXTRA_ARGS = $$cat($$OUT_PWD/config.opt, lines) $$QMAKE_EXTRA_ARGS
QMAKE_EXTRA_REDO_ARGS = $$cat($$OUT_PWD/config.opt, lines)
export(QMAKE_EXTRA_REDO_ARGS) # just for config.log
QMAKE_EXTRA_ARGS = $$QMAKE_EXTRA_REDO_ARGS $$QMAKE_EXTRA_ARGS
export(QMAKE_EXTRA_ARGS)
QMAKE_REDO_CONFIG = true
export(QMAKE_REDO_CONFIG)
@ -241,8 +243,8 @@ defineTest(qtConfParseCommandLine) {
opt = $$replace(c, "^--?(disable|no)-(.*)", "\\2")
val = no
} else: contains(c, "^--([^=]+)=(.*)") {
opt = $$replace(c, "^--?([^=]+)=(.*)", "\\1")
val = $$replace(c, "^--?([^=]+)=(.*)", "\\2")
opt = $$replace(c, "^--([^=]+)=(.*)", "\\1")
val = $$replace(c, "^--([^=]+)=(.*)", "\\2")
} else: contains(c, "^--(.*)") {
opt = $$replace(c, "^--(.*)", "\\1")
val = yes
@ -387,14 +389,17 @@ defineTest(qtConfPkgConfigPackageExists) {
return(true)
}
defineReplace(qtConfPrepareArgs) {
arglist = $$split(1)
defineReplace(qtSystemQuote) {
args =
for (a, arglist): \
for (a, 1): \
args += $$system_quote($$a)
return($$args)
}
defineReplace(qtConfPrepareArgs) {
return($$qtSystemQuote($$split(1)))
}
defineTest(qtConfSetupLibraries) {
for (l, $${currentConfig}.libraries._KEYS_) {
lpfx = $${currentConfig}.libraries.$${l}
@ -503,12 +508,16 @@ defineTest(qtConfLibrary_makeSpec) {
# the library is found via pkg-config.
defineTest(qtConfLibrary_pkgConfig) {
pkg_config = $$qtConfPkgConfig($$eval($${1}.host))
isEmpty(pkg_config): \
isEmpty(pkg_config) {
qtLog("pkg-config use disabled globally.")
return(false)
}
args = $$qtConfPrepareArgs($$eval($${1}.args))
!qtConfPkgConfigPackageExists($$pkg_config, $$args): \
!qtConfPkgConfigPackageExists($$pkg_config, $$args) {
qtLog("pkg-config did not find package.")
return(false)
}
qtRunLoggedCommand("$$pkg_config --modversion $$args", version)|return(false)
qtRunLoggedCommand("$$pkg_config --libs-only-L --libs-only-l $$args", $${1}.libs)|return(false)
@ -619,8 +628,9 @@ defineTest(qtConfHandleLibrary) {
qtLog("Trying source $$s (type $$t) of library $${1} ...")
!$$qtConfEvaluate($$eval($${spfx}.condition)) {
qtLog(" => source failed condition.")
cond = $$eval($${spfx}.condition)
!$$qtConfEvaluate($$cond) {
qtLog(" => source failed condition '$$cond'.")
next()
}
@ -1367,33 +1377,21 @@ defineTest(qtConfCreateSummary) {
}
defineTest(qtConfPrintReport) {
for (n, QT_CONFIGURE_REPORT): \
logn($$n)
logn()
for (n, QT_CONFIGURE_NOTES) {
logn($$n)
logn()
}
for (w, QT_CONFIGURE_WARNINGS) {
logn($$w)
logn()
}
blocks = \
"$$join(QT_CONFIGURE_REPORT, $$escape_expand(\\n))" \
"$$join(QT_CONFIGURE_NOTES, $$escape_expand(\\n\\n))" \
"$$join(QT_CONFIGURE_WARNINGS, $$escape_expand(\\n\\n))"
!isEmpty(QT_CONFIGURE_ERRORS) {
for (e, QT_CONFIGURE_ERRORS) {
logn($$e)
logn()
blocks += "$$join(QT_CONFIGURE_ERRORS, $$escape_expand(\\n\\n))"
mention_config_log:!$$QMAKE_CONFIG_VERBOSE: \
blocks += "Check config.log for details."
}
mention_config_log:!$$QMAKE_CONFIG_VERBOSE {
logn("Check config.log for details.")
logn()
}
!equals(config.input.continue, yes): \
blocks = "$$join(blocks, $$escape_expand(\\n\\n))"
logn($$blocks)
!isEmpty(QT_CONFIGURE_ERRORS):!equals(config.input.continue, yes): \
error()
}
write_file($$OUT_PWD/config.summary, blocks)|error()
}
defineTest(qtConfCheckErrors) {
@ -1612,19 +1610,6 @@ defineTest(qtConfOutput_privateFeature) {
}
}
# command line built-ins post-processing
defineTest(qtConfOutput_builtins) {
QMAKE_CONFIG_VERBOSE = $$eval(config.input.verbose)
isEmpty(QMAKE_CONFIG_VERBOSE): \
QMAKE_CONFIG_VERBOSE = false
export(QMAKE_CONFIG_VERBOSE)
QMAKE_CONFIG_CACHE_USE = $$eval(config.input.cache_use)
isEmpty(QMAKE_CONFIG_CACHE_USE): \
QMAKE_CONFIG_CACHE_USE = all
export(QMAKE_CONFIG_CACHE_USE)
}
defineTest(qtConfProcessOneOutput) {
feature = $${1}
fpfx = $${currentConfig}.features.$${feature}
@ -1709,17 +1694,26 @@ defineTest(qtConfProcessOutput) {
# tie it all together
#
cfgs =
isEmpty(_QMAKE_SUPER_CACHE_)|equals(OUT_PWD, $$dirname(_QMAKE_SUPER_CACHE_)) {
c = $$basename(_PRO_FILE_PWD_)
config.$${c}.dir = $$_PRO_FILE_PWD_
cfgs += $$c
!isEmpty(_QMAKE_SUPER_CACHE_) {
!isEmpty(_QMAKE_SUPER_CACHE_):!equals(OUT_PWD, $$dirname(_QMAKE_SUPER_CACHE_)) {
# sub-repo within a top-level build; no need to configure anything.
!isEmpty(QMAKE_EXTRA_ARGS) {
# sub-projects don't get the extra args passed down automatically,
# so we can use their presence to detect misguided attempts to
# configure the repositories separately.
# caveat: a plain qmake call is indistinguishable from a recursion
# (by design), so we cannot detect this case.
error("You cannot configure $$TARGET separately within a top-level build.")
}
return()
}
config.$${TARGET}.dir = $$_PRO_FILE_PWD_
cfgs = $$TARGET
!isEmpty(_QMAKE_SUPER_CACHE_) {
for (s, SUBDIRS) {
config.$${s}.dir = $$_PRO_FILE_PWD_/$${s}
cfgs += $$s
}
}
}
configsToProcess =
for (c, cfgs) {
@ -1727,8 +1721,11 @@ for (c, cfgs) {
exists($$s/configure.json): \
configsToProcess += $$c
}
isEmpty(configsToProcess): \
isEmpty(configsToProcess) {
!isEmpty(QMAKE_EXTRA_ARGS): \
error("This module does not accept configure command line arguments.")
return()
}
load(configure_base)
@ -1771,6 +1768,7 @@ for (currentConfig, allConfigs): \
QMAKE_SAVED_ARGS = $$QMAKE_EXTRA_ARGS
QMAKE_REDO_CONFIG = false
qtConfParseCommandLine()
qtConfCheckErrors()
for (currentConfig, allConfigs) {
qtConfSetModuleName()
@ -1784,6 +1782,9 @@ qtConfCheckErrors()
QMAKE_CONFIG_CACHE = $$dirname(_QMAKE_SUPER_CACHE_)/config.cache
else: \
QMAKE_CONFIG_CACHE = $$dirname(_QMAKE_CACHE_)/config.cache
QMAKE_CONFIG_CACHE_USE = $$eval(config.input.cache_use)
isEmpty(QMAKE_CONFIG_CACHE_USE): \
QMAKE_CONFIG_CACHE_USE = all
!equals(QMAKE_CONFIG_CACHE_USE, none) {
include($$QMAKE_CONFIG_CACHE, , true)
# this crudely determines when to discard the cache. this also catches the case
@ -1798,9 +1799,17 @@ equals(QMAKE_CONFIG_CACHE_USE, none) {
write_file($$QMAKE_CONFIG_CACHE, cont)
}
QMAKE_CONFIG_VERBOSE = $$eval(config.input.verbose)
isEmpty(QMAKE_CONFIG_VERBOSE): \
QMAKE_CONFIG_VERBOSE = false
QMAKE_CONFIG_LOG = $$OUT_PWD/config.log
!equals(QMAKE_CONFIG_CACHE_USE, all): \
write_file($$QMAKE_CONFIG_LOG, "")
else: \
write_file($$QMAKE_CONFIG_LOG, $$list($$escape_expand(\\n)), append)
qtLog("Command line: $$qtSystemQuote($$QMAKE_SAVED_ARGS)")
$$QMAKE_REDO_CONFIG: \
qtLog("config.opt: $$qtSystemQuote($$QMAKE_EXTRA_REDO_ARGS)")
CONFIG += qt_conf_tests_allowed
logn()
@ -1861,3 +1870,20 @@ for (p, QMAKE_POST_CONFIGURE): \
logn("Configure summary:")
logn()
qtConfPrintReport()
# final notes for the user
logn()
logn("Qt is now configured for building. Just run '$$QMAKE_MAKE_NAME'.")
pfx = $$[QT_INSTALL_PREFIX]
equals(pfx, $$[QT_INSTALL_PREFIX/get]) {
logn("Once everything is built, Qt is installed.")
logn("You should NOT run '$$QMAKE_MAKE_NAME install'.")
logn("Note that this build cannot be deployed to other machines or devices.")
} else {
logn("Once everything is built, you must run '$$QMAKE_MAKE_NAME install'.")
logn("Qt will be installed into '$$system_path($$pfx)'.")
}
logn()
logn("Prior to reconfiguration, make sure you remove any leftovers from")
logn("the previous build.")
logn()

View File

@ -214,7 +214,10 @@ android: CONFIG += qt_android_deps no_linker_version_script
} else {
verscript_content = "Qt_$${QT_MAJOR_VERSION}_PRIVATE_API {" \
" qt_private_api_tag*;"
for(header, SYNCQT.PRIVATE_HEADER_FILES): \
private_api_headers = $$SYNCQT.PRIVATE_HEADER_FILES $$SYNCQT.QPA_HEADER_FILES
for(header, private_api_headers): \
verscript_content += " @FILE:$${_PRO_FILE_PWD_}/$$header@"
verscript_content += "};"
@ -235,7 +238,7 @@ android: CONFIG += qt_android_deps no_linker_version_script
verscriptprocess.name = linker version script ${QMAKE_FILE_BASE}
verscriptprocess.input = verscript_in
verscriptprocess.CONFIG += no_link target_predeps
for(header, SYNCQT.PRIVATE_HEADER_FILES): \
for(header, private_api_headers): \
verscriptprocess.depends += $${_PRO_FILE_PWD_}/$$header
verscriptprocess.output = $$verscript
verscriptprocess.commands = perl $${PWD}/data/unix/findclasslist.pl < ${QMAKE_FILE_IN} > $@

View File

@ -47,9 +47,13 @@ CONFIG(static, static|shared)|prefix_build {
MODULE_FWD_PRI = $$mod_work_pfx/qt_plugin_$${MODULE}.pri
!build_pass {
qt_plugin_deps = $$QT $$QT_PRIVATE
qt_plugin_deps = s,-private$,_private,g
MODULE_PRI_CONT = \
"QT_PLUGIN.$${MODULE}.TYPE = $$PLUGIN_TYPE" \
"QT_PLUGIN.$${MODULE}.EXTENDS =$$join(PLUGIN_EXTENDS, " ", " ")" \
"QT_PLUGIN.$${MODULE}.DEPENDS = $$qt_plugin_deps" \
"QT_PLUGIN.$${MODULE}.CLASS_NAME = $$PLUGIN_CLASS_NAME" \
"QT_PLUGINS += $$MODULE"
write_file($$MODULE_PRI, MODULE_PRI_CONT)|error()

View File

@ -1,4 +1,4 @@
QMAKE_TARGET_COMPANY = The Qt Company Ltd
QMAKE_TARGET_PRODUCT = Qt5
QMAKE_TARGET_DESCRIPTION = C++ application development framework.
QMAKE_TARGET_COPYRIGHT = Copyright (C) 2015 The Qt Company Ltd.
isEmpty(QMAKE_TARGET_PRODUCT): QMAKE_TARGET_PRODUCT = Qt5
isEmpty(QMAKE_TARGET_DESCRIPTION): QMAKE_TARGET_DESCRIPTION = C++ application development framework.
QMAKE_TARGET_COPYRIGHT = Copyright (C) 2017 The Qt Company Ltd.

View File

@ -19,7 +19,6 @@ win32 {
contains(TEMPLATE, .*lib) {
!skip_target_version_ext:isEmpty(TARGET_VERSION_EXT):!isEmpty(VERSION) {
TARGET_VERSION_EXT = $$section(VERSION, ., 0, 0)
isEqual(TARGET_VERSION_EXT, 0):unset(TARGET_VERSION_EXT)
}
static:TARGET_EXT = .lib
else:TARGET_EXT = .dll

View File

@ -19,7 +19,7 @@ defineReplace(xml_escape) {
RESOURCES += qmake_immediate
for(resource, RESOURCES) {
# Regular case of user qrc file
contains(resource, ".*\.qrc$"): \
contains(resource, ".*\\.qrc$"): \
next()
# Fallback for stand-alone files/directories

View File

@ -12,7 +12,12 @@ defineReplace(qtMakeExpand) {
}
}
isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build {
cross_compile:host_build: \
target_prefix = QMAKE_HOST_CXX
else: \
target_prefix = QMAKE_CXX
isEmpty($${target_prefix}.INCDIRS) {
#
# Get default include and library paths from compiler
#
@ -24,7 +29,18 @@ isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build {
cmd_prefix = "set LC_ALL=C&"
cmd_suffix = "<NUL >NUL"
}
output = $$system("$$cmd_prefix $$QMAKE_CXX $$qtMakeExpand($$QMAKE_CXXFLAGS) -xc++ -E -v - 2>&1 $$cmd_suffix", lines)
cxx_flags = $$QMAKE_CXXFLAGS
# Manually inject the sysroot for Apple Platforms because its resolution
# normally does not happen until default_post.prf. This is especially
# important for moc to gain the correct default include directory list.
# While technically incorrect but without any likely practical effect,
# UIKit simulator platforms will see the device SDK's sysroot in
# QMAKE_DEFAULT_*DIRS, because they're handled in a single build pass.
darwin: cxx_flags += -isysroot $$QMAKE_MAC_SDK_PATH
output = $$system("$$cmd_prefix $$QMAKE_CXX $$qtMakeExpand($$cxx_flags) -xc++ -E -v - 2>&1 $$cmd_suffix", lines)
add_includes = false
for (line, output) {
line ~= s/^ *// # remove leading spaces
@ -44,6 +60,8 @@ isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build {
}
QMAKE_DEFAULT_LIBDIRS = $$unique(QMAKE_DEFAULT_LIBDIRS)
} 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")
@ -55,6 +73,101 @@ isEmpty(QMAKE_DEFAULT_INCDIRS):!host_build {
isEmpty(QMAKE_DEFAULT_LIBDIRS): QMAKE_DEFAULT_LIBDIRS = /lib /usr/lib
}
!isEmpty(QMAKE_DEFAULT_INCDIRS): cache(QMAKE_DEFAULT_INCDIRS, set stash)
!isEmpty(QMAKE_DEFAULT_LIBDIRS): cache(QMAKE_DEFAULT_LIBDIRS, set stash)
cache($${target_prefix}.INCDIRS, set stash, QMAKE_DEFAULT_INCDIRS)
cache($${target_prefix}.LIBDIRS, set stash, QMAKE_DEFAULT_LIBDIRS)
} else {
QMAKE_DEFAULT_INCDIRS = $$eval($${target_prefix}.INCDIRS)
QMAKE_DEFAULT_LIBDIRS = $$eval($${target_prefix}.LIBDIRS)
}
#
# Determine and cache the compiler version
#
defineReplace(qtVariablesFromMSVC) {
return($$system("$$1 -nologo -E $$2 $$system_quote($$PWD/data/macros.cpp) <NUL 2>NUL", lines))
}
defineReplace(qtVariablesFromGCC) {
null_device = /dev/null
equals(QMAKE_HOST.os, Windows): null_device = NUL
return($$system("$$1 -E $$system_quote($$PWD/data/macros.cpp) <$$null_device 2>$$null_device", lines))
}
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 {
vars = $$qtVariablesFromGCC($$QMAKE_CXX)
}
for (v, vars) {
isEmpty(v)|contains(v, $${LITERAL_HASH}.*): 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)
}
unset(target_prefix)
# Populate QMAKE_COMPILER_DEFINES and some compatibility variables.
# The $$format_number() calls strip leading zeros to avoid misinterpretation as octal.
!isEmpty(QMAKE_MSC_VER) {
QMAKE_COMPILER_DEFINES += _MSC_VER=$$QMAKE_MSC_VER _MSC_FULL_VER=$$QMAKE_MSC_FULL_VER
QT_MSVC_MAJOR_VERSION = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\1")
QT_MSVC_MINOR_VERSION = $$format_number($$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\2"))
QT_MSVC_PATCH_VERSION = $$replace(QMAKE_MSC_FULL_VER, "(..)(..)(.*)", "\\3"))
}
!isEmpty(QMAKE_ICC_VER) {
QMAKE_COMPILER_DEFINES += __INTEL_COMPILER=$$QMAKE_ICC_VER __INTEL_COMPILER_UPDATE=$$QMAKE_ICC_UPDATE_VER
QT_ICC_MAJOR_VERSION = $$replace(QMAKE_ICC_VER, "(..)(..)", "\\1")
QT_ICC_MINOR_VERSION = $$format_number($$replace(QMAKE_ICC_VER, "(..)(..)", "\\2"))
QT_ICC_PATCH_VERSION = $$QMAKE_ICC_UPDATE_VER
}
!isEmpty(QMAKE_APPLE_CC): \
QMAKE_COMPILER_DEFINES += __APPLE_CC__=$$QMAKE_APPLE_CC
!isEmpty(QT_APPLE_CLANG_MAJOR_VERSION): \
QMAKE_COMPILER_DEFINES += __clang__ \
__clang_major__=$$QT_APPLE_CLANG_MAJOR_VERSION \
__clang_minor__=$$QT_APPLE_CLANG_MINOR_VERSION \
__clang_patchlevel__=$$QT_APPLE_CLANG_PATCH_VERSION
!isEmpty(QT_CLANG_MAJOR_VERSION): \
QMAKE_COMPILER_DEFINES += __clang__ \
__clang_major__=$$QT_CLANG_MAJOR_VERSION \
__clang_minor__=$$QT_CLANG_MINOR_VERSION \
__clang_patchlevel__=$$QT_CLANG_PATCH_VERSION
!isEmpty(QT_GCC_MAJOR_VERSION): \
QMAKE_COMPILER_DEFINES += \
__GNUC__=$$QT_GCC_MAJOR_VERSION \
__GNUC_MINOR__=$$QT_GCC_MINOR_VERSION \
__GNUC_PATCHLEVEL__=$$QT_GCC_PATCH_VERSION
QMAKE_CFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_MSVC_COMPAT
msvc:!intel_icl:!clang_cl: include(../common/msvc-version.conf)

View File

@ -1,3 +1,2 @@
CONFIG = rtti_off incremental_off windows $$CONFIG
CONFIG = incremental_off windows $$CONFIG
load(default_pre)

View File

@ -93,7 +93,7 @@
isEmpty(WINRT_MANIFEST.background): WINRT_MANIFEST.background = green
isEmpty(WINRT_MANIFEST.foreground): WINRT_MANIFEST.foreground = light
isEmpty(WINRT_MANIFEST.default_language): WINRT_MANIFEST.default_language = en
*-msvc2015 {
*-msvc2015|*-msvc2017 {
isEmpty(WINRT_MANIFEST.minVersion): WINRT_MANIFEST.minVersion = $$(UCRTVersion)
isEmpty(WINRT_MANIFEST.minVersion): error("No UCRTVersion found in environment."))
isEmpty(WINRT_MANIFEST.maxVersionTested): WINRT_MANIFEST.maxVersionTested = $$WINRT_MANIFEST.minVersion
@ -116,7 +116,7 @@
# All Windows 10 applications need to have internetClient. It is also not marked as additional
# capability anymore and is assumed to be standard.
*-msvc2015: WINRT_MANIFEST.capabilities += internetClient
*-msvc2015|*-msvc2017: WINRT_MANIFEST.capabilities += internetClient
contains(WINRT_MANIFEST.capabilities, defaults) {
WINRT_MANIFEST.capabilities -= defaults
@ -143,7 +143,7 @@
}
# Dependencies are given as a string list. The CRT dependency is added automatically above.
# For MSVC2015 the dependencies are added in conjunction with TargetDeviceFamily
# For MSVC2015/2017 the dependencies are added in conjunction with TargetDeviceFamily
# Due to the hard coded dependency on "Windows.Universal" the <Dependencies> tag
# is already inside the MSVC2015 manifest.
WINRT_MANIFEST.dependencies = $$unique(WINRT_MANIFEST.dependencies)

View File

@ -79,6 +79,7 @@ QMAKE_LINK = icpc
QMAKE_LINK_SHLIB = icpc
QMAKE_LFLAGS =
QMAKE_LFLAGS_RELEASE =
QMAKE_LFLAGS_APP = -pie
QMAKE_LFLAGS_DEBUG =
QMAKE_LFLAGS_SHLIB = -shared -shared-intel
QMAKE_LFLAGS_PLUGIN = $$QMAKE_LFLAGS_SHLIB

View File

@ -1,13 +1,9 @@
#
# qmake configuration for win32-clang-msvc2015
# qmake configuration for win32-clang-msvc
#
# Written for Clang 3.8 with Microsoft Visual C++ 2015 Update 1
# Notice: this uses the clang-cl wrapper
#
MSC_VER = 1900
MSVC_VER = 14.0
include(../common/msvc-desktop.conf)
QMAKE_COMPILER += clang_cl llvm
@ -15,7 +11,7 @@ QMAKE_COMPILER += clang_cl llvm
QMAKE_CC = clang-cl
QMAKE_CXX = $$QMAKE_CC
QMAKE_CFLAGS += -fms-compatibility-version=19.00.23506 -Wno-microsoft-enum-value
QMAKE_CFLAGS += -Wno-microsoft-enum-value
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
# Precompiled headers are not supported yet by clang

View File

@ -37,4 +37,4 @@
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"
#include "../win32-msvc/qplatformdefs.h"

View File

@ -1,34 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://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 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"

View File

@ -37,4 +37,4 @@
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"
#include "../win32-msvc/qplatformdefs.h"

View File

@ -0,0 +1,8 @@
#
# qmake configuration for win32-msvc
#
# Written for Microsoft Visual C++ (all desktop versions)
#
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2005
#
# Written for Microsoft Visual C++ 2005
#
MSC_VER = 1400
MSVC_VER = 8.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2008
#
# Written for Microsoft Visual C++ 2008
#
MSC_VER = 1500
MSVC_VER = 9.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2010
#
# Written for Microsoft Visual C++ 2010
#
MSC_VER = 1600
MSVC_VER = 10.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2012
#
# Written for Microsoft Visual C++ 2012
#
MSC_VER = 1700
MSVC_VER = 11.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2013
#
# Written for Microsoft Visual C++ 2013
#
MSC_VER = 1800
MSVC_VER = 12.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2015
#
# Written for Microsoft Visual C++ 2015
#
MSC_VER = 1900
MSVC_VER = 14.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,40 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the qmake spec 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 "../win32-msvc2005/qplatformdefs.h"

View File

@ -1,10 +0,0 @@
#
# qmake configuration for win32-msvc2017
#
# Written for Microsoft Visual C++ 2017
#
MSC_VER = 1910
MSVC_VER = 15.0
include(../common/msvc-desktop.conf)
load(qt_config)

View File

@ -1,34 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the qmake spec of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://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 2.1 or version 3 as published by the Free
** Software Foundation and appearing in the file LICENSE.LGPLv21 and
** LICENSE.LGPLv3 included in the packaging of this file. Please review the
** following information to ensure the GNU Lesser General Public License
** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** As a special exception, The Qt Company gives you certain additional
** rights. These rights are described in The Qt Company LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"

View File

@ -4,9 +4,7 @@
# Written for Microsoft Visual C++ 2015
#
MSC_VER = 1900
include(../common/winrt_winphone/qmake.conf)
QMAKE_COMPILER_DEFINES += _MSC_VER=1900
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 ARM __ARM__ __arm__
QMAKE_CFLAGS += -FS
@ -16,7 +14,6 @@ QMAKE_LFLAGS += /MACHINE:ARM /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = ARM
MSVC_VER = 14.0
WINSDK_VER = 10.0
WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in

View File

@ -4,9 +4,7 @@
# Written for Microsoft Visual C++ 2015
#
MSC_VER = 1900
include(../common/winrt_winphone/qmake.conf)
QMAKE_COMPILER_DEFINES += _MSC_VER=1900 _WIN32
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X64 __X64__ __x64__
QMAKE_CFLAGS += -FS
@ -16,7 +14,6 @@ QMAKE_LFLAGS += /MACHINE:X64 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = x64
MSVC_VER = 14.0
WINSDK_VER = 10.0
WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in

View File

@ -0,0 +1,20 @@
#
# qmake configuration for winrt-x64-msvc2017
#
# Written for Microsoft Visual C++ 2017
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X64 __X64__ __x64__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
QMAKE_LFLAGS += /MACHINE:X64 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
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

View File

@ -37,4 +37,4 @@
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -4,9 +4,7 @@
# Written for Microsoft Visual C++ 2015
#
MSC_VER = 1900
include(../common/winrt_winphone/qmake.conf)
QMAKE_COMPILER_DEFINES += _MSC_VER=1900 _WIN32
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X86 __X86__ __x86__
QMAKE_CFLAGS += -FS
@ -15,7 +13,6 @@ QMAKE_LFLAGS += /SAFESEH /MACHINE:X86 /NODEFAULTLIB:kernel32.lib
QMAKE_LIBS += windowscodecs.lib WindowsApp.lib runtimeobject.lib OneCore.lib
VCPROJ_ARCH = Win32
MSVC_VER = 14.0
WINSDK_VER = 10.0
WINTARGET_VER = winv10.0
WINRT_MANIFEST = $$PWD/../common/winrt_winphone/manifests/10.0/AppxManifest.xml.in

View File

@ -0,0 +1,19 @@
#
# qmake configuration for winrt-x86-msvc2017
#
# Written for Microsoft Visual C++ 2017
#
include(../common/winrt_winphone/qmake.conf)
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_PC_APP WINAPI_PARTITION_PHONE_APP=1 X86 __X86__ __x86__
QMAKE_CFLAGS += -FS
QMAKE_CXXFLAGS += -FS
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

View File

@ -37,4 +37,4 @@
**
****************************************************************************/
#include "../win32-msvc2005/qplatformdefs.h"
#include "../common/winrt_winphone/qplatformdefs.h"

View File

@ -16,7 +16,7 @@ QOBJS=qtextcodec.o qutfcodec.o qstring.o qstring_compat.o qstringbuilder.o qtext
qarraydata.o qbytearray.o qbytearraymatcher.o qdatastream.o qbuffer.o qlist.o qfiledevice.o qfile.o \
qfilesystementry.o qfilesystemengine.o qfsfileengine.o qfsfileengine_iterator.o qregexp.o qvector.o \
qbitarray.o qdir.o qdiriterator.o quuid.o qhash.o qfileinfo.o qdatetime.o qstringlist.o \
qabstractfileengine.o qtemporaryfile.o qmap.o qmetatype.o qsettings.o qsystemerror.o qlibraryinfo.o \
qabstractfileengine.o qtemporaryfile.o qmap.o qmetatype.o qsettings.o qsystemerror.o \
qvariant.o qvsnprintf.o qlocale.o qlocale_tools.o qlinkedlist.o qnumeric.o \
qcryptographichash.o qxmlstream.o qxmlutils.o qlogging.o qoperatingsystemversion.o \
qjson.o qjsondocument.o qjsonparser.o qjsonarray.o qjsonobject.o qjsonvalue.o \
@ -33,6 +33,7 @@ DEPEND_SRC = \
$(QMKGENSRC)/projectgenerator.cpp $(QMKGENSRC)/makefile.cpp \
$(QMKGENSRC)/unix/unixmake.cpp $(QMKGENSRC)/unix/unixmake2.cpp \
$(QMKGENSRC)/mac/pbuilder_pbx.cpp \
$(QMKGENSRC)/win32/registry.cpp \
$(QMKGENSRC)/win32/winmakefile.cpp \
$(QMKGENSRC)/win32/mingw_make.cpp $(QMKGENSRC)/win32/msvc_nmake.cpp \
$(QMKGENSRC)/mac/xmloutput.cpp \
@ -84,7 +85,6 @@ DEPEND_SRC = \
$(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp \
$(SOURCE_PATH)/src/corelib/global/qlogging.cpp \
$(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp \
$(SOURCE_PATH)/tools/shared/windows/registry.cpp \
$(SOURCE_PATH)/src/corelib/json/qjson.cpp \
$(SOURCE_PATH)/src/corelib/json/qjsondocument.cpp \
$(SOURCE_PATH)/src/corelib/json/qjsonparser.cpp \
@ -100,7 +100,6 @@ CPPFLAGS = -g $(EXTRA_CPPFLAGS) \
-I$(INC_PATH)/QtCore/$(QT_VERSION) -I$(INC_PATH)/QtCore/$(QT_VERSION)/QtCore \
-I$(BUILD_PATH)/src/corelib/global \
-I$(QMAKESPEC) \
-I$(SOURCE_PATH)/tools/shared \
-DQT_VERSION_STR=\"$(QT_VERSION)\" -DQT_VERSION_MAJOR=$(QT_MAJOR_VERSION) -DQT_VERSION_MINOR=$(QT_MINOR_VERSION) -DQT_VERSION_PATCH=$(QT_PATCH_VERSION) \
-DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DPROEVALUATOR_FULL \
-DQT_NO_FOREACH
@ -110,19 +109,24 @@ LFLAGS = $(EXTRA_LFLAGS) $(CONFIG_LFLAGS)
first all: $(BUILD_PATH)/bin/qmake$(EXEEXT)
qmake: $(BUILD_PATH)/bin/qmake$(EXEEXT)
binary: $(BUILD_PATH)/qmake/qmake$(EXEEXT)
$(BUILD_PATH)/bin/qmake$(EXEEXT): $(OBJS) $(QOBJS)
$(CXX) -o "$@" $(OBJS) $(QOBJS) $(LFLAGS)
$(BUILD_PATH)/bin/qmake$(EXEEXT): $(OBJS) $(QOBJS) qlibraryinfo.o
$(CXX) -o "$@" $(OBJS) $(QOBJS) qlibraryinfo.o $(LFLAGS)
$(BUILD_PATH)/qmake/qmake$(EXEEXT): $(OBJS) $(QOBJS) qlibraryinfo_final.o
$(CXX) -o "$@" $(OBJS) $(QOBJS) qlibraryinfo_final.o $(LFLAGS)
Makefile: $(SOURCE_PATH)/qmake/Makefile.unix
@echo "Out of date, please rerun configure"
clean::
$(RM_F) $(OBJS) $(QOBJS)
$(RM_F) $(OBJS) $(QOBJS) qlibraryinfo.o qlibraryinfo_final.o
distclean:: clean
$(RM_RF) .deps
$(RM_F) $(BUILD_PATH)/bin/qmake$(EXEEXT)
$(RM_F) $(BUILD_PATH)/qmake/qmake$(EXEEXT)
$(RM_F) Makefile
depend:
@ -184,6 +188,9 @@ 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) $<
@ -225,6 +232,9 @@ qsystemerror.o: $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/kernel/qsystemerror.cpp
qlibraryinfo.o: $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
$(CXX) -c -o $@ $(CXXFLAGS) -DQT_BUILD_QMAKE_BOOTSTRAP $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
qlibraryinfo_final.o: $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp $(BUILD_PATH)/src/corelib/global/qconfig.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/global/qlibraryinfo.cpp
qnumeric.o: $(SOURCE_PATH)/src/corelib/global/qnumeric.cpp
@ -413,9 +423,6 @@ qlogging.o: $(SOURCE_PATH)/src/corelib/global/qlogging.cpp
qsystemlibrary.o: $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/plugin/qsystemlibrary.cpp
registry.o: $(SOURCE_PATH)/tools/shared/windows/registry.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/tools/shared/windows/registry.cpp
qjson.o: $(SOURCE_PATH)/src/corelib/json/qjson.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(SOURCE_PATH)/src/corelib/json/qjson.cpp

View File

@ -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)/tools/shared/windows/registry.cpp
$(SOURCE_PATH)/qmake/generators/win32/registry.cpp

View File

@ -14,35 +14,29 @@ QMKSRC = $(SOURCE_PATH)\qmake
CXX = icl
LINKER = link
CFLAGS_EXTRA = /Zc:forScope /Qstd=c++11
!elseif "$(QMAKESPEC)" == "win32-clang-msvc2015"
!elseif "$(QMAKESPEC)" == "win32-clang-msvc"
CXX = clang-cl
LINKER = link
CFLAGS_EXTRA = -fms-compatibility-version=19.00.23506 -Wno-microsoft-enum-value
!else
CXX = cl
LINKER = link
! if "$(QMAKESPEC)" == "win32-msvc2013"
CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS $(CFLAGS_CRT)
! elseif "$(QMAKESPEC)" == "win32-msvc2015" || "$(QMAKESPEC)" == "win32-msvc2017" || "$(QMAKESPEC)" == "win32-clang-msvc2015"
CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /Zc:strictStrings /w44456 /w44457 /w44458 /wd4577 $(CFLAGS_CRT)
! else
! error Unsupported compiler for this Makefile
! endif
CFLAGS_EXTRA = /MP /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS \
/wd4577 $(CFLAGS_CRT)
!endif # !win32-icc
!if "$(QMAKESPEC)" != "win32-clang-msvc2015"
!if "$(QMAKESPEC)" != "win32-clang-msvc"
CFLAGS_PCH = -Yuqmake_pch.h -FIqmake_pch.h -Fpqmake_pch.pch
PCH_OBJECT = qmake_pch.obj
!endif
CFLAGS_BARE = -c -Fo./ -Fdqmake.pdb \
-W3 -nologo -O1 \
-W2 -nologo -O1 \
$(CFLAGS_EXTRA) \
-I$(QMKSRC) -I$(QMKSRC)\library -I$(QMKSRC)\generators -I$(QMKSRC)\generators\unix -I$(QMKSRC)\generators\win32 -I$(QMKSRC)\generators\mac \
-I$(INC_PATH) -I$(INC_PATH)\QtCore -I$(INC_PATH)\QtCore\$(QT_VERSION) -I$(INC_PATH)\QtCore\$(QT_VERSION)\QtCore \
-I$(BUILD_PATH)\src\corelib\global \
-I$(SOURCE_PATH)\mkspecs\$(QMAKESPEC) \
-I$(SOURCE_PATH)\tools\shared \
-DQT_VERSION_STR=\"$(QT_VERSION)\" -DQT_VERSION_MAJOR=$(QT_MAJOR_VERSION) -DQT_VERSION_MINOR=$(QT_MINOR_VERSION) -DQT_VERSION_PATCH=$(QT_PATCH_VERSION) \
-DQT_BUILD_QMAKE -DQT_BOOTSTRAPPED -DPROEVALUATOR_FULL \
-DQT_NO_FOREACH -DUNICODE
@ -116,7 +110,6 @@ QTOBJS= \
quuid.obj \
qvector.obj \
qsettings.obj \
qlibraryinfo.obj \
qvariant.obj \
qsettings_win.obj \
qmetatype.obj \
@ -132,12 +125,16 @@ QTOBJS= \
qjsonvalue.obj
first all: $(BUILD_PATH)\bin\qmake.exe
binary: $(BUILD_PATH)\qmake\qmake.exe
$(BUILD_PATH)\bin\qmake.exe: $(OBJS) $(QTOBJS)
$(LINKER) $(LFLAGS) /OUT:$(BUILD_PATH)\bin\qmake.exe $(OBJS) $(QTOBJS) $(PCH_OBJECT) $(LIBS)
$(BUILD_PATH)\bin\qmake.exe: $(OBJS) $(QTOBJS) qlibraryinfo.obj
$(LINKER) $(LFLAGS) /OUT:$(BUILD_PATH)\bin\qmake.exe $(OBJS) $(QTOBJS) qlibraryinfo.obj $(PCH_OBJECT) $(LIBS)
$(BUILD_PATH)\qmake\qmake.exe: $(OBJS) $(QTOBJS) qlibraryinfo_final.obj
$(LINKER) $(LFLAGS) /OUT:$(BUILD_PATH)\qmake\qmake.exe $(OBJS) $(QTOBJS) qlibraryinfo_final.obj $(PCH_OBJECT) $(LIBS)
clean::
-del $(QTOBJS)
-del $(QTOBJS) qlibraryinfo.obj qlibraryinfo_final.obj
-del $(OBJS)
-del qmake_pch.obj
-del qmake_pch.pch
@ -147,6 +144,7 @@ clean::
distclean:: clean
-del $(BUILD_PATH)\bin\qmake.exe
-del $(BUILD_PATH)\qmake\qmake.exe
-del Makefile
.cpp.obj:
@ -156,6 +154,9 @@ $(OBJS): $(PCH_OBJECT)
$(QTOBJS): $(PCH_OBJECT)
qlibraryinfo.obj: $(PCH_OBJECT)
qlibraryinfo_final.obj: $(PCH_OBJECT)
qmake_pch.obj:
$(CXX) $(CXXFLAGS_BARE) -c -Yc -Fpqmake_pch.pch -TP $(QMKSRC)\qmake_pch.h
@ -204,9 +205,12 @@ qmake_pch.obj:
{$(SOURCE_PATH)\src\corelib\json}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
{$(SOURCE_PATH)\tools\shared\windows}.cpp{}.obj::
$(CXX) $(CXXFLAGS) $<
# Make sure qstring_compat.obj isn't compiled with PCH enabled
qstring_compat.obj: $(SOURCE_PATH)\src\corelib\tools\qstring_compat.cpp
$(CXX) -c $(CXXFLAGS_BARE) $(SOURCE_PATH)\src\corelib\tools\qstring_compat.cpp
qlibraryinfo.obj: $(SOURCE_PATH)\src\corelib\global\qlibraryinfo.cpp
$(CXX) $(CXXFLAGS) -DQT_BUILD_QMAKE_BOOTSTRAP $(SOURCE_PATH)\src\corelib\global\qlibraryinfo.cpp
qlibraryinfo_final.obj: $(SOURCE_PATH)\src\corelib\global\qlibraryinfo.cpp $(BUILD_PATH)\src\corelib\global\qconfig.cpp
$(CXX) $(CXXFLAGS) -Foqlibraryinfo_final.obj $(SOURCE_PATH)\src\corelib\global\qlibraryinfo.cpp

View File

@ -120,7 +120,7 @@ qmake -spec macx-g++
#! [14]
QMAKE_LFLAGS += -F/path/to/framework/directory/
LIBS += -F/path/to/framework/directory/
#! [14]
@ -784,10 +784,6 @@ CONFIG(debug, debug|release) {
}
#! [127]
#! [142]
DEPLOYMENT_PLUGIN += qjpeg
#! [142]
#! [149]
SUBDIRS += my_executable my_library
my_executable.subdir = app

View File

@ -685,7 +685,7 @@
Directories other than the standard framework directory need to be specified
to the build system, and this is achieved by appending linker options to the
\l{QMAKE_LFLAGS} variable, as shown in the following example:
\l{LIBS} variable, as shown in the following example:
\snippet code/doc_src_qmake-manual.pro 14
@ -960,6 +960,8 @@
\row \li c++14 \li C++14 support is enabled. This option has no effect if
the compiler does not support C++14.
By default, support is disabled.
\row \li depend_includepath \li Appending the value of INCLUDEPATH to
DEPENDPATH is enabled. Set by default.
\endtable
When you use the \c debug_and_release option (which is the default under
@ -1119,24 +1121,6 @@
Specifies a list of all directories to look in to resolve dependencies. This
variable is used when crawling through \c included files.
\target DEPLOYMENT_PLUGIN
\section1 DEPLOYMENT_PLUGIN
\note This variable is used only on the Windows CE platform.
Specifies the Qt plugins that will be deployed. All plugins
available in Qt can be explicitly deployed to the device. See
\l{Static Plugins}{Static Plugins} for a complete list.
\note No plugins will be deployed automatically to Windows CE devices.
If the application depends on plugins, these plugins have to be specified
manually.
For example, the following definition uploads the jpeg imageformat plugin to
the plugins directory on the Windows CE device:
\snippet code/doc_src_qmake-manual.pro 142
\target DESTDIR
\section1 DESTDIR

View File

@ -2254,12 +2254,17 @@ MakefileGenerator::writeDefaultVariables(QTextStream &t)
t << "MOVE = " << var("QMAKE_MOVE") << endl;
}
QString MakefileGenerator::buildArgs()
QString MakefileGenerator::buildArgs(bool withExtra)
{
QString ret;
for (const QString &arg : qAsConst(Option::globals->qmake_args))
ret += " " + shellQuote(arg);
if (withExtra && !Option::globals->qmake_extra_args.isEmpty()) {
ret += " --";
for (const QString &arg : qAsConst(Option::globals->qmake_extra_args))
ret += " " + shellQuote(arg);
}
return ret;
}
@ -2278,7 +2283,7 @@ QString MakefileGenerator::build_args()
ret += " " + escapeFilePath(fileFixify(project->projectFile()));
// general options and arguments
ret += buildArgs();
ret += buildArgs(true);
return ret;
}
@ -2442,7 +2447,7 @@ MakefileGenerator::writeSubTargetCall(QTextStream &t,
if (!in_directory.isEmpty())
t << "\n\t" << mkdir_p_asstring(out_directory);
pfx = "( " + chkexists.arg(out) +
+ " $(QMAKE) -o " + out + ' ' + in + buildArgs()
+ " $(QMAKE) -o " + out + ' ' + in + buildArgs(false)
+ " ) && ";
}
writeSubMakeCall(t, out_directory_cdin + pfx, makefilein);
@ -2513,7 +2518,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << mkdir_p_asstring(out_directory)
<< out_directory_cdin;
}
t << "$(QMAKE) -o " << out << ' ' << in << buildArgs();
t << "$(QMAKE) -o " << out << ' ' << in << buildArgs(false);
if (!dont_recurse)
writeSubMakeCall(t, out_directory_cdin, makefilein + " qmake_all");
else
@ -2710,7 +2715,7 @@ MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll)
if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
QStringList files = escapeFilePaths(fileFixify(Option::mkfile::project_files));
t << escapeDependencyPath(project->first("QMAKE_INTERNAL_PRL_FILE").toQString()) << ": \n\t"
<< "@$(QMAKE) -prl " << files.join(' ') << ' ' << buildArgs() << endl;
<< "@$(QMAKE) -prl " << files.join(' ') << ' ' << buildArgs(true) << endl;
}
QString qmake = build_args();

View File

@ -178,7 +178,7 @@ protected:
QString specdir();
//subclasses can use these to query information about how the generator was "run"
QString buildArgs();
QString buildArgs(bool withExtra);
virtual QStringList &findDependencies(const QString &file);
virtual bool doDepends() const { return Option::mkfile::do_deps; }

View File

@ -659,11 +659,15 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
t << "$(TARGETA): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) $(OBJCOMP)";
if(do_incremental)
t << " $(INCREMENTAL_OBJECTS)";
t << ' ' << depVar("POST_TARGETDEPS") << "\n\t"
<< "-$(DEL_FILE) $(TARGETA) \n\t"
t << ' ' << depVar("POST_TARGETDEPS") << "\n\t";
if (!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "-$(DEL_FILE) $(TARGETA) \n\t"
<< var("QMAKE_AR_CMD");
if(do_incremental)
t << " $(INCREMENTAL_OBJECTS)";
if (!project->isEmpty("QMAKE_POST_LINK"))
t << "\n\t" << var("QMAKE_POST_LINK");
if(!project->isEmpty("QMAKE_RANLIB"))
t << "\n\t$(RANLIB) $(TARGETA)";
t << endl << endl;
@ -680,6 +684,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
<< " $(OBJECTS) $(OBJCOMP) " << depVar("POST_TARGETDEPS") << "\n\t";
if(!destdir.isEmpty())
t << mkdir_p_asstring(destdir, false) << "\n\t";
if (!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "-$(DEL_FILE) " << destdir << "$(TARGET)\n\t"
<< var("QMAKE_AR_CMD") << "\n";
if(!project->isEmpty("QMAKE_POST_LINK"))
@ -710,6 +716,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
}
if(!destdir.isEmpty())
t << mkdir_p_asstring(destdir, false) << "\n\t";
if (!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "-$(DEL_FILE) " << lib << "\n\t"
<< ar << "\n";
if(!project->isEmpty("QMAKE_POST_LINK"))
@ -732,7 +740,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
}
if(!meta_files.isEmpty())
t << escapeDependencyPaths(meta_files).join(" ") << ": \n\t"
<< "@$(QMAKE) -prl " << escapeFilePath(project->projectFile()) << ' ' << buildArgs() << endl;
<< "@$(QMAKE) -prl " << escapeFilePath(project->projectFile()) << ' ' << buildArgs(true) << endl;
}
if (!project->isEmpty("QMAKE_BUNDLE")) {

View File

@ -176,7 +176,7 @@ const char _Optimization[] = "Optimization";
const char _OptimizeReferences[] = "OptimizeReferences";
const char _OutputDirectory[] = "OutputDirectory";
const char _OutputFile[] = "OutputFile";
const char _PlatformToolSet[] = "PlatformToolSet";
const char _PlatformToolSet[] = "PlatformToolset";
const char _PrecompiledHeader[] = "PrecompiledHeader";
const char _PrecompiledHeaderFile[] = "PrecompiledHeaderFile";
const char _PrecompiledHeaderOutputFile[] = "PrecompiledHeaderOutputFile";
@ -406,7 +406,7 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProjectSingleConfig &tool)
xml << decl("1.0", "utf-8")
<< tag("Project")
<< attrTag("DefaultTargets","Build")
<< attrTag("ToolsVersion", "4.0")
<< attrTagToolsVersion(tool.Configuration)
<< attrTag("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003")
<< tag("ItemGroup")
<< attrTag("Label", "ProjectConfigurations");
@ -550,7 +550,7 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProjectSingleConfig &tool)
xmlFilter << decl("1.0", "utf-8")
<< tag("Project")
<< attrTag("ToolsVersion", "4.0")
<< attrTagToolsVersion(tool.Configuration)
<< attrTag("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
xmlFilter << tag("ItemGroup");
@ -587,6 +587,8 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProjectSingleConfig &tool)
outputFilter(tempProj, xml, xmlFilter, tempProj.ExtraCompilers.at(x));
}
outputFilter(tempProj, xml, xmlFilter, "Root Files");
xml << import("Project", "$(VCTargetsPath)\\Microsoft.Cpp.targets");
xml << tag("ImportGroup")
@ -603,13 +605,10 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProject &tool)
xml.setIndentString(" ");
const QString toolsVersion = (tool.SdkVersion == QLatin1String("10.0")) ? QStringLiteral("14.0")
: QStringLiteral("4.0");
xml << decl("1.0", "utf-8")
<< tag("Project")
<< attrTag("DefaultTargets","Build")
<< attrTag("ToolsVersion", toolsVersion)
<< attrTagToolsVersion(tool.SingleProjects.first().Configuration)
<< attrTag("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003")
<< tag("ItemGroup")
<< attrTag("Label", "ProjectConfigurations");
@ -794,7 +793,7 @@ void VCXProjectWriter::write(XmlOutput &xml, VCProject &tool)
xmlFilter << decl("1.0", "utf-8")
<< tag("Project")
<< attrTag("ToolsVersion", "4.0")
<< attrTagToolsVersion(tool.SingleProjects.first().Configuration)
<< attrTag("xmlns", "http://schemas.microsoft.com/developer/msbuild/2003");
xmlFilter << tag("ItemGroup");
@ -2054,4 +2053,11 @@ QString VCXProjectWriter::generateCondition(const VCConfiguration &config)
return QStringLiteral("'$(Configuration)|$(Platform)'=='") + config.Name + QLatin1Char('\'');
}
XmlOutput::xml_output VCXProjectWriter::attrTagToolsVersion(const VCConfiguration &config)
{
if (config.CompilerVersion >= NET2013)
return noxml();
return attrTag("ToolsVersion", "4.0");
}
QT_END_NAMESPACE

View File

@ -182,6 +182,7 @@ private:
bool fileAdded, bool hasCustomBuildStep);
static void outputFileConfig(XmlOutput &xml, XmlOutput &xmlFilter, const QString &fileName, const QString &filterName);
static QString generateCondition(const VCConfiguration &config);
static XmlOutput::xml_output attrTagToolsVersion(const VCConfiguration &config);
friend class XTreeNode;
friend class XFlatNode;

View File

@ -34,7 +34,7 @@
#include <qdiriterator.h>
#include <qset.h>
#include <windows/registry_p.h>
#include <registry_p.h>
#include <time.h>
@ -75,6 +75,29 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
QString arch = project->first("VCPROJ_ARCH").toQString().toLower();
QString compiler;
QString compilerArch;
const QString msvcVer = project->first("MSVC_VER").toQString();
if (msvcVer.isEmpty()) {
fprintf(stderr, "Mkspec does not specify MSVC_VER. Cannot continue.\n");
return false;
}
if (msvcVer == QStringLiteral("15.0")) {
const ProStringList hostArch = project->values("QMAKE_TARGET.arch");
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 {
compiler += QStringLiteral("x86");
compilerArch = QStringLiteral("amd64");
}
} else {
if (arch == QLatin1String("arm")) {
compiler = QStringLiteral("x86_arm");
compilerArch = QStringLiteral("arm");
@ -88,12 +111,8 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
} else {
arch = QStringLiteral("x86");
}
const QString msvcVer = project->first("MSVC_VER").toQString();
if (msvcVer.isEmpty()) {
fprintf(stderr, "Mkspec does not specify MSVC_VER. Cannot continue.\n");
return false;
}
const QString winsdkVer = project->first("WINSDK_VER").toQString();
if (winsdkVer.isEmpty()) {
fprintf(stderr, "Mkspec does not specify WINSDK_VER. Cannot continue.\n");
@ -106,7 +125,11 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
}
#ifdef Q_OS_WIN
QString regKey = QStringLiteral("Software\\Microsoft\\VisualStudio\\") + msvcVer + ("\\Setup\\VC\\ProductDir");
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");
@ -128,7 +151,46 @@ NmakeMakefileGenerator::writeMakefile(QTextStream &t)
QStringList incDirs;
QStringList libDirs;
QStringList binDirs;
if (msvcVer == QStringLiteral("14.0")) {
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");
incDirs << kitDir + QStringLiteral("Extension SDKs/WindowsMobile/")
+ crtVersion + QStringLiteral("/Include/WinRT");
libDirs << toolsInstallDir + QStringLiteral("lib/") + arch + QStringLiteral("/store");
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);

View File

@ -54,7 +54,8 @@ static DotNET vsVersionFromString(const char *versionString)
"10.0", NET2010,
"11.0", NET2012,
"12.0", NET2013,
"14.0", NET2015
"14.0", NET2015,
"15.0", NET2017
};
DotNET result = NETUnknown;
for (const auto entry : mapping) {

View File

@ -670,6 +670,21 @@ bool VcprojGenerator::hasBuiltinCompiler(const QString &file)
return false;
}
void VcprojGenerator::createCustomBuildToolFakeFile(const QString &cbtFilePath,
const QString &realOutFilePath)
{
QFile file(fileFixify(cbtFilePath, FileFixifyFromOutdir | FileFixifyAbsolute));
if (file.exists())
return;
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
warn_msg(WarnLogic, "Cannot create '%s'.", qPrintable(file.fileName()));
return;
}
file.write("This is a dummy file needed to create ");
file.write(qPrintable(realOutFilePath));
file.write("\n");
}
void VcprojGenerator::init()
{
is64Bit = (project->first("QMAKE_TARGET.arch") == "x86_64");
@ -797,12 +812,14 @@ void VcprojGenerator::init()
if (!hasBuiltinCompiler(file)) {
extraCompilerSources[file] += quc.toQString();
} else {
// Use a fake file name foo.moc.cbt for the project view.
// Create a fake file foo.moc.cbt for the project view.
// This prevents VS from complaining about a circular
// dependency from foo.moc -> foo.moc.
QString out = Option::fixPathToTargetOS(replaceExtraCompilerVariables(
compiler_out, file, QString(), NoShell), false);
out += customBuildToolFilterFileSuffix;
QString realOut = replaceExtraCompilerVariables(
compiler_out, file, QString(), NoShell);
QString out = realOut + customBuildToolFilterFileSuffix;
createCustomBuildToolFakeFile(out, realOut);
out = Option::fixPathToTargetOS(out, false);
extraCompilerSources[out] += quc.toQString();
extraCompilerOutputs[out] = file;
}

Some files were not shown because too many files have changed in this diff Show More