summaryrefslogtreecommitdiff
path: root/ACE/MPC/modules/Depgen/Driver.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/MPC/modules/Depgen/Driver.pm')
-rw-r--r--ACE/MPC/modules/Depgen/Driver.pm244
1 files changed, 244 insertions, 0 deletions
diff --git a/ACE/MPC/modules/Depgen/Driver.pm b/ACE/MPC/modules/Depgen/Driver.pm
new file mode 100644
index 00000000000..8aac67ca7f6
--- /dev/null
+++ b/ACE/MPC/modules/Depgen/Driver.pm
@@ -0,0 +1,244 @@
+package Driver;
+
+# ************************************************************
+# Description : Generate dependencies for Make and NMake.
+# Author : Chad Elliott
+# Create Date : 3/21/2007
+# ************************************************************
+
+# ************************************************************
+# Pragma Section
+# ************************************************************
+
+use strict;
+use File::Basename;
+
+use DependencyEditor;
+
+# ************************************************************
+# Data Section
+# ************************************************************
+
+my $version = '1.2';
+my $os = ($^O eq 'MSWin32' ? 'Windows' : 'UNIX');
+my %types;
+my %defaults = ('UNIX' => 'make',
+ 'Windows' => 'nmake',
+ );
+
+# ************************************************************
+# Subroutine Section
+# ************************************************************
+
+sub BEGIN {
+ my $fh = new FileHandle();
+ my(%writers, %generators);
+
+ ## Find all the dependency writers and object generators
+ foreach my $dir (@INC) {
+ if (opendir($fh, $dir)) {
+ foreach my $module (readdir($fh)) {
+ if ($module =~ /(.+)DependencyWriter\.pm$/) {
+ my $type = lc($1);
+ my $class = $module;
+ $class =~ s/\.pm$//;
+ require $module;
+ $writers{$type} = $class;
+ $types{$type} = 1;
+ }
+ elsif ($module =~ /(.+)ObjectGenerator\.pm$/) {
+ my $type = lc($1);
+ my $class = $module;
+ $class =~ s/\.pm$//;
+ require $module;
+ $generators{$type} = $class;
+ }
+ }
+ closedir($fh);
+ }
+ }
+
+ ## Register them with the right factory
+ DependencyWriterFactory::register(\%writers);
+ ObjectGeneratorFactory::register(\%generators);
+}
+
+
+sub new {
+ my $class = shift;
+ my $self = bless {'automatic' => [],
+ }, $class;
+
+ foreach my $add (@_) {
+ if ($add =~ /(UNIX|Windows)=(.*)/) {
+ $defaults{$1} = $2;
+ }
+ elsif ($add =~ /automatic=(.*)/) {
+ my @auto = split(/,/, $1);
+ $self->{'automatic'} = \@auto;
+ }
+ else {
+ print "WARNING: Unknown parameter: $add\n";
+ }
+ }
+
+ return $self;
+}
+
+
+sub usageAndExit {
+ my($self, $opt) = @_;
+ my $base = basename($0);
+
+ if (defined $opt) {
+ print "$opt.\n";
+ }
+
+ print "$base v$version\n" .
+ "Usage: $base [-D<MACRO>[=VALUE]] [-I<include dir>] ",
+ (defined $self->{'automatic'}->[0] ? "[-A] " : ''),
+ "[-R <VARNAME>]\n" .
+ " " . (" " x length($base)) .
+ " [-e <file>] [-f <output file>] [-i] [-t <type>] [-n]\n" .
+ " " . (" " x length($base)) . " <files...>\n" .
+ "\n";
+ if (defined $self->{'automatic'}->[0]) {
+ print "-A Replace paths equal to the following variables with ",
+ "the corresponding \$()\n value: ",
+ join(', ', @{$self->{'automatic'}}), ".\n";
+ }
+ print "-D This option sets a macro to an optional value.\n" .
+ "-I The -I option adds an include directory.\n" .
+ "-R Replace \$VARNAME paths with \$(VARNAME).\n" .
+ "-e Exclude dependencies generated by <file>, but not <file> " .
+ "itself.\n" .
+ "-f Specifies the output file. This file will be edited if it " .
+ "already\n exists.\n" .
+ "-i Do not print an error if no source files are provided.\n" .
+ "-n Do not include inline files (ending in .i or .inl) in the " .
+ "dependencies.\n" .
+ "-t Use specified type (";
+ my @keys = sort keys %types;
+ for(my $i = 0; $i <= $#keys; ++$i) {
+ print "$keys[$i]" .
+ ($i != $#keys ? $i == $#keys - 1 ? ' or ' : ', ' : '');;
+ }
+ print ") instead of the default.\n" .
+ " The default is ";
+ @keys = sort keys %defaults;
+ for(my $i = 0; $i <= $#keys; ++$i) {
+ my $def = $keys[$i];
+ print $defaults{$def} . " on $def" .
+ ($i != $#keys ? $i == $#keys - 1 ? ' and ' : ', ' : '');
+ }
+ print ".\n";
+ exit(0);
+}
+
+
+sub setReplace {
+ my($self, $replace, $name, $value) = @_;
+
+ if (defined $name) {
+ ## The key will be used in a regular expression.
+ ## So, we need to escape some special characters.
+ $name = File::Spec->canonpath($name);
+ $name =~ s/([\+\-\\\$\[\]\(\)\.])/\\$1/g;
+
+ $$replace{$name} = $value;
+ }
+}
+
+
+sub run {
+ my($self, $args) = @_;
+ my $argc = scalar(@$args);
+ my $type = $defaults{$os};
+ my $output = '-';
+ my $needsrc = 1;
+ my($noinline, @files, %macros, @ipaths, %replace, %exclude);
+
+ for(my $i = 0; $i < $argc; ++$i) {
+ my $arg = $$args[$i];
+ if ($arg =~ /^\-D(\w+)(=(.*))?/) {
+ $macros{$1} = $3;
+ }
+ elsif ($arg =~ /^\-I(.*)/) {
+ push(@ipaths, File::Spec->canonpath($1));
+ }
+ elsif ($arg eq '-A') {
+ foreach my $auto (@{$self->{'automatic'}}) {
+ $self->setReplace(\%replace, $ENV{$auto}, '$(' . $auto . ')');
+ }
+ }
+ elsif ($arg eq '-R') {
+ ++$i;
+ $arg = $$args[$i];
+ if (defined $arg) {
+ my $val = $ENV{$arg};
+ if (defined $val) {
+ $self->setReplace(\%replace, $val, "\$($arg)");
+ }
+ }
+ else {
+ $self->usageAndExit('Invalid use of -R');
+ }
+ }
+ elsif ($arg eq '-e') {
+ ++$i;
+ $arg = $$args[$i];
+ if (defined $arg) {
+ $exclude{$arg} = 1;
+ }
+ else {
+ $self->usageAndExit('Invalid use of -e');
+ }
+ }
+ elsif ($arg eq '-f') {
+ ++$i;
+ $arg = $$args[$i];
+ if (defined $arg) {
+ $output = $arg;
+ }
+ else {
+ $self->usageAndExit('Invalid use of -f');
+ }
+ }
+ elsif ($arg eq '-i') {
+ $needsrc = undef;
+ }
+ elsif ($arg eq '-n') {
+ $noinline = 1;
+ }
+ elsif ($arg eq '-h') {
+ $self->usageAndExit();
+ }
+ elsif ($arg eq '-t') {
+ ++$i;
+ $arg = $$args[$i];
+ if (defined $arg && defined $types{$arg}) {
+ $type = $arg;
+ }
+ else {
+ $self->usageAndExit('Invalid use of -t');
+ }
+ }
+ elsif ($arg =~ /^[\-+]/) {
+ ## We will ignore unknown options
+ ## Some options for aCC start with +
+ }
+ else {
+ push(@files, $arg);
+ }
+ }
+
+ if (!defined $files[0]) {
+ if ($needsrc) {
+ $self->usageAndExit('No files specified');
+ }
+ }
+
+ my $editor = new DependencyEditor();
+ return $editor->process($output, $type, $noinline, \%macros,
+ \@ipaths, \%replace, \%exclude, \@files);
+}