Add support for building with VC++ 2012
authorSteve Hay <steve.m.hay@googlemail.com>
Thu, 3 Jan 2013 23:30:57 +0000 (23:30 +0000)
committerSteve Hay <steve.m.hay@googlemail.com>
Thu, 3 Jan 2013 23:31:37 +0000 (23:31 +0000)
No code changes seem to be required, so it's just a matter of noting that
we've tried it, it works, and we'll support it :-)

README.win32
pod/perldelta.pod
win32/Makefile
win32/makefile.mk

index 5999d56..51bb580 100644 (file)
@@ -62,10 +62,10 @@ that are also supported by perl's makefile.
 =back
 
 The Microsoft Visual C++ compilers are also now being given away free. They are
-available as "Visual C++ Toolkit 2003" or "Visual C++ 2005/2008/2010 Express
+available as "Visual C++ Toolkit 2003" or "Visual C++ 2005/2008/2010/2012 Express
 Edition" (and also as part of the ".NET Framework SDK") and are the same
 compilers that ship with "Visual C++ .NET 2003 Professional" or "Visual C++
-2005/2008/2010 Professional" respectively.
+2005/2008/2010/2012 Professional" respectively.
 
 This port can also be built on IA64/AMD64 using:
 
@@ -131,9 +131,9 @@ and edit win32/config.vc to change "make=nmake" into "make=dmake".  The
 latter step is only essential if you want to use dmake as your default
 make for building extensions using MakeMaker.
 
-=item Microsoft Visual C++ 2008/2010 Express Edition
+=item Microsoft Visual C++ 2008/2010/2012 Express Edition
 
-These free versions of Visual C++ 2008/2010 Professional contain the same
+These free versions of Visual C++ 2008/2010/2012 Professional contain the same
 compilers and linkers that ship with the full versions, and also contain
 everything necessary to build Perl, rather than requiring a separate download
 of the Windows SDK like previous versions did.
@@ -143,9 +143,9 @@ L<http://www.microsoft.com/downloads/search.aspx?displaylang=en>.  (Providing ex
 links to these packages has proven a pointless task because the links keep on
 changing so often.)
 
-Install Visual C++ 2008/2010 Express, then setup your environment using, e.g.
+Install Visual C++ 2008/2010/2012 Express, then setup your environment using, e.g.
 
-       C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat
+       C:\Program Files\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat
 
 (assuming the default installation location was chosen).
 
@@ -890,6 +890,6 @@ Win9x support was added in 5.6 (Benjamin Stuhl).
 
 Support for 64-bit Windows added in 5.8 (ActiveState Corp).
 
-Last updated: 10 September 2011
+Last updated: 02 January 2012
 
 =cut
index 64f4089..a0bed1a 100644 (file)
@@ -314,9 +314,11 @@ L</Modules and Pragmata> section.
 
 =over 4
 
-=item XXX-some-platform
+=item Windows
 
-XXX
+Perl can now be built using Microsoft's Visual C++ 2012 compiler by specifying
+CCTYPE=MSVC110 (or MSVC110FREE if you are using the free Express edition for
+Windows Desktop) in F<win32/Makefile>.
 
 =back
 
index 1d6c650..b2bae9f 100644 (file)
@@ -103,24 +103,28 @@ USE_LARGE_FILES   = define
 #
 # Visual C++ 6.x (aka Visual C++ 98)
 CCTYPE         = MSVC60
+# Visual C++ .NET 2002/2003 (aka Visual C++ 7.x) (full version)
+#CCTYPE                = MSVC70
 # Visual C++ Toolkit 2003 (aka Visual C++ 7.x) (free command-line tools)
 #CCTYPE                = MSVC70FREE
-# Visual C++ .NET 2003 (aka Visual C++ 7.x) (full version)
-#CCTYPE                = MSVC70
 # Windows Server 2003 SP1 Platform SDK (April 2005)
 #CCTYPE                = SDK2003SP1
