From 4b09d5c766dfacace9973b5d0f38d453537149b3 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <peter@eisentraut.org>
Date: Thu, 13 Feb 2020 14:22:46 +0100
Subject: [PATCH v2] Allow running src/tools/msvc/mkvcbuild.pl under not
 Windows

This to allow verifying the MSVC build file generation without having
to have Windows.

To do this, we avoid Windows-specific Perl modules and don't run the
"cl" compiler.  The resulting build files won't actually be completely
correct, but it's useful enough.
---
 src/tools/msvc/Mkvcbuild.pm       |  6 ++++--
 src/tools/msvc/Project.pm         |  2 +-
 src/tools/msvc/Solution.pm        | 17 ++++++++++++-----
 src/tools/msvc/VSObjectFactory.pm | 31 +++++++++++++++++++------------
 4 files changed, 36 insertions(+), 20 deletions(-)

diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index a43e31c60e..b9f759a886 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -6,7 +6,7 @@ package Mkvcbuild;
 # src/tools/msvc/Mkvcbuild.pm
 #
 use Carp;
-use Win32;
+use if ($^O eq "MSWin32"), 'Win32';
 use strict;
 use warnings;
 use Project;
@@ -650,9 +650,11 @@ sub mkvcbuild
 					# 'Can't spawn "conftest.exe"'; suppress that.
 					no warnings;
 
+					no strict 'subs';
+
 					# Disable error dialog boxes like we do in the postmaster.
 					# Here, we run code that triggers relevant errors.
-					use Win32API::File qw(SetErrorMode :SEM_);
+					use if ($^O eq "MSWin32"), 'Win32API::File', qw(SetErrorMode :SEM_);
 					my $oldmode = SetErrorMode(
 						SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
 					system(".\\$exe");
diff --git a/src/tools/msvc/Project.pm b/src/tools/msvc/Project.pm
index 7d25704e2c..d90a996d46 100644
--- a/src/tools/msvc/Project.pm
+++ b/src/tools/msvc/Project.pm
@@ -22,7 +22,7 @@ sub _new
 	my $self = {
 		name                  => $name,
 		type                  => $type,
-		guid                  => Win32::GuidGen(),
+		guid                  => $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE',
 		files                 => {},
 		references            => [],
 		libraries             => [],
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
index 8412ef298e..68c1ebb833 100644
--- a/src/tools/msvc/Solution.pm
+++ b/src/tools/msvc/Solution.pm
@@ -60,10 +60,17 @@ sub DeterminePlatform
 {
 	my $self = shift;
 
-	# Examine CL help output to determine if we are in 32 or 64-bit mode.
-	my $output = `cl /? 2>&1`;
-	$? >> 8 == 0 or die "cl command not found";
-	$self->{platform} = ($output =~ /^\/favor:<.+AMD64/m) ? 'x64' : 'Win32';
+	if ($^O eq "MSWin32")
+	{
+		# Examine CL help output to determine if we are in 32 or 64-bit mode.
+		my $output = `cl /? 2>&1`;
+		$? >> 8 == 0 or die "cl command not found";
+		$self->{platform} = ($output =~ /^\/favor:<.+AMD64/m) ? 'x64' : 'Win32';
+	}
+	else
+	{
+		$self->{platform} = 'FAKE';
+	}
 	print "Detected hardware platform: $self->{platform}\n";
 	return;
 }
@@ -1081,7 +1088,7 @@ EOF
 		}
 		if ($fld ne "")
 		{
-			$flduid{$fld} = Win32::GuidGen();
+			$flduid{$fld} = $^O eq "MSWin32" ? Win32::GuidGen() : 'FAKE';
 			print $sln <<EOF;
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "$fld", "$fld", "$flduid{$fld}"
 EndProject
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
index 610dc61286..e6983b241f 100644
--- a/src/tools/msvc/VSObjectFactory.pm
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -111,21 +111,28 @@ sub CreateProject
 
 sub DetermineVisualStudioVersion
 {
+	if ($^O eq "MSWin32")
+	{
+		# To determine version of Visual Studio we use nmake as it has
+		# existed for a long time and still exists in current Visual
+		# Studio versions.
+		my $output = `nmake /? 2>&1`;
+		$? >> 8 == 0
+		  or croak
+		  "Unable to determine Visual Studio version: The nmake command wasn't found.";
+		if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
+		{
+			return _GetVisualStudioVersion($1, $2);
+		}
 
-	# To determine version of Visual Studio we use nmake as it has
-	# existed for a long time and still exists in current Visual
-	# Studio versions.
-	my $output = `nmake /? 2>&1`;
-	$? >> 8 == 0
-	  or croak
-	  "Unable to determine Visual Studio version: The nmake command wasn't found.";
-	if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
+		croak
+		  "Unable to determine Visual Studio version: The nmake version could not be determined.";
+	}
+	else
 	{
-		return _GetVisualStudioVersion($1, $2);
+		# fake version
+		return '16.00';
 	}
-
-	croak
-	  "Unable to determine Visual Studio version: The nmake version could not be determined.";
 }
 
 sub _GetVisualStudioVersion
-- 
2.25.0

