The build environment needs to be prepared as below. Caveat emptor: There are variants of this script "out there" that have typos that make it, effectively, a no-op.
@call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86
:: The below applies to XP-targeting builds *only*!
@set INCLUDE=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%
@set PATH=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Bin;%PATH%
@set LIB=%ProgramFiles(x86)%\Microsoft SDKs\Windows\v7.1A\Lib;%LIB%
Qt 4.8
The following script patches the sources:
:: Assume that we're in an equivalent of C:\Qt prefix
@set PREFIX=%~dp0
:: Qt sources
@set QT=%PREFIX%..\4.8.5-src
:: Patch file(s)
@set SRC=%PREFIX%
@set SPEC=win32-msvc2012
@if not exist "%QT%\projects.pro" ( echo Qt source folder expected in %QT%>&2 & exit /b 1 )
::
@patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt4fixes.rej --input=%SRC%\qt4fixes.patch
::
@mkdir %QT%\mkspecs\%SPEC%-xp
@copy %QT%\mkspecs\%SPEC%\qplatformdefs.h %QT%\mkspecs\%SPEC%-xp
@copy %QT%\mkspecs\%SPEC%\qmake.conf %QT%\mkspecs\%SPEC%-xp
@patch --forward --directory=%QT% -p0 --global-reject-file=%SRC%\qt4xp.rej --input=%SRC%\qt4xp.patch
To undo the changes, run the below:
@patch --reverse --directory=%QT% -p0 --global-reject-file=%SRC%\qt4static-unfix.rej --input=%SRC%\qt4static.patch
@del %QT%\mkspecs\%SPEC%-static\qplatformdefs.h
@del %QT%\mkspecs\%SPEC%-static\qmake.conf
@rmdir %QT%\mkspecs\%SPEC%-static
@del %QT%\mkspecs\%SPEC%-static-xp\qplatformdefs.h
@del %QT%\mkspecs\%SPEC%-static-xp\qmake.conf
@rmdir %QT%\mkspecs\%SPEC%-static-xp
The build is then performed by executing:
configure -platform win32-msvc2012-xp
jom (or nmake)
# qt4fixes.patch
#
# Fix for HashSet under MSVC2012/2013.
--- src/3rdparty/webkit/Source/JavaScriptCore/wtf/HashSet.h 2013-06-07 09:16:54.000000000 -0400
+++ src/3rdparty/webkit/Source/JavaScriptCore/wtf/HashSet.h 2013-09-27 12:20:48.148285400 -0400
@@ -174,12 +174,23 @@
         return m_impl.template contains<T, Adapter>(value);
     }
+   /*
     template<typename T, typename U, typename V>
     inline pair<typename HashSet<T, U, V>::iterator, bool> HashSet<T, U, V>::add(const ValueType& value)
     {
         return m_impl.add(value);
     }
+   */
+   // fix
+   template<typename T, typename U, typename V>
+   inline pair<typename HashSet<T, U, V>::iterator, bool> HashSet<T, U, V>::add(const ValueType& value)
+   {
+       typedef typename HashSet<T, U, V>::iterator iter_type;
+       auto& temp = m_impl.add(value);
+       return make_pair((iter_type)temp.first, temp.second);
+   }
+   /*
     template<typename Value, typename HashFunctions, typename Traits>
     template<typename T, typename HashTranslator>
     inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
@@ -188,6 +199,18 @@
         typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
         return m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
     }
+   */
+   // fix
+   template<typename Value, typename HashFunctions, typename Traits>
+   template<typename T, typename HashTranslator>
+   inline pair<typename HashSet<Value, HashFunctions, Traits>::iterator, bool>
+   HashSet<Value, HashFunctions, Traits>::add(const T& value)
+   {
+       typedef HashSetTranslatorAdapter<ValueType, ValueTraits, T, HashTranslator> Adapter;
+       typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type;
+       auto& temp = m_impl.template addPassingHashCode<T, T, Adapter>(value, value);
+       return make_pair((iter_type)temp.first, temp.second);
+   }
     template<typename T, typename U, typename V>
     inline void HashSet<T, U, V>::remove(iterator it)
# qt4xp.patch
# XP Targeting Support for Qt 4.8
#
# Build configure with XP targeting
--- tools/configure/configure.pro   2013-06-07 09:17:02.000000000 -0400
+++ tools/configure/configure.pro   2014-02-20 10:00:29.840317000 -0500
@@ -4,6 +4,7 @@
 CONFIG   += console flat stl rtti_off
 CONFIG   -= moc qt
 DEFINES  = UNICODE QT_NODLL QT_NO_CODECS QT_NO_TEXTCODEC QT_NO_UNICODETABLES QT_LITE_COMPONENT QT_NO_STL QT_NO_COMPRESS QT_NO_THREAD QT_NO_QOBJECT QT_NO_GEOM_VARIANT _CRT_SECURE_NO_DEPRECATE