-# Visual C++ 2005 Express Edition (aka Visual C++ 8.x) (free version)
-#CCTYPE                = MSVC80FREE
 # Visual C++ 2005 (aka Visual C++ 8.x) (full version)
 #CCTYPE                = MSVC80
-# Visual C++ 2008 Express Edition (aka Visual C++ 9.x) (free version)
-#CCTYPE                = MSVC90FREE
+# Visual C++ 2005 Express Edition (aka Visual C++ 8.x) (free version)
+#CCTYPE                = MSVC80FREE
 # Visual C++ 2008 (aka Visual C++ 9.x) (full version)
 #CCTYPE                = MSVC90
-# Visual C++ 2010 Express Edition (aka Visual C++ 10.x) (free version)
-#CCTYPE                = MSVC100FREE
+# Visual C++ 2008 Express Edition (aka Visual C++ 9.x) (free version)
+#CCTYPE                = MSVC90FREE
 # Visual C++ 2010 (aka Visual C++ 10.x) (full version)
 #CCTYPE                = MSVC100
+# Visual C++ 2010 Express Edition (aka Visual C++ 10.x) (free version)
+#CCTYPE                = MSVC100FREE
+# Visual C++ 2012 (aka Visual C++ 11.x) (full version)
+#CCTYPE                = MSVC110
+# Visual C++ 2012 Express Edition (aka Visual C++ 11.x) (free version)
+#CCTYPE                = MSVC110FREE
 
 #
 # uncomment next line if you want debug version of perl (big,slow)
@@ -322,6 +326,15 @@ USE_64_BIT_INT     = define
 CCTYPE         = SDK2003SP1
 !ENDIF
 
+# Most relevant compiler-specific options fall into two groups:
+# either pre-MSVC80 or MSVC80 onwards, so define a macro for this.
+!IF "$(CCTYPE)" == "MSVC60" || \
+    "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
+PREMSVC80      = define
+!ELSE
+PREMSVC80      = undef
+!ENDIF
+
 ARCHITECTURE = $(PROCESSOR_ARCHITECTURE)
 !IF "$(ARCHITECTURE)" == "AMD64"
 ARCHITECTURE   = x64
@@ -354,14 +367,9 @@ ARCHNAME   = $(ARCHNAME)-64int
 !ENDIF
 !ENDIF
 
-# Visual C++ 98, .NET 2003, 2005/2008/2010 specific.
-# VC++ 6/7/8/9/10.x can load DLLs on demand.  Makes the test suite run
-# in about 10% less time.  (The free version of 7.x can't do this, but the free
-# versions of 8/9/10.x can.)
-!IF "$(CCTYPE)" == "MSVC60" || "$(CCTYPE)" == "MSVC70"     || \
-    "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
+# All but the free version of VC++ 7.x can load DLLs on demand.  Makes the test
+# suite run in about 10% less time.
+!IF "$(CCTYPE)" != "MSVC70FREE"
 DELAYLOAD      = -DELAYLOAD:ws2_32.dll delayimp.lib
 !ENDIF
 
@@ -445,11 +453,9 @@ DEFINES            = $(DEFINES) -DWIN64 -DCONSERVATIVE
 OPTIMIZE       = $(OPTIMIZE) -fp:precise
 !ENDIF
 
-# For now, silence VC++ 8/9/10.x's warnings about "unsafe" CRT functions
+# For now, silence warnings from VC++ 8.x onwards about "unsafe" CRT functions
 # and POSIX CRT function names being deprecated.
-!IF "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
+!IF "$(PREMSVC80)" == "undef"
 DEFINES                = $(DEFINES) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
 !ENDIF
 
@@ -462,8 +468,7 @@ DEFINES             = $(DEFINES) -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
 # Perl itself with e.g. VC6 but later installs an XS module using VC8
 # the time_t types will still be compatible.
 !IF "$(WIN64)" == "undef"
