When making build system changes that risk breaking the MSVC build system, it's useful to be able to run the part of the MSVC build tools that read the makefiles and produce the project files under a not-Windows platform. This part does not really depend on anything particular to Windows, so it's possible in principle. There are some minor dependencies on Windows, however, that need to be worked around. I have had some local hacks for that for a while, and I took a moment to clean them up and make them presentable, so here they are. Interested?

To test, apply the patch and run perl src/tools/msvc/mkvcbuild.pl .

--
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From faf9c14893500485beb299e02a9a1374820b9bfd Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Thu, 13 Feb 2020 09:20:57 +0100
Subject: [PATCH] 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 ++++++++++++-----
 3 files changed, 17 insertions(+), 8 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
-- 
2.25.0

Reply via email to