+win32-msvc2012-xp: DEFINES += _USING_V110_SDK71_
 DEFINES  += QT_BOOTSTRAPPED
 win32 : LIBS += -lole32 -ladvapi32
@@ -19,7 +20,7 @@
     QMAKE_CXXFLAGS_DEBUG -= -MDd
     QMAKE_CXXFLAGS_DEBUG += -MTd
 }
-win32-msvc2012: DEFINES += _ALLOW_KEYWORD_MACROS
+win32-msvc2012*: DEFINES += _ALLOW_KEYWORD_MACROS
 PRECOMPILED_HEADER = configure_pch.h
# Build qmake with XP targeting
--- qmake/Makefile.win32    2013-06-07 09:17:02.000000000 -0400
+++ qmake/Makefile.win32    2014-02-20 09:31:51.090426700 -0500
@@ -1,4 +1,4 @@
-!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-icc"
+!IF "$(QMAKESPEC)" == "win32-msvc" || "$(QMAKESPEC)" == "win32-msvc.net" || "$(QMAKESPEC)" == "win32-msvc2002" || "$(QMAKESPEC)" == "win32-msvc2003" || "$(QMAKESPEC)" == "win32-msvc2005" || "$(QMAKESPEC)" == "win32-msvc2008" || "$(QMAKESPEC)" == "win32-msvc2010" || "$(QMAKESPEC)" == "win32-msvc2012" || "$(QMAKESPEC)" == "win32-msvc2012-xp" || "$(QMAKESPEC)" == "win32-icc"
 !if "$(SOURCE_PATH)" == ""
 SOURCE_PATH = ..
# Build qmake with XP targeting
--- qmake/Makefile.win32    2013-06-07 09:17:02.000000000 -0400
+++ qmake/Makefile.win32    2014-02-20 09:31:51.090426700 -0500
@@ -42,6 +42,9 @@
               -DQT_NO_COMPRESS -DUNICODE -DHAVE_QCONFIG_CPP -DQT_BUILD_QMAKE -DQT_NO_THREAD \
               -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -DQT_NO_DATASTREAM -DQT_NO_PCRE -DQT_BOOTSTRAPPED \
               -DQLIBRARYINFO_EPOCROOT
+!if "$(QMAKESPEC)" == "win32-msvc2012-xp"
+CFLAGS_BARE = $(CFLAGS_BARE) -D_USING_V110_SDK71_
+!endif
 CFLAGS   = -Yuqmake_pch.h -FIqmake_pch.h -Fpqmake_pch.pch $(CFLAGS_BARE) $(CFLAGS)
 CXXFLAGS_BARE = $(CFLAGS_BARE)
--- mkspecs/win32-msvc2012-xp/qmake.conf    2013-06-07 09:17:00.000000000 -0400
+++ mkspecs/win32-msvc2012-xp/qmake.conf    2014-02-17 16:17:38.831119700 -0500
@@ -8,7 +8,7 @@
 TEMPLATE                = app
 CONFIG                  += qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target embed_manifest_dll embed_manifest_exe
 QT                      += core gui
-DEFINES                 += UNICODE WIN32
+DEFINES                 += UNICODE WIN32 _USING_V110_SDK71_
 QMAKE_COMPILER_DEFINES  += _MSC_VER=1700 WIN32
 QMAKE_CC                = cl
@@ -59,8 +59,8 @@
 QMAKE_LFLAGS_RELEASE    = /INCREMENTAL:NO
 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
 QMAKE_LFLAGS_DEBUG      = /DEBUG
-QMAKE_LFLAGS_CONSOLE    = /SUBSYSTEM:CONSOLE
-QMAKE_LFLAGS_WINDOWS    = /SUBSYSTEM:WINDOWS
+QMAKE_LFLAGS_CONSOLE    = /SUBSYSTEM:CONSOLE,5.01
+QMAKE_LFLAGS_WINDOWS    = /SUBSYSTEM:WINDOWS,5.01
 QMAKE_LFLAGS_EXE        = \"/MANIFESTDEPENDENCY:type=\'win32\' name=\'Microsoft.Windows.Common-Controls\' version=\'6.0.0.0\' publicKeyToken=\'6595b64144ccf1df\' language=\'*\' processorArchitecture=\'*\'\"
 QMAKE_LFLAGS_DLL        = /DLL
 QMAKE_LFLAGS_LTCG       = /LTCG
# Recognize spec prefixes.
--- src/3rdparty/webkit/Source/WebCore/WebCore.pri  2013-06-07 09:16:56.000000000 -0400
+++ src/3rdparty/webkit/Source/WebCore/WebCore.pri  2013-09-27 12:20:48.148285400 -0400
@@ -303,7 +303,7 @@
 }
 # Remove whole program optimizations due to miscompilations
-win32-msvc2005|win32-msvc2008|win32-msvc2010|wince*:{
+win32-msvc2005*|win32-msvc2008*|win32-msvc2010*|win32-msvc2012*|wince*:{
     QMAKE_CFLAGS_LTCG -= -GL
     QMAKE_CXXFLAGS_LTCG -= -GL