]> granicus.if.org Git - postgresql/blob - src/tools/msvc/VSObjectFactory.pm
perltidy: Add option --nooutdent-long-quotes
[postgresql] / src / tools / msvc / VSObjectFactory.pm
1 package VSObjectFactory;
2
3 #
4 # Package that creates Visual Studio wrapper objects for msvc build
5 #
6 # src/tools/msvc/VSObjectFactory.pm
7 #
8
9 use Carp;
10 use strict;
11 use warnings;
12
13 use Exporter;
14 use Project;
15 use Solution;
16 use VCBuildProject;
17 use MSBuildProject;
18
19 our (@ISA, @EXPORT);
20 @ISA    = qw(Exporter);
21 @EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion);
22
23 sub CreateSolution
24 {
25         my $visualStudioVersion = shift;
26
27         if (!defined($visualStudioVersion))
28         {
29                 $visualStudioVersion = DetermineVisualStudioVersion();
30         }
31
32         if ($visualStudioVersion eq '8.00')
33         {
34                 return new VS2005Solution(@_);
35         }
36         elsif ($visualStudioVersion eq '9.00')
37         {
38                 return new VS2008Solution(@_);
39         }
40         elsif ($visualStudioVersion eq '10.00')
41         {
42                 return new VS2010Solution(@_);
43         }
44         elsif ($visualStudioVersion eq '11.00')
45         {
46                 return new VS2012Solution(@_);
47         }
48         elsif ($visualStudioVersion eq '12.00')
49         {
50                 return new VS2013Solution(@_);
51         }
52         elsif ($visualStudioVersion eq '14.00')
53         {
54                 return new VS2015Solution(@_);
55         }
56
57 # visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it.
58         elsif (($visualStudioVersion ge '14.10')
59                 or ($visualStudioVersion eq '15.00'))
60         {
61                 return new VS2017Solution(@_);
62         }
63         else
64         {
65                 croak $visualStudioVersion;
66                 croak "The requested Visual Studio version is not supported.";
67         }
68 }
69
70 sub CreateProject
71 {
72         my $visualStudioVersion = shift;
73
74         if (!defined($visualStudioVersion))
75         {
76                 $visualStudioVersion = DetermineVisualStudioVersion();
77         }
78
79         if ($visualStudioVersion eq '8.00')
80         {
81                 return new VC2005Project(@_);
82         }
83         elsif ($visualStudioVersion eq '9.00')
84         {
85                 return new VC2008Project(@_);
86         }
87         elsif ($visualStudioVersion eq '10.00')
88         {
89                 return new VC2010Project(@_);
90         }
91         elsif ($visualStudioVersion eq '11.00')
92         {
93                 return new VC2012Project(@_);
94         }
95         elsif ($visualStudioVersion eq '12.00')
96         {
97                 return new VC2013Project(@_);
98         }
99         elsif ($visualStudioVersion eq '14.00')
100         {
101                 return new VC2015Project(@_);
102         }
103
104 # visual 2017 hasn't changed the nmake version to 15, so adjust the check to support it.
105         elsif (($visualStudioVersion ge '14.10')
106                 or ($visualStudioVersion eq '15.00'))
107         {
108                 return new VC2017Project(@_);
109         }
110         else
111         {
112                 croak $visualStudioVersion;
113                 croak "The requested Visual Studio version is not supported.";
114         }
115 }
116
117 sub DetermineVisualStudioVersion
118 {
119
120         # To determine version of Visual Studio we use nmake as it has
121         # existed for a long time and still exists in current Visual
122         # Studio versions.
123         my $output = `nmake /? 2>&1`;
124         $? >> 8 == 0
125           or croak
126           "Unable to determine Visual Studio version: The nmake command wasn't found.";
127         if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
128         {
129                 return _GetVisualStudioVersion($1, $2);
130         }
131
132         croak
133           "Unable to determine Visual Studio version: The nmake version could not be determined.";
134 }
135
136 sub _GetVisualStudioVersion
137 {
138         my ($major, $minor) = @_;
139
140 # visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison.
141         if ($major > 14)
142         {
143                 carp
144                   "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
145                 return '14.00';
146         }
147         elsif ($major < 6)
148         {
149                 croak
150                   "Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported.";
151         }
152         return "$major.$minor";
153 }
154
155 1;