0001_windows_openssl_1.1.0_build_PG94_v1.patch

application/octet-stream

Filename: 0001_windows_openssl_1.1.0_build_PG94_v1.patch
Type: application/octet-stream
Part: 2
Message: Re: BUG #15789: libpq compilation with OpenSSL 1.1.1b fails on Windows with Visual Studio 2017

Patch

Format: unified
Series: patch v1
File+
src/tools/msvc/Project.pm 10 7
src/tools/msvc/Solution.pm 60 10
diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm
index 9ca5b1f..7360bcb 100644
--- a/src/tools/msvc/Project.pm
+++ b/src/tools/msvc/Project.pm
@@ -124,18 +124,21 @@ sub AddReference
 
 sub AddLibrary
 {
-	my ($self, $lib, $dbgsuffix) = @_;
+	my ($self, $lib, $slib) = @_;
+	my $libcfg = "MD";
+	my $xlib = defined $slib ? $slib : '';
 
-	if ($lib =~ m/\s/)
+	$xlib =~ s/\.lib$/$libcfg.lib/;
+	if ($xlib eq '' || ! -e $xlib)
 	{
-		$lib = '"' . $lib . """;
+		push @{ $self->{libraries} }, $lib;
 	}
-
-	push @{ $self->{libraries} }, $lib;
-	if ($dbgsuffix)
+	else
 	{
-		push @{ $self->{suffixlib} }, $lib;
+		push @{ $self->{libraries} }, $slib;
+		push @{ $self->{suffixlib} }, $slib;
 	}
+	return;
 }
 
 sub AddIncludeDir
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index d1a791c..cb92438 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -181,7 +181,18 @@ s{PG_VERSION_STR "[^"]+"}{__STRINGIFY(x) #x\n#define __STRINGIFY2(z) __STRINGIFY
 		  if ($self->{options}->{integer_datetimes});
 		print O "#define USE_LDAP 1\n"   if ($self->{options}->{ldap});
 		print O "#define HAVE_LIBZ 1\n"  if ($self->{options}->{zlib});
-		print O "#define USE_SSL 1\n"    if ($self->{options}->{openssl});
+		if ($self->{options}->{openssl})
+		{
+			print O "#define USE_SSL 1\n";
+			# We need to know if we are using version 1.1.0 or above
+			my ($major, $minor) = $self->GetOpenSSLVersion();
+			if ($major == 1 && $minor == 1)
+			{
+				print O "#define HAVE_BIO_METH_NEW 1\n";
+				print O "#define HAVE_OPENSSL_INIT_SSL 1\n";
+				print O "#define HAVE_RAND_OPENSSL 1\n";
+			}
+		}
 		print O "#define ENABLE_NLS 1\n" if ($self->{options}->{nls});
 
 		print O "#define BLCKSZ ", 1024 * $self->{options}->{blocksize}, "\n";
@@ -502,21 +513,39 @@ sub AddProject
 	if ($self->{options}->{openssl})
 	{
 		$proj->AddIncludeDir($self->{options}->{openssl} . '\include');
-		if (-e "$self->{options}->{openssl}/lib/VC/ssleay32MD.lib")
+		my ($major, $minor) = $self->GetOpenSSLVersion();
+		if ($major == 1 && $minor == 1)
 		{
-			$proj->AddLibrary(
-				$self->{options}->{openssl} . '\lib\VC\ssleay32.lib', 1);
-			$proj->AddLibrary(
-				$self->{options}->{openssl} . '\lib\VC\libeay32.lib', 1);
+			# Starting at version 1.1.0 OpenSSL have changed their library names from:
+			#     libeay to libcrypto
+			#     ssleay to libssl
+			if ($self->{platform} eq 'Win32')
+			{
+				$proj->AddLibrary(
+					$self->{options}->{openssl} . '\lib\libssl.lib',
+					$self->{options}->{openssl} . '\lib\VC\libssl32.lib');
+				$proj->AddLibrary(
+					$self->{options}->{openssl} . '\lib\libcrypto.lib',
+					$self->{options}->{openssl} . '\lib\VC\libcrypto32.lib');
+			}
+			else
+			{
+				$proj->AddLibrary(
+					$self->{options}->{openssl} . '\lib\libssl.lib',
+					$self->{options}->{openssl} . '\lib\VC\libssl64.lib');
+				$proj->AddLibrary(
+					$self->{options}->{openssl} . '\lib\libcrypto.lib',
+					$self->{options}->{openssl} . '\lib\VC\libcrypto64.lib');
+			}
 		}
 		else
 		{
-			# We don't expect the config-specific library to be here,
-			# so don't ask for it in last parameter
 			$proj->AddLibrary(
-				$self->{options}->{openssl} . '\lib\ssleay32.lib', 0);
+				$self->{options}->{openssl} . '\lib\ssleay32.lib',
+				$self->{options}->{openssl} . '\lib\VC\ssleay32.lib');
 			$proj->AddLibrary(
-				$self->{options}->{openssl} . '\lib\libeay32.lib', 0);
+				$self->{options}->{openssl} . '\lib\libeay32.lib',
+				$self->{options}->{openssl} . '\lib\VC\libeay32.lib');
 		}
 	}
 	if ($self->{options}->{nls})
@@ -842,4 +871,25 @@ MinimumVisualStudioVersion = $self->{MinimumVisualStudioVersion}
 |;
 }
 
+sub GetOpenSSLVersion
+{
+	my $self = shift;
+
+	# Attempt to get OpenSSL version and location.
+	# Assume openssl.exe in specified dir.
+	my $opensslprog = '\bin\openssl.exe version 2>&1';
+	my $opensslcmd = '"' . $self->{options}->{openssl} . '"' . $opensslprog;
+	my $sslout = `$opensslcmd`;
+	die "Unable to determine OpenSSL: The openssl.exe command was not found." if $?;
+
+	if ($sslout =~ /(\d+)\.(\d+)\.(\d+)/m)
+	{
+		return ($1, $2)
+	}
+	else
+	{
+		die "Unable to determine OpenSSL version: The openssl.exe version could not be determined.";
+	}
+}
+
 1;