On Sat, Jan 26, 2013 at 12:20:56PM +0800, Craig Ringer wrote:
> On 01/24/2013 01:13 PM, Craig Ringer wrote:
> > On 01/24/2013 11:28 AM, Craig Ringer wrote:
> >> On 01/24/2013 09:38 AM, Noah Misch wrote:
> >>> The most notable difference is that I have no pre-VS2012 Microsoft
> >>> compilers installed and no SDKs installed by my explicit action. I
> >>> suggest assessing how the Framework64 directories get into your path
> >>> and trying without them.
> >> Have you verified that 64-bit builds work? I'm testing now, but I've
> >> just confirmed that my machine isn't quite right.
> Just to confirm, I think that this is ready for commit as posted in
> [email protected].
>
> I'll amend my docs changes and submit them separately.
Thanks. Here's a rebased version.
*** a/doc/src/sgml/install-windows.sgml
--- b/doc/src/sgml/install-windows.sgml
***************
*** 19,26 ****
<para>
There are several different ways of building PostgreSQL on
<productname>Windows</productname>. The simplest way to build with
! Microsoft tools is to install a supported version of the
! <productname>Microsoft Windows SDK</productname> and use the included
compiler. It is also possible to build with the full
<productname>Microsoft Visual C++ 2005, 2008 or 2010</productname>. In some
cases
that requires the installation of the <productname>Windows SDK</productname>
--- 19,26 ----
<para>
There are several different ways of building PostgreSQL on
<productname>Windows</productname>. The simplest way to build with
! Microsoft tools is to install <productname>Visual Studio Express 2012
! for Windows Desktop</productname> and use the included
compiler. It is also possible to build with the full
<productname>Microsoft Visual C++ 2005, 2008 or 2010</productname>. In some
cases
that requires the installation of the <productname>Windows SDK</productname>
***************
*** 77,93 ****
<productname>Visual Studio Express</productname> or some versions of the
<productname>Microsoft Windows SDK</productname>. If you do not already
have a
<productname>Visual Studio</productname> environment set up, the easiest
! way is to use the compilers in the <productname>Windows SDK</productname>,
! which is a free download from Microsoft.
</para>
<para>
PostgreSQL is known to support compilation using the compilers shipped with
<productname>Visual Studio 2005</productname> to
! <productname>Visual Studio 2010</productname> (including Express editions),
as well as standalone Windows SDK releases 6.0 to 7.1.
64-bit PostgreSQL builds are only supported with
! <productname>Microsoft Windows SDK</productname> version 6.0a and above or
<productname>Visual Studio 2008</productname> and above.
</para>
--- 77,94 ----
<productname>Visual Studio Express</productname> or some versions of the
<productname>Microsoft Windows SDK</productname>. If you do not already
have a
<productname>Visual Studio</productname> environment set up, the easiest
! ways are to use the compilers in the <productname>Windows SDK
7.1</productname>
! or those from <productname>Visual Studio Express 2012 for Windows
! Desktop</productname>, which are both free downloads from Microsoft.
</para>
<para>
PostgreSQL is known to support compilation using the compilers shipped with
<productname>Visual Studio 2005</productname> to
! <productname>Visual Studio 2012</productname> (including Express editions),
as well as standalone Windows SDK releases 6.0 to 7.1.
64-bit PostgreSQL builds are only supported with
! <productname>Microsoft Windows SDK</productname> version 6.0a to 7.1 or
<productname>Visual Studio 2008</productname> and above.
</para>
***************
*** 149,165 **** $ENV{PATH}=$ENV{PATH} . ';c:\some\where\bison\bin';
<varlistentry>
<term><productname>Microsoft Windows SDK</productname></term>
<listitem><para>
! It is recommended that you upgrade to the latest supported version
! of the <productname>Microsoft Windows SDK</productname> (currently
version 7.1), available for download from
<ulink url="http://www.microsoft.com/downloads/"></>.
</para>
<para>
You must always include the
<application>Windows Headers and Libraries</application> part of the
SDK.
! If you install the <productname>Windows SDK</productname>
including the <application>Visual C++ Compilers</application>,
you don't need <productname>Visual Studio</productname> to build.
</para></listitem>
</varlistentry>
--- 150,169 ----
<varlistentry>
<term><productname>Microsoft Windows SDK</productname></term>
<listitem><para>
! If your build environment doesn't ship with a supported version of the
! <productname>Microsoft Windows SDK</productname> it
! is recommended that you upgrade to the latest version (currently
version 7.1), available for download from
<ulink url="http://www.microsoft.com/downloads/"></>.
</para>
<para>
You must always include the
<application>Windows Headers and Libraries</application> part of the
SDK.
! If you install a <productname>Windows SDK</productname>
including the <application>Visual C++ Compilers</application>,
you don't need <productname>Visual Studio</productname> to build.
+ Note that as of Version 8.0a the Windows SDK no longer ships with a
+ complete command-line build environment.
</para></listitem>
</varlistentry>
*** a/src/backend/utils/adt/pg_locale.c
--- b/src/backend/utils/adt/pg_locale.c
***************
*** 715,726 **** cache_locale_time(void)
#if defined(WIN32) && defined(LC_MESSAGES)
/*
! * Convert Windows locale name to the ISO formatted one
! * if possible.
*
! * This function returns NULL if conversion is impossible,
! * otherwise returns the pointer to a static area which
! * contains the iso formatted locale name.
*/
static char *
IsoLocaleName(const char *winlocname)
--- 715,755 ----
#if defined(WIN32) && defined(LC_MESSAGES)
/*
! * Convert a Windows setlocale() argument to a Unix-style one.
*
! * Regardless of platform, we install message catalogs under a Unix-style
! * LL[_CC][.ENCODING][@VARIANT] naming convention. Only LC_MESSAGES settings
! * following that style will elicit localized interface strings.
! *
! * Before Visual Studio 2012 (msvcr110.dll), Windows setlocale() accepted "C"
! * (but not "c") and strings of the form <Language>[_<Country>][.<CodePage>],
! * case-insensitive. setlocale() returns the fully-qualified form; for
! * example, setlocale("thaI") returns "Thai_Thailand.874". Internally,
! * setlocale() and _create_locale() select a "locale identifier"[1] and store
! * it in an undocumented _locale_t field. From that LCID, we can retrieve the
! * ISO 639 language and the ISO 3166 country. Character encoding does not
! * matter, because the server and client encodings govern that.
! *
! * Windows Vista introduced the "locale name" concept[2], closely following
! * RFC 4646. Locale identifiers are now deprecated. Starting with Visual
! * Studio 2012, setlocale() accepts locale names in addition to the strings it
! * accepted historically. It does not standardize them; setlocale("Th-tH")
! * returns "Th-tH". setlocale(category, "") still returns a traditional
! * string. Furthermore, msvcr110.dll changed the undocumented _locale_t
! * content to carry locale names instead of locale identifiers.
! *
! * MinGW headers declare _create_locale(), but msvcrt.dll lacks that symbol.
! * IsoLocaleName() always fails in a MinGW-built postgres.exe, so only
! * Unix-style values of the lc_messages GUC can elicit localized messages. In
! * particular, every lc_messages setting that initdb can select automatically
! * will yield only C-locale messages. XXX This could be fixed by running the
! * fully-qualified locale name through a lookup table.
! *
! * This function returns a pointer to a static buffer bearing the converted
! * name or NULL if conversion fails.
! *
! * [1] http://msdn.microsoft.com/en-us/library/windows/desktop/dd373763.aspx
! * [2] http://msdn.microsoft.com/en-us/library/windows/desktop/dd373814.aspx
*/
static char *
IsoLocaleName(const char *winlocname)
***************
*** 739,744 **** IsoLocaleName(const char *winlocname)
--- 768,801 ----
loct = _create_locale(LC_CTYPE, winlocname);
if (loct != NULL)
{
+ #if (_MSC_VER >= 1700) /* Visual Studio 2012 or later
*/
+ size_t rc;
+ char *hyphen;
+
+ /* Locale names use only ASCII, any conversion locale suffices.
*/
+ rc = wchar2char(iso_lc_messages,
loct->locinfo->locale_name[LC_CTYPE],
+ sizeof(iso_lc_messages), NULL);
+ _free_locale(loct);
+ if (rc == -1 || rc == sizeof(iso_lc_messages))
+ return NULL;
+
+ /*
+ * Since the message catalogs sit on a case-insensitive
filesystem, we
+ * need not standardize letter case here. So long as we do not
ship
+ * message catalogs for which it would matter, we also need not
+ * translate the script/variant portion, e.g. uz-Cyrl-UZ to
+ * uz_UZ@cyrillic. Simply replace the hyphen with an
underscore.
+ *
+ * Note that the locale name can be less-specific than the
value we
+ * would derive under earlier Visual Studio releases. For
example,
+ * French_France.1252 yields just "fr". This does not affect
any of
+ * the country-specific message catalogs available as of this
writing
+ * (pt_BR, zh_CN, zh_TW).
+ */
+ hyphen = strchr(iso_lc_messages, '-');
+ if (hyphen)
+ *hyphen = '_';
+ #else
char isolang[32],
isocrty[32];
LCID lcid;
***************
*** 753,758 **** IsoLocaleName(const char *winlocname)
--- 810,816 ----
if (!GetLocaleInfoA(lcid, LOCALE_SISO3166CTRYNAME, isocrty,
sizeof(isocrty)))
return NULL;
snprintf(iso_lc_messages, sizeof(iso_lc_messages) - 1, "%s_%s",
isolang, isocrty);
+ #endif
return iso_lc_messages;
}
return NULL;
*** a/src/bin/initdb/initdb.c
--- b/src/bin/initdb/initdb.c
***************
*** 935,948 **** find_matching_ts_config(const char *lc_type)
/*
* Convert lc_ctype to a language name by stripping everything after an
! * underscore. Just for paranoia, we also stop at '.' or '@'.
*/
if (lc_type == NULL)
langname = pg_strdup("");
else
{
ptr = langname = pg_strdup(lc_type);
! while (*ptr && *ptr != '_' && *ptr != '.' && *ptr != '@')
ptr++;
*ptr = '\0';
}
--- 935,956 ----
/*
* Convert lc_ctype to a language name by stripping everything after an
! * underscore (usual case) or a hyphen (Windows "locale name"; see
! * comments at IsoLocaleName()).
! *
! * XXX Should ' ' be a stop character? This would select "norwegian"
for
! * the Windows locale "Norwegian (Nynorsk)_Norway.1252". If we do so,
we
! * should also accept the "nn" and "nb" Unix locales.
! *
! * Just for paranoia, we also stop at '.' or '@'.
*/
if (lc_type == NULL)
langname = pg_strdup("");
else
{
ptr = langname = pg_strdup(lc_type);
! while (*ptr &&
! *ptr != '_' && *ptr != '-' && *ptr != '.' && *ptr !=
'@')
ptr++;
*ptr = '\0';
}
*** a/src/port/chklocale.c
--- b/src/port/chklocale.c
***************
*** 189,214 **** static const struct encoding_match encoding_match_list[] = {
#ifdef WIN32
/*
! * On Windows, use CP<codepage number> instead of the nl_langinfo() result
*/
static char *
win32_langinfo(const char *ctype)
{
! char *r;
char *codepage;
- int ln;
/*
* Locale format on Win32 is <Language>_<Country>.<CodePage> . For
! * example, English_USA.1252.
*/
codepage = strrchr(ctype, '.');
! if (!codepage)
! return NULL;
! codepage++;
! ln = strlen(codepage);
! r = malloc(ln + 3);
! sprintf(r, "CP%s", codepage);
return r;
}
--- 189,237 ----
#ifdef WIN32
/*
! * On Windows, use CP<code page number> instead of the nl_langinfo() result
! *
! * Visual Studio 2012 expanded the set of valid LC_CTYPE values, so have its
! * locale machinery determine the code page. See comments at IsoLocaleName().
! * For other compilers, follow the locale's predictable format.
! *
! * Returns a malloc()'d string for the caller to free.
*/
static char *
win32_langinfo(const char *ctype)
{
! char *r = NULL;
!
! #if (_MSC_VER >= 1700)
! _locale_t loct = NULL;
!
! loct = _create_locale(LC_CTYPE, ctype);
! if (loct != NULL)
! {
! r = malloc(16); /* excess */
! if (r != NULL)
! sprintf(r, "CP%u", loct->locinfo->lc_codepage);
! _free_locale(loct);
! }
! #else
char *codepage;
/*
* Locale format on Win32 is <Language>_<Country>.<CodePage> . For
! * example, English_United States.1252.
*/
codepage = strrchr(ctype, '.');
! if (codepage != NULL)
! {
! int ln;
!
! codepage++;
! ln = strlen(codepage);
! r = malloc(ln + 3);
! if (r != NULL)
! sprintf(r, "CP%s", codepage);
! }
! #endif
return r;
}
*** a/src/port/win32env.c
--- b/src/port/win32env.c
***************
*** 61,66 **** pgwin32_putenv(const char *envval)
--- 61,72 ----
"msvcr90", 0, NULL
}, /* Visual
Studio 2008 */
{
+ "msvcr100", 0, NULL
+ }, /* Visual
Studio 2010 */
+ {
+ "msvcr110", 0, NULL
+ }, /* Visual
Studio 2012 */
+ {
NULL, 0, NULL
}
};
*** a/src/tools/msvc/MSBuildProject.pm
--- b/src/tools/msvc/MSBuildProject.pm
***************
*** 1,7 ****
package MSBuildProject;
#
! # Package that encapsulates a MSBuild (Visual C++ 2010) project file
#
# src/tools/msvc/MSBuildProject.pm
#
--- 1,7 ----
package MSBuildProject;
#
! # Package that encapsulates a MSBuild project file (Visual C++ 2010 or
greater)
#
# src/tools/msvc/MSBuildProject.pm
#
***************
*** 397,400 **** sub new
--- 397,442 ----
return $self;
}
+ package VC2012Project;
+
+ #
+ # Package that encapsulates a Visual C++ 2012 project file
+ #
+
+ use strict;
+ use warnings;
+ use base qw(MSBuildProject);
+
+ sub new
+ {
+ my $classname = shift;
+ my $self = $classname->SUPER::_new(@_);
+ bless($self, $classname);
+
+ $self->{vcver} = '11.00';
+
+ return $self;
+ }
+
+ # This override adds the <PlatformToolset> element
+ # to the PropertyGroup labeled "Configuration"
+ sub WriteConfigurationPropertyGroup
+ {
+ my ($self, $f, $cfgname, $p) = @_;
+ my $cfgtype =
+ ($self->{type} eq "exe")
+ ?'Application'
+ :($self->{type} eq "dll"?'DynamicLibrary':'StaticLibrary');
+
+ print $f <<EOF;
+ <PropertyGroup
Condition="'\$(Configuration)|\$(Platform)'=='$cfgname|$self->{platform}'"
Label="Configuration">
+ <ConfigurationType>$cfgtype</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>$p->{wholeopt}</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ EOF
+ }
+
1;
*** a/src/tools/msvc/README
--- b/src/tools/msvc/README
***************
*** 92,101 **** These configuration arguments are passed over to
Mkvcbuild::mkvcbuild
(Mkvcbuild.pm) which creates the Visual Studio project and solution files.
It does this by using VSObjectFactory::CreateSolution to create an object
implementing the Solution interface (this could be either a VS2005Solution,
! a VS2008Solution or a VS2010Solution, all in Solution.pm, depending on the
! user's build environment) and adding objects implementing the corresponding
! Project interface (VC2005Project or VC2008Project from VCBuildProject.pm or
! VC2010Project from MSBuildProject.pm) to it.
When Solution::Save is called, the implementations of Solution and Project
save their content in the appropriate format.
The final step of starting the appropriate build program (msbuild or vcbuild)
--- 92,102 ----
(Mkvcbuild.pm) which creates the Visual Studio project and solution files.
It does this by using VSObjectFactory::CreateSolution to create an object
implementing the Solution interface (this could be either a VS2005Solution,
! a VS2008Solution, a VS2010Solution or a VS2012Solution, all in Solution.pm,
! depending on the user's build environment) and adding objects implementing
! the corresponding Project interface (VC2005Project or VC2008Project from
! VCBuildProject.pm or VC2010Project or VC2012Project from MSBuildProject.pm)
! to it.
When Solution::Save is called, the implementations of Solution and Project
save their content in the appropriate format.
The final step of starting the appropriate build program (msbuild or vcbuild)
*** a/src/tools/msvc/Solution.pm
--- b/src/tools/msvc/Solution.pm
***************
*** 63,75 **** sub DeterminePlatform
{
my $self = shift;
! # Determine if we are in 32 or 64-bit mode. Do this by seeing if CL has
! # 64-bit only parameters.
$self->{platform} = 'Win32';
! open(P, "cl /? 2>NUL|") || die "cl command not found";
while (<P>)
{
! if (/^\/favor:</)
{
$self->{platform} = 'x64';
last;
--- 63,74 ----
{
my $self = shift;
! # Examine CL help output to determine if we are in 32 or 64-bit mode.
$self->{platform} = 'Win32';
! open(P, "cl /? 2>&1 |") || die "cl command not found";
while (<P>)
{
! if (/^\/favor:<.+AMD64/)
{
$self->{platform} = 'x64';
last;
***************
*** 700,703 **** sub new
--- 699,726 ----
return $self;
}
+ package VS2012Solution;
+
+ #
+ # Package that encapsulates a Visual Studio 2012 solution file
+ #
+
+ use Carp;
+ use strict;
+ use warnings;
+ use base qw(Solution);
+
+ sub new
+ {
+ my $classname = shift;
+ my $self = $classname->SUPER::_new(@_);
+ bless($self, $classname);
+
+ $self->{solutionFileVersion} = '12.00';
+ $self->{vcver} = '11.00';
+ $self->{visualStudioName} = 'Visual Studio 2012';
+
+ return $self;
+ }
+
1;
*** a/src/tools/msvc/VSObjectFactory.pm
--- b/src/tools/msvc/VSObjectFactory.pm
***************
*** 41,46 **** sub CreateSolution
--- 41,50 ----
{
return new VS2010Solution(@_);
}
+ elsif ($visualStudioVersion eq '11.00')
+ {
+ return new VS2012Solution(@_);
+ }
else
{
croak "The requested Visual Studio version is not supported.";
***************
*** 68,73 **** sub CreateProject
--- 72,81 ----
{
return new VC2010Project(@_);
}
+ elsif ($visualStudioVersion eq '11.00')
+ {
+ return new VC2012Project(@_);
+ }
else
{
croak "The requested Visual Studio version is not supported.";
***************
*** 82,88 **** sub DetermineVisualStudioVersion
{
# Determine version of nmake command, to set proper version of visual studio
! # we use nmake as it has existed for a long time and still exists in visual
studio 2010
open(P, "nmake /? 2>&1 |")
|| croak
"Unable to determine Visual Studio version: The nmake command wasn't found.";
--- 90,96 ----
{
# Determine version of nmake command, to set proper version of visual studio
! # we use nmake as it has existed for a long time and still exists in current
visual studio versions
open(P, "nmake /? 2>&1 |")
|| croak
"Unable to determine Visual Studio version: The nmake command wasn't found.";
***************
*** 107,117 **** sub DetermineVisualStudioVersion
sub _GetVisualStudioVersion
{
my ($major, $minor) = @_;
! if ($major > 10)
{
carp
"The determined version of Visual Studio is newer than the latest supported
version. Returning the latest supported version instead.";
! return '10.00';
}
elsif ($major < 6)
{
--- 115,125 ----
sub _GetVisualStudioVersion
{
my ($major, $minor) = @_;
! if ($major > 11)
{
carp
"The determined version of Visual Studio is newer than the latest supported
version. Returning the latest supported version instead.";
! return '11.00';
}
elsif ($major < 6)
{
*** a/src/tools/msvc/build.pl
--- b/src/tools/msvc/build.pl
***************
*** 50,56 **** elsif ($ARGV[0] ne "RELEASE")
# ... and do it
! if ($buildwhat and $vcver eq '10.00')
{
system(
"msbuild $buildwhat.vcxproj /verbosity:detailed /p:Configuration=$bconf");
--- 50,56 ----
# ... and do it
! if ($buildwhat and $vcver >= 10.00)
{
system(
"msbuild $buildwhat.vcxproj /verbosity:detailed /p:Configuration=$bconf");
*** a/src/tools/msvc/gendef.pl
--- b/src/tools/msvc/gendef.pl
***************
*** 40,45 **** while (<$ARGV[0]/*.obj>)
--- 40,46 ----
next if $pieces[6] =~ /^\(/;
next if $pieces[6] =~ /^__real/;
next if $pieces[6] =~ /^__imp/;
+ next if $pieces[6] =~ /^__xmm/;
next if $pieces[6] =~ /NULL_THUNK_DATA$/;
next if $pieces[6] =~ /^__IMPORT_DESCRIPTOR/;
next if $pieces[6] =~ /^__NULL_IMPORT/;
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers