1 package VSObjectFactory;
4 # Package that creates Visual Studio wrapper objects for msvc build
6 # src/tools/msvc/VSObjectFactory.pm
21 @EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion);
25 my $visualStudioVersion = shift;
27 if (!defined($visualStudioVersion))
29 $visualStudioVersion = DetermineVisualStudioVersion();
32 if ($visualStudioVersion eq '8.00')
34 return new VS2005Solution(@_);
36 elsif ($visualStudioVersion eq '9.00')
38 return new VS2008Solution(@_);
40 elsif ($visualStudioVersion eq '10.00')
42 return new VS2010Solution(@_);
44 elsif ($visualStudioVersion eq '11.00')
46 return new VS2012Solution(@_);
48 elsif ($visualStudioVersion eq '12.00')
50 return new VS2013Solution(@_);
52 elsif ($visualStudioVersion eq '14.00')
54 return new VS2015Solution(@_);
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'))
61 return new VS2017Solution(@_);
65 croak $visualStudioVersion;
66 croak "The requested Visual Studio version is not supported.";
72 my $visualStudioVersion = shift;
74 if (!defined($visualStudioVersion))
76 $visualStudioVersion = DetermineVisualStudioVersion();
79 if ($visualStudioVersion eq '8.00')
81 return new VC2005Project(@_);
83 elsif ($visualStudioVersion eq '9.00')
85 return new VC2008Project(@_);
87 elsif ($visualStudioVersion eq '10.00')
89 return new VC2010Project(@_);
91 elsif ($visualStudioVersion eq '11.00')
93 return new VC2012Project(@_);
95 elsif ($visualStudioVersion eq '12.00')
97 return new VC2013Project(@_);
99 elsif ($visualStudioVersion eq '14.00')
101 return new VC2015Project(@_);
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'))
108 return new VC2017Project(@_);
112 croak $visualStudioVersion;
113 croak "The requested Visual Studio version is not supported.";
117 sub DetermineVisualStudioVersion
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
123 my $output = `nmake /? 2>&1`;
126 "Unable to determine Visual Studio version: The nmake command wasn't found.";
127 if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
129 return _GetVisualStudioVersion($1, $2);
133 "Unable to determine Visual Studio version: The nmake version could not be determined.";
136 sub _GetVisualStudioVersion
138 my ($major, $minor) = @_;
140 # visual 2017 hasn't changed the nmake version to 15, so still using the older version for comparison.
144 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
150 "Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported.";
152 return "$major.$minor";