-!  IF "$(CCTYPE)" == "MSVC60" || \
-      "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
+!  IF "$(PREMSVC80)" == "define"
 BUILDOPT       = $(BUILDOPT) -D_USE_32BIT_TIME_T
 !  ENDIF
 !ENDIF
@@ -497,9 +502,7 @@ EXEOUT_FLAG = -Fe
 
 CFLAGS_O       = $(CFLAGS) $(BUILDOPT)
 
-!IF "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
+!IF "$(PREMSVC80)" == "undef"
 LINK_FLAGS     = $(LINK_FLAGS) "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
 !ELSE
 RSC_FLAGS      = -DINCLUDE_MANIFEST
index 06fe896..4ea84b9 100644 (file)
@@ -104,24 +104,28 @@ USE_LARGE_FILES   *= define
 #
 # Visual C++ 6.x (aka Visual C++ 98)
 #CCTYPE                *= MSVC60
+# Visual C++ .NET 2002/2003 (aka Visual C++ 7.x) (full version)
+#CCTYPE                *= MSVC70
 # Visual C++ Toolkit 2003 (aka Visual C++ 7.x) (free command-line tools)
 #CCTYPE                *= MSVC70FREE
-# Visual C++ .NET 2003 (aka Visual C++ 7.x) (full version)
-#CCTYPE                *= MSVC70
 # Windows Server 2003 SP1 Platform SDK (April 2005)
 #CCTYPE                = SDK2003SP1
-# Visual C++ 2005 Express Edition (aka Visual C++ 8.x) (free version)
-#CCTYPE                *= MSVC80FREE
 # Visual C++ 2005 (aka Visual C++ 8.x) (full version)
 #CCTYPE                *= MSVC80
-# Visual C++ 2008 Express Edition (aka Visual C++ 9.x) (free version)
-#CCTYPE                *= MSVC90FREE
+# Visual C++ 2005 Express Edition (aka Visual C++ 8.x) (free version)
+#CCTYPE                *= MSVC80FREE
 # Visual C++ 2008 (aka Visual C++ 9.x) (full version)
 #CCTYPE                *= MSVC90
-# Visual C++ 2010 Express Edition (aka Visual C++ 10.x) (free version)
-#CCTYPE                = MSVC100FREE
+# Visual C++ 2008 Express Edition (aka Visual C++ 9.x) (free version)
+#CCTYPE                *= MSVC90FREE
 # Visual C++ 2010 (aka Visual C++ 10.x) (full version)
 #CCTYPE                = MSVC100
+# Visual C++ 2010 Express Edition (aka Visual C++ 10.x) (free version)
+#CCTYPE                = MSVC100FREE
+# Visual C++ 2012 (aka Visual C++ 11.x) (full version)
+#CCTYPE                = MSVC110
+# Visual C++ 2012 Express Edition (aka Visual C++ 11.x) (free version)
+#CCTYPE                = MSVC110FREE
 # MinGW or mingw-w64 with gcc-3.2 or later
 CCTYPE         *= GCC
 
@@ -356,27 +360,6 @@ ARCHNAME   !:= $(ARCHNAME)-64int
 .ENDIF
 .ENDIF
 
-# Visual C++ 98, .NET 2003, 2005/2008/2010 specific.
-# VC++ 6/7/8/9/10.x can load DLLs on demand.  Makes the test suite run
-# in about 10% less time.  (The free version of 7.x can't do this, but the free
-# versions of 8/9/10.x can.)
-.IF "$(CCTYPE)" == "MSVC60" || "$(CCTYPE)" == "MSVC70"     || \
-    "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
-DELAYLOAD      *= -DELAYLOAD:ws2_32.dll delayimp.lib
-.ENDIF
-
-# Visual C++ 2005 and 2008 (VC++ 8.x and 9.x) create manifest files for EXEs and
-# DLLs. These either need copying everywhere with the binaries, or else need
-# embedding in them otherwise MSVCR80.dll or MSVCR90.dll won't be found. For
-# simplicity, embed them if they exist (and delete them afterwards so that they
-# don't get installed too).
-EMBED_EXE_MANI = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 && \
-                 if exist $@.manifest del $@.manifest
-EMBED_DLL_MANI = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 && \
-                 if exist $@.manifest del $@.manifest
-
 ARCHDIR                = ..\lib\$(ARCHNAME)
 COREDIR                = ..\lib\CORE
 AUTODIR                = ..\lib\auto
