<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">#! /usr/bin/perl
# $Id: MSProject.pm 91813 2010-09-17 07:52:52Z johnnyw $

package PerlACE::MSProject;

use strict;
use FileHandle;

###############################################################################

# Constructor

sub new
{
    my $proto = shift;
    my $class = ref ($proto) || $proto;
    my $self = {};

    $self-&gt;{FILENAME} = shift;
    $self-&gt;{VERSION} = undef;
    $self-&gt;{NAME} = undef;
    %{$self-&gt;{CONFIGS}} = ();

    bless ($self, $class);
    return $self;
}

###############################################################################

# Accessors

sub Filename
{
    my $self = shift;

    if (@_ != 0) {
        $self-&gt;{FILENAME} = shift;
    }

    return $self-&gt;{FILENAME};
}

sub Version ()
{
    my $self = shift;
    return $self-&gt;{VERSION};
}

sub Name ()
{
    my $self = shift;
    return $self-&gt;{NAME};
}

sub Configs ()
{
    my $self = shift;
    return keys %{$self-&gt;{CONFIGS}};
}

sub DepOutputFile ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    my $name = $self-&gt;OutputFile ($config);

    if ($name =~ m/\.dll$/) {
        $name = $self-&gt;LibraryFile ($config);
    }

    $name =~ s/.*\\//; # / &lt;- For devenv
    $name =~ s/.*\///;

    return $name;
}

sub OutputFile ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    if (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ m/out\:\"([^\"]*)\"/) {
        return $1;
    }
    elsif (defined $self-&gt;Name ()) {
        my $filename = $self-&gt;Filename;
        my $ext = "";

        if (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ m/\/dll/) {
            $ext = ".dll";
        }
        elsif (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ m/\/subsystem\:/) {
            $ext = ".exe";
        }
        else {
            $ext = ".lib";
        }

        $filename =~ s/\.[^\.]*$/$ext/;
        return $filename;
    }
}


sub LibraryFile ($)
{
    my $self = shift;
    my $config = shift;
    my $dll = undef;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    if ($self-&gt;OutputFile ($config) =~ m/([^\/\\]*)\.dll$/i) {
        $dll = $1;
    }

    if (defined $dll) {
        if (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ m/implib\:\"([^\"]*)\"/i) {
            return $1;
        }
        else {
            $dll =~ s/.*\\//ig; # / &lt;- Just here to fix color coding in devenv beta
            return $self-&gt;OutputDir ($config). $dll . ".lib";
        }
    }
}

sub OutputDir ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{OUTPUTDIR};
}

sub IntermidiateDir ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{INTERMEDIATEDIR};
}

sub TargetDir ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{TARGETDIR};
}

sub CPPOptions ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{CPP};
}

sub LINKOptions ($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK};
}

sub Libs($)
{
    my $self = shift;
    my $config = shift;

    if (!defined $config) {
        print STDERR "Error: No configuration specified\n";
        return;
    }

    return %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LIBS};
}

sub UsesTAOIDL ()
{
    my $self = shift;

    return $self-&gt;{TAOIDL};
}

sub Compiler ()
{
    my $self = shift;

    return $self-&gt;{COMPILER};
}

###############################################################################

# Big methods

