]> granicus.if.org Git - postgresql/blob - src/tools/msvc/VSObjectFactory.pm
Run pgindent on 9.2 source tree in preparation for first 9.3
[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         else
45         {
46                 croak "The requested Visual Studio version is not supported.";
47         }
48 }
49
50 sub CreateProject
51 {
52         my $visualStudioVersion = shift;
53
54         if (!defined($visualStudioVersion))
55         {
56                 $visualStudioVersion = DetermineVisualStudioVersion();
57         }
58
59         if ($visualStudioVersion eq '8.00')
60         {
61                 return new VC2005Project(@_);
62         }
63         elsif ($visualStudioVersion eq '9.00')
64         {
65                 return new VC2008Project(@_);
66         }
67         elsif ($visualStudioVersion eq '10.00')
68         {
69                 return new VC2010Project(@_);
70         }
71         else
72         {
73                 croak "The requested Visual Studio version is not supported.";
74         }
75 }
76
77 sub DetermineVisualStudioVersion
78 {
79         my $nmakeVersion = shift;
80
81         if (!defined($nmakeVersion))
82         {
83
84              # Determine version of nmake command, to set proper version of visual studio
85              # we use nmake as it has existed for a long time and still exists in visual studio 2010
86                 open(P,"nmake /? 2>&1 |")
87                   || croak
88                   "Unable to determine Visual Studio version: The nmake command wasn't found.";
89                 while(<P>)
90                 {
91                         chomp;
92                         if (/(\d+)\.(\d+)\.\d+(\.\d+)?$/)
93                         {
94                                 return _GetVisualStudioVersion($1, $2);
95                         }
96                 }
97                 close(P);
98         }
99         elsif($nmakeVersion =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/)
100         {
101                 return _GetVisualStudioVersion($1, $2);
102         }
103         croak
104           "Unable to determine Visual Studio version: The nmake version could not be determined.";
105 }
106
107 sub _GetVisualStudioVersion
108 {
109         my($major, $minor) = @_;
110         if ($major > 10)
111         {
112                 carp
113 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
114                 return '10.00';
115         }
116         elsif ($major < 6)
117         {
118                 croak
119 "Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported.";
120         }
121         return "$major.$minor";
122 }
123
124 1;