@@ -462,6 +445,31 @@ BUILDOPT   += -fno-strict-aliasing -mms-bitfields
 
 .ELSE
 
+# All but the free version of VC++ 7.x can load DLLs on demand.  Makes the test
+# suite run in about 10% less time.
+.IF "$(CCTYPE)" != "MSVC70FREE"
+DELAYLOAD      = -DELAYLOAD:ws2_32.dll delayimp.lib
+.ENDIF
+
+# Visual C++ 2005 and 2008 (VC++ 8.x and 9.x) create manifest files for EXEs and
+# DLLs. These either need copying everywhere with the binaries, or else need
+# embedding in them otherwise MSVCR80.dll or MSVCR90.dll won't be found. For
+# simplicity, embed them if they exist (and delete them afterwards so that they
+# don't get installed too).
+EMBED_EXE_MANI = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;1 && \
+                 if exist $@.manifest del $@.manifest
+EMBED_DLL_MANI = if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 && \
+                 if exist $@.manifest del $@.manifest
+
+# Most relevant compiler-specific options fall into two groups:
+# either pre-MSVC80 or MSVC80 onwards, so define a macro for this.
+.IF "$(CCTYPE)" == "MSVC60" || \
+    "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
+PREMSVC80      = define
+.ELSE
+PREMSVC80      = undef
+.ENDIF
+
 CC             = cl
 LINK32         = link
 LIB32          = $(LINK32) -lib
@@ -509,11 +517,9 @@ DEFINES            += -DWIN64 -DCONSERVATIVE
 OPTIMIZE       += -fp:precise
 .ENDIF
 
-# For now, silence VC++ 8/9/10.x's warnings about "unsafe" CRT functions
+# For now, silence warnings from VC++ 8.x onwards about "unsafe" CRT functions
 # and POSIX CRT function names being deprecated.
-.IF "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
+.IF "$(PREMSVC80)" == "undef"
 DEFINES                += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
 .ENDIF
 
@@ -526,8 +532,7 @@ DEFINES             += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE
 # Perl itself with e.g. VC6 but later installs an XS module using VC8
 # the time_t types will still be compatible.
 .IF "$(WIN64)" == "undef"
-.IF "$(CCTYPE)" == "MSVC60" || \
-    "$(CCTYPE)" == "MSVC70" || "$(CCTYPE)" == "MSVC70FREE"
+.IF "$(PREMSVC80)" == "define"
 BUILDOPT       += -D_USE_32BIT_TIME_T
 .ENDIF
 .ENDIF
@@ -563,9 +568,7 @@ LIBOUT_FLAG = /out:
 
 CFLAGS_O       = $(CFLAGS) $(BUILDOPT)
 
-.IF "$(CCTYPE)" == "MSVC80" || "$(CCTYPE)" == "MSVC80FREE" || \
-    "$(CCTYPE)" == "MSVC90" || "$(CCTYPE)" == "MSVC90FREE" || \
-    "$(CCTYPE)" == "MSVC100" || "$(CCTYPE)" == "MSVC100FREE"
+.IF "$(PREMSVC80)" == "undef"
 LINK_FLAGS     += "/manifestdependency:type='Win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
 .ELSE
 RSC_FLAGS      = -DINCLUDE_MANIFEST