summaryrefslogtreecommitdiff
path: root/src/tools/msvc/VSObjectFactory.pm
blob: 3bed9229918157a89c7d57e8429fcf91b23ec081 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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 version 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;