sub Load ()
{
    my $self = shift;
    my $config = "Unknown";

    $self-&gt;{valid} = 0;

    my $fh = new FileHandle;

    unless ($fh-&gt;open ("&lt;" . $self-&gt;{FILENAME})) {
        print "Could not open file ", $self-&gt;{FILENAME}, ": ", $_;
        return;
    }

    while (&lt;$fh&gt;) {
        if (m/^\#.*Project File - Name=\"([^\"]*)\"/) {
            $self-&gt;{NAME} = $1;
        }

        if (m/^\#.*Format Version (.*)/) {
            $self-&gt;{VERSION} = $1;
        }

        # Check for configurations

        if (m/^\!.*IF  \"\$\(CFG\)\" == \".* - (.*)$\"/) {
            $config = $1;
        }
        elsif (m/^\!ENDIF$/) {
            $config = "";
        }

        # Check for directories

        if (m/\# PROP Output_Dir \"(.*)\"/) {
            %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{OUTPUTDIR} = $1;
        }
        elsif (m/\# PROP Intermediate_Dir \"(.*)\"/) {
            %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{INTERMEDIATEDIR} = $1;
        }
        elsif (m/\# PROP Target_Dir \"(.*)\"/) {
            %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{TARGETDIR} = $1;
        }

        # Look at CPP options

        if (m/\# ADD BASE CPP(.*)$/ || m/\# ADD CPP(.*)$/) {
            my @flags = split (/ \//, $1);

            foreach my $flag (@flags) {
                if ($flag &amp;&amp; %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{CPP} !~ m/$flag/) {
                    %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{CPP} .= " /$flag";
                }
            }
        }
        elsif (m/\# SUBTRACT CPP(.*)$/ || m/\# SUBTRACT BASE CPP(.*)$/) {
            my @flags = split (/ \//, $1);

            foreach my $flag (@flags) {
                if ($flag &amp;&amp; %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{CPP} =~ m/$flag/) {
                    %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{CPP} =~ s/ \/$flag//g;
                }
            }
        }

        # Look at LINK32 options

        if (m/\# ADD BASE LINK32(.*)$/ || m/\# ADD LINK32(.*)$/
            || m/\# ADD BASE LIB32(.*)$/ || m/\# ADD LIB32(.*)$/) {
            my @flags = split (/ \//, $1);

            foreach my $flag (@flags) {
                my $found = 0;
                my @libs = split (/ /, $flag);

                foreach my $lib (@libs) {
                    if ($lib =~ m/\.lib$/) {
                        if (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LIBS} !~ m/\Q$lib\E/) {
                            %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LIBS} .= " $lib";
                        }
                        $found = 1;
                    }
                }

                if (!$found &amp;&amp; $flag) {
                    my $shortflag = $flag;
                    if ($flag =~ m/^(.*)\:/) {
                        $shortflag = $1;
                    }

                    if (%{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} !~ m/ \/$shortflag/) {
                        %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} .= " /$flag";
                    }
                }
            }
        }
        elsif (m/\# SUBTRACT BASE LINK32(.*)$/ || m/\# SUBTRACT LINK32(.*)$/
               || m/\# SUBTRACT BASE LIB32(.*)$/ || m/\# SUBTRACT LIB32(.*)$/) {
            my @flags = split (/ \//, $1);

            foreach my $flag (@flags) {
                my $shortflag = $flag;
                if ($flag =~ m/^(.*)\:/) {
                    $shortflag = $1;
                }

                if ($flag &amp;&amp; %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ m/ (\/$shortflag\:[^ ]*)/) {
                    %{$self-&gt;{CONFIGS}}-&gt;{$config}-&gt;{LINK} =~ s/ \Q$1\E//ig;
                }
            }
        }

        if (m/^\# Name \".* - (.*)\"/ &amp;&amp; defined %{$self-&gt;{CONFIGS}}-&gt;{"Unknown"}) {
            %{$self-&gt;{CONFIGS}}-&gt;{$1} = %{$self-&gt;{CONFIGS}}-&gt;{"Unknown"};
            delete %{$self-&gt;{CONFIGS}}-&gt;{"Unknown"};
        }

        if (m/tao\_idl/ &amp;&amp; m/\$\(InputName\)\.idl/ || m/tao\_idl/ &amp;&amp; m/\$\(InputPath\)/) {
            $self-&gt;{TAOIDL} = 1;
        }
    }
    $fh-&gt;close ();
    $self-&gt;{valid} = 1;
}

###############################################################################

# Build functions

sub Build ($)
{
    my $self = shift;
    my ($config) = @_;

    my $command = $self-&gt;Compiler () . " " . $self-&gt;Filename ()
                  . " /USEENV"
                  . " /MAKE \"" . $self-&gt;Name ()
                  . " - " . $config . "\"";

    system $command;
}

sub Clean ($)
{
    my $self = shift;
    my ($config) = @_;

    my $command = $self-&gt;Compiler () . " " . $self-&gt;Filename ()
                  . " /USEENV"
                  . " /MAKE \"" . $self-&gt;Name ()
                  . " - " . $config . "\" /CLEAN";

    system $command;
}


1;</pre></body></html>