diff options
Diffstat (limited to '')
-rw-r--r-- | src/tools/msvc/VSObjectFactory.pm | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm new file mode 100644 index 0000000..a865604 --- /dev/null +++ b/src/tools/msvc/VSObjectFactory.pm @@ -0,0 +1,182 @@ + +# Copyright (c) 2021, PostgreSQL Global Development Group + +package VSObjectFactory; + +# +# Package that creates Visual Studio wrapper objects for msvc build +# +# src/tools/msvc/VSObjectFactory.pm +# + +use Carp; +use strict; +use warnings; + +use Exporter; +use Project; +use Solution; +use MSBuildProject; + +our (@ISA, @EXPORT); +@ISA = qw(Exporter); +@EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion); + +no warnings qw(redefine); ## no critic + +sub CreateSolution +{ + my $visualStudioVersion = shift; + + if (!defined($visualStudioVersion)) + { + $visualStudioVersion = DetermineVisualStudioVersion(); + } + + if ($visualStudioVersion eq '12.00') + { + return new VS2013Solution(@_); + } + elsif ($visualStudioVersion eq '14.00') + { + return new VS2015Solution(@_); + } + + # The version of nmake bundled in Visual Studio 2017 is greater + # than 14.10 and less than 14.20. And the version number is + # actually 15.00. + elsif ( + ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20') + || $visualStudioVersion eq '15.00') + { + return new VS2017Solution(@_); + } + + # The version of nmake bundled in Visual Studio 2019 is greater + # than 14.20 and less than 14.30. And the version number is + # actually 16.00. + elsif ( + ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30') + || $visualStudioVersion eq '16.00') + { + return new VS2019Solution(@_); + } + + # The version of nmake bundled in Visual Studio 2022 is greater + # than 14.30 and less than 14.40. And the version number is + # actually 17.00. + elsif ( + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + || $visualStudioVersion eq '17.00') + { + return new VS2022Solution(@_); + } + else + { + croak + "The requested Visual Studio version $visualStudioVersion is not supported."; + } +} + +sub CreateProject +{ + my $visualStudioVersion = shift; + + if (!defined($visualStudioVersion)) + { + $visualStudioVersion = DetermineVisualStudioVersion(); + } + + if ($visualStudioVersion eq '12.00') + { + return new VC2013Project(@_); + } + elsif ($visualStudioVersion eq '14.00') + { + return new VC2015Project(@_); + } + + # The version of nmake bundled in Visual Studio 2017 is greater + # than 14.10 and less than 14.20. And the version number is + # actually 15.00. + elsif ( + ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20') + || $visualStudioVersion eq '15.00') + { + return new VC2017Project(@_); + } + + # The version of nmake bundled in Visual Studio 2019 is greater + # than 14.20 and less than 14.30. And the version number is + # actually 16.00. + elsif ( + ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30') + || $visualStudioVersion eq '16.00') + { + return new VC2019Project(@_); + } + + # The version of nmake bundled in Visual Studio 2022 is greater + # than 14.30 and less than 14.40. And the version number is + # actually 17.00. + elsif ( + ($visualStudioVersion ge '14.30' && $visualStudioVersion lt '14.40') + || $visualStudioVersion eq '17.00') + { + return new VC2022Project(@_); + } + else + { + croak + "The requested Visual Studio version $visualStudioVersion is not supported."; + } +} + +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+)?/) + { + return _GetVisualStudioVersion($1, $2); + } + + croak + "Unable to determine Visual Studio version: The nmake version could not be determined."; + } + else + { + # fake version + return '17.00'; + } +} + +sub _GetVisualStudioVersion +{ + my ($major, $minor) = @_; + + # The major visual studio that is supported has nmake + # version <= 14.40, so stick with it as the latest version + # if bumping on something even newer. + if ($major >= 14 && $minor >= 40) + { + carp + "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead."; + return '14.30'; + } + elsif ($major < 12) + { + croak + "Unable to determine Visual Studio version: Visual Studio versions before 12.0 aren't supported."; + } + return "$major.$minor"; +} + +1; |