summaryrefslogtreecommitdiff
path: root/src/tools/msvc/VSObjectFactory.pm
diff options
context:
space:
mode:
authorAndrew Dunstan2012-01-03 13:44:26 +0000
committerAndrew Dunstan2012-01-03 13:44:26 +0000
commit63876d3bac5a7471a7987da25a93c13a2534a644 (patch)
treebc5b7db72bfb0514e50bc0f61dc279ea21561962 /src/tools/msvc/VSObjectFactory.pm
parentf132824c24c46d2efab49b4cddd1088781bf499e (diff)
Support for building with MS Visual Studio 2010.
Brar Piening, reviewed by Craig Ringer.
Diffstat (limited to 'src/tools/msvc/VSObjectFactory.pm')
-rw-r--r--src/tools/msvc/VSObjectFactory.pm122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/tools/msvc/VSObjectFactory.pm b/src/tools/msvc/VSObjectFactory.pm
new file mode 100644
index 00000000000..44db1f6814c
--- /dev/null
+++ b/src/tools/msvc/VSObjectFactory.pm
@@ -0,0 +1,122 @@
+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 VCBuildProject;
+use MSBuildProject;
+
+our (@ISA, @EXPORT);
+@ISA = qw(Exporter);
+@EXPORT = qw(CreateSolution CreateProject DetermineVisualStudioVersion);
+
+sub CreateSolution
+{
+ my $visualStudioVersion = shift;
+
+ if (!defined($visualStudioVersion))
+ {
+ $visualStudioVersion = DetermineVisualStudioVersion();
+ }
+
+ if ($visualStudioVersion eq '8.00')
+ {
+ return new VS2005Solution(@_);
+ }
+ elsif ($visualStudioVersion eq '9.00')
+ {
+ return new VS2008Solution(@_);
+ }
+ elsif ($visualStudioVersion eq '10.00')
+ {
+ return new VS2010Solution(@_);
+ }
+ else
+ {
+ croak "The requested Visual Studio version is not supported.";
+ }
+}
+
+sub CreateProject
+{
+ my $visualStudioVersion = shift;
+
+ if (!defined($visualStudioVersion))
+ {
+ $visualStudioVersion = DetermineVisualStudioVersion();
+ }
+
+ if ($visualStudioVersion eq '8.00')
+ {
+ return new VC2005Project(@_);
+ }
+ elsif ($visualStudioVersion eq '9.00')
+ {
+ return new VC2008Project(@_);
+ }
+ elsif ($visualStudioVersion eq '10.00')
+ {
+ return new VC2010Project(@_);
+ }
+ else
+ {
+ croak "The requested Visual Studio version is not supported.";
+ }
+}
+
+sub DetermineVisualStudioVersion
+{
+ my $nmakeVersion = shift;
+
+ if (!defined($nmakeVersion))
+ {
+
+ # Determine version of nmake command, to set proper verison of visual studio
+ # we use nmake as it has existed for a long time and still exists in visual studio 2010
+ open(P,"nmake /? 2>&1 |")
+ || croak "Unable to determine Visual Studio version: The nmake command wasn't found.";
+ while(<P>)
+ {
+ chomp;
+ if (/(\d+)\.(\d+)\.\d+(\.\d+)?$/)
+ {
+ return _GetVisualStudioVersion($1, $2);
+ }
+ }
+ close(P);
+ }
+ elsif($nmakeVersion =~ /(\d+)\.(\d+)\.\d+(\.\d+)?$/)
+ {
+ return _GetVisualStudioVersion($1, $2);
+ }
+ croak "Unable to determine Visual Studio version: The nmake version could not be determined.";
+}
+
+sub _GetVisualStudioVersion
+{
+ my($major, $minor) = @_;
+ if ($major > 10)
+ {
+ carp
+"The determined version of Visual Studio is newer than the latest supported version. Returning the latest supported version instead.";
+ return '10.00';
+ }
+ elsif ($major < 6)
+ {
+ croak
+"Unable to determine Visual Studio version: Visual Studio versions before 6.0 aren't supported.";
+ }
+ return "$major.$minor";
+}
+
+1;