1 package VSObjectFactory;
4 # Package that creates Visual Studio wrapper objects for msvc build
6 # src/tools/msvc/VSObjectFactory.pm
20 @EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion);
22 no warnings qw(redefine); ## no critic
26 my $visualStudioVersion = shift;
28 if (!defined($visualStudioVersion))
30 $visualStudioVersion = DetermineVisualStudioVersion();
33 if ($visualStudioVersion eq '12.00')
35 return new VS2013Solution(@_);
37 elsif ($visualStudioVersion eq '14.00')
39 return new VS2015Solution(@_);
42 # The version of nmake bundled in Visual Studio 2017 is greater
43 # than 14.10 and less than 14.20. And the version number is
46 ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
47 || $visualStudioVersion eq '15.00')
49 return new VS2017Solution(@_);
52 # The version of nmake bundled in Visual Studio 2019 is greater
53 # than 14.20 and less than 14.30. And the version number is
56 ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30')
57 || $visualStudioVersion eq '16.00')
59 return new VS2019Solution(@_);
64 "The requested Visual Studio version $visualStudioVersion is not supported.";
70 my $visualStudioVersion = shift;
72 if (!defined($visualStudioVersion))
74 $visualStudioVersion = DetermineVisualStudioVersion();
77 if ($visualStudioVersion eq '12.00')
79 return new VC2013Project(@_);
81 elsif ($visualStudioVersion eq '14.00')
83 return new VC2015Project(@_);
86 # The version of nmake bundled in Visual Studio 2017 is greater
87 # than 14.10 and less than 14.20. And the version number is
90 ($visualStudioVersion ge '14.10' && $visualStudioVersion lt '14.20')
91 || $visualStudioVersion eq '15.00')
93 return new VC2017Project(@_);
96 # The version of nmake bundled in Visual Studio 2019 is greater
97 # than 14.20 and less than 14.30. And the version number is
100 ($visualStudioVersion ge '14.20' && $visualStudioVersion lt '14.30')
101 || $visualStudioVersion eq '16.00')
103 return new VC2019Project(@_);
108 "The requested Visual Studio version $visualStudioVersion is not supported.";
112 sub DetermineVisualStudioVersion
115 # To determine version of Visual Studio we use nmake as it has
116 # existed for a long time and still exists in current Visual
118 my $output = `nmake /? 2>&1`;
121 "Unable to determine Visual Studio version: The nmake command wasn't found.";
122 if ($output =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/m)
124 return _GetVisualStudioVersion($1, $2);
128 "Unable to determine Visual Studio version: The nmake version could not be determined.";
131 sub _GetVisualStudioVersion
133 my ($major, $minor) = @_;
135 # The major visual studio that is supported has nmake
136 # version <= 14.30, so stick with it as the latest version
137 # if bumping on something even newer.
138 if ($major >= 14 && $minor >= 30)
141 "The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
147 "Unable to determine Visual Studio version: Visual Studio versions before 12.0 aren't supported.";
149 return "$major.$minor";