summaryrefslogtreecommitdiff
path: root/bin/MakeProjectCreator/modules
diff options
context:
space:
mode:
Diffstat (limited to 'bin/MakeProjectCreator/modules')
-rw-r--r--bin/MakeProjectCreator/modules/BorlandProjectCreator.pm76
-rw-r--r--bin/MakeProjectCreator/modules/BorlandWorkspaceCreator.pm94
-rw-r--r--bin/MakeProjectCreator/modules/Creator.pm711
-rw-r--r--bin/MakeProjectCreator/modules/Driver.pm346
-rw-r--r--bin/MakeProjectCreator/modules/EM3ProjectCreator.pm79
-rw-r--r--bin/MakeProjectCreator/modules/EM3WorkspaceCreator.pm43
-rw-r--r--bin/MakeProjectCreator/modules/GHSProjectCreator.pm62
-rw-r--r--bin/MakeProjectCreator/modules/GHSWorkspaceCreator.pm76
-rw-r--r--bin/MakeProjectCreator/modules/GNUACEProjectCreator.pm202
-rw-r--r--bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm98
-rw-r--r--bin/MakeProjectCreator/modules/GUID.pm58
-rw-r--r--bin/MakeProjectCreator/modules/MakeProjectCreator.pm65
-rw-r--r--bin/MakeProjectCreator/modules/MakeWorkspaceCreator.pm98
-rw-r--r--bin/MakeProjectCreator/modules/NMakeProjectCreator.pm66
-rw-r--r--bin/MakeProjectCreator/modules/NMakeWorkspaceCreator.pm121
-rw-r--r--bin/MakeProjectCreator/modules/Options.pm297
-rw-r--r--bin/MakeProjectCreator/modules/Parser.pm175
-rw-r--r--bin/MakeProjectCreator/modules/ProjectCreator.pm1663
-rw-r--r--bin/MakeProjectCreator/modules/StringProcessor.pm106
-rw-r--r--bin/MakeProjectCreator/modules/TemplateInputReader.pm143
-rw-r--r--bin/MakeProjectCreator/modules/TemplateParser.pm1008
-rw-r--r--bin/MakeProjectCreator/modules/VA4ProjectCreator.pm129
-rw-r--r--bin/MakeProjectCreator/modules/VA4WorkspaceCreator.pm76
-rw-r--r--bin/MakeProjectCreator/modules/VC6ProjectCreator.pm229
-rw-r--r--bin/MakeProjectCreator/modules/VC6WorkspaceCreator.pm132
-rw-r--r--bin/MakeProjectCreator/modules/VC7ProjectCreator.pm104
-rw-r--r--bin/MakeProjectCreator/modules/VC7WorkspaceCreator.pm130
-rw-r--r--bin/MakeProjectCreator/modules/WorkspaceCreator.pm815
28 files changed, 0 insertions, 7202 deletions
diff --git a/bin/MakeProjectCreator/modules/BorlandProjectCreator.pm b/bin/MakeProjectCreator/modules/BorlandProjectCreator.pm
deleted file mode 100644
index 98d5073705f..00000000000
--- a/bin/MakeProjectCreator/modules/BorlandProjectCreator.pm
+++ /dev/null
@@ -1,76 +0,0 @@
-package BorlandProjectCreator;
-
-# ************************************************************
-# Description : A Borland Project Creator
-# Author : Chad Elliott
-# Create Date : 3/14/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-use File::Basename;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub fill_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
-
- if ($name eq 'cppdir') {
- my(%dirnames) = ();
- foreach my $file ($self->get_component_list('source_files')) {
- my($dirname) = dirname($file);
- if ($dirname eq '') {
- $dirname = '.';
- }
- $dirnames{$dirname} = 1;
- }
- $value = join(';', sort keys %dirnames);
- }
-
- return $value;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return 'Makefile' . ($name eq '' ? '' : ".$name") . '.bor';
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'borexe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'bordll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'bor';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/BorlandWorkspaceCreator.pm b/bin/MakeProjectCreator/modules/BorlandWorkspaceCreator.pm
deleted file mode 100644
index 83b0c57a346..00000000000
--- a/bin/MakeProjectCreator/modules/BorlandWorkspaceCreator.pm
+++ /dev/null
@@ -1,94 +0,0 @@
-package BorlandWorkspaceCreator;
-
-# ************************************************************
-# Description : A Borland Workspace (Makefile.bor) creator
-# Author : Chad Elliott
-# Create Date : 7/02/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use BorlandProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_modified_workspace_name('Makefile', '.bor');
-}
-
-
-sub workspace_per_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "#----------------------------------------------------------------------------$crlf" .
- "# Borland Workspace$crlf" .
- "#----------------------------------------------------------------------------$crlf" .
- $crlf;
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- print $fh "!include <\$(ACE_ROOT)\\include\\makeinclude\\make_flags.bor>$crlf";
-
- foreach my $target ('all', 'clean', 'realclean', 'install') {
- print $fh $crlf .
- "$target\:$crlf";
- foreach my $project (@list) {
- my($dir) = dirname($project);
- my($chdir) = 0;
- my($back) = 1;
-
- ## If the directory isn't "." then we need
- ## to figure out how to get back to our starting point
- if ($dir ne '.') {
- $chdir = 1;
- my($length) = length($dir);
- for(my $i = 0; $i < $length; $i++) {
- if (substr($dir, $i, 1) eq '/') {
- $back++;
- }
- }
- }
-
- print $fh ($chdir ? "\t\@cd $dir$crlf" : '') .
- "\t\$(MAKE) -\$(MAKEFLAGS) \$(MAKE_FLAGS) -f " . basename($project) . " $target$crlf" .
- ($chdir ? "\t\@cd " . ('../' x $back) . $crlf : '');
- }
- }
-
- # Generate a convenient rule for regenerating the workspace.
- print $fh $crlf .
- "regenerate:$crlf" .
- "\t$^X $0 @ARGV$crlf";
-}
-
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/Creator.pm b/bin/MakeProjectCreator/modules/Creator.pm
deleted file mode 100644
index c1400ddaceb..00000000000
--- a/bin/MakeProjectCreator/modules/Creator.pm
+++ /dev/null
@@ -1,711 +0,0 @@
-package Creator;
-
-# ************************************************************
-# Description : Base class for workspace and project creators
-# Author : Chad Elliott
-# Create Date : 5/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use FileHandle;
-use File::Basename;
-
-use Parser;
-
-use vars qw(@ISA);
-@ISA = qw(Parser);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my(@statekeys) = ('global', 'include', 'template', 'ti',
- 'dynamic', 'static', 'relative', 'addtemp',
- 'addproj', 'progress', 'toplevel', 'baseprojs',
- );
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($global) = shift;
- my($inc) = shift;
- my($template) = shift;
- my($ti) = shift;
- my($dynamic) = shift;
- my($static) = shift;
- my($relative) = shift;
- my($addtemp) = shift;
- my($addproj) = shift;
- my($progress) = shift;
- my($toplevel) = shift;
- my($baseprojs) = shift;
- my($type) = shift;
- my($self) = Parser::new($class, $inc);
-
- $self->{'relative'} = $relative;
- $self->{'template'} = $template;
- $self->{'ti'} = $ti;
- $self->{'global'} = $global;
- $self->{'grammar_type'} = $type;
- $self->{'type_check'} = $type . '_defined';
- $self->{'global_read'} = 0;
- $self->{'current_input'} = '';
- $self->{'progress'} = $progress;
- $self->{'addtemp'} = $addtemp;
- $self->{'addproj'} = $addproj;
- $self->{'toplevel'} = $toplevel;
- $self->{'files_written'} = [];
- $self->{'reading_global'} = 0;
- $self->{'global_assign'} = {};
- $self->{'assign'} = {};
- $self->{'baseprojs'} = $baseprojs;
- $self->{'dynamic'} = $dynamic;
- $self->{'static'} = $static;
-
- return $self;
-}
-
-
-sub collect_line {
- my($self) = shift;
- my($fh) = shift;
- my($lref) = shift;
- my($line) = shift;
- my($status) = 1;
- my($errorString) = '';
-
- $$lref .= $self->strip_line($line);
-
- if ($$lref =~ /\\$/) {
- $$lref =~ s/\\$/ /;
- }
- else {
- ($status, $errorString) = $self->parse_line($fh, $$lref);
- $$lref = "";
- }
-
- return $status, $errorString;
-}
-
-
-sub generate_default_input {
- my($self) = shift;
- $self->parse_line(undef, "$self->{'grammar_type'} {");
- $self->parse_line(undef, '}');
- return 1;
-}
-
-
-sub parse_file {
- my($self) = shift;
- my($input) = shift;
- my($typecheck) = $self->{'type_check'};
- my($oline) = $self->line_number();
-
- ## Read the input file and get the last line number
- my($status, $errorString) = $self->read_file($input);
- my($linenumber) = $self->line_number();
-
- if (!$status) {
- print STDERR "$input: line $linenumber: $errorString\n";
- }
- elsif ($status && $self->{$typecheck}) {
- ## If we are at the end of the file and the type we are looking at
- ## is still defined, then we have an error
- print STDERR "$input: line $linenumber: ERROR: Did not " .
- "find the end of the $self->{'grammar_type'}\n";
- $status = 0;
- }
- $self->line_number($oline);
-
- return $status;
-}
-
-
-sub generate {
- my($self) = shift;
- my($input) = shift;
- my($status) = 1;
-
- ## Reset the files_written array between processing each file
- $self->{'files_written'} = [];
-
- ## Allow subclasses to reset values before
- ## each call to generate().
- $self->reset_values();
-
- ## Read the global configuration file
- if (!$self->{'global_read'}) {
- $status = $self->read_global_configuration();
- $self->{'global_read'} = 1;
- }
-
- if ($status) {
- $self->{'current_input'} = $input;
-
- ## An empty input file name says that we
- ## should generate a default input file and use that
- if ($input eq '') {
- $status = $self->generate_default_input();
- }
- else {
- $status = $self->parse_file($input);
- }
- }
-
- return $status;
-}
-
-
-sub parse_assignment {
- my($self) = shift;
- my($line) = shift;
- my($values) = shift;
- my($status) = 1;
-
- if ($line =~ /^(\w+)\s*=\s*(.*)?/) {
- my($name) = lc($1);
- my($value) = $2;
- push(@$values, 'assignment', $name, $value);
- }
- elsif ($line =~ /^(\w+)\s*\+=\s*(.*)?/) {
- my($name) = lc($1);
- my($value) = $2;
- push(@$values, 'assign_add', $name, $value);
- }
- elsif ($line =~ /^(\w+)\s*\-=\s*(.*)?/) {
- my($name) = lc($1);
- my($value) = $2;
- push(@$values, 'assign_sub', $name, $value);
- }
- else {
- $status = 0;
- }
-
- return $status;
-}
-
-
-sub parse_known {
- my($self) = shift;
- my($line) = shift;
- my($status) = 1;
- my($errorString) = '';
- my($type) = $self->{'grammar_type'};
- my(@values) = ();
- my($typecheck) = $self->{'type_check'};
-
- ##
- ## Each regexp that looks for the '{' looks for it at the
- ## end of the line. It is purposely this way to decrease
- ## the amount of extra lines in each file. This
- ## allows for the most compact file as human readably
- ## possible.
- ##
- if ($line eq '') {
- }
- elsif ($line =~ /^$type\s*(\([^\)]+\))?\s*(:.*)?\s*{$/) {
- my($name) = $1;
- my($parents) = $2;
- if ($self->{$typecheck}) {
- $errorString = "ERROR: Did not find the end of the $type";
- $status = 0;
- }
- else {
- if (defined $parents) {
- my(@parents) = ();
- foreach my $parent (split(/[:,]/, $parents)) {
- $parent =~ s/^\s+//;
- $parent =~ s/\s+$//;
- if ($parent ne '') {
- push(@parents, $parent);
- }
- }
- if (!defined $parents[0]) {
- ## The : was used, but no parents followed. This
- ## is an error.
- $errorString = 'ERROR: No parents listed';
- $status = 0;
- }
- $parents = \@parents;
- }
- push(@values, $type, $name, $parents);
- }
- }
- elsif ($line =~ /^}$/) {
- if ($self->{$typecheck}) {
- push(@values, $type, $line);
- }
- else {
- $errorString = "ERROR: Did not find the beginning of the $type";
- $status = 0;
- }
- }
- elsif (!$self->{$typecheck}) {
- $errorString = "ERROR: No $type was defined";
- $status = 0;
- }
- elsif ($self->parse_assignment($line, \@values)) {
- ## If this returns true, then we've found an assignment
- }
- elsif ($line =~ /^(\w+)\s*(\([^\)]+\))?\s*{$/) {
- my($comp) = lc($1);
- my($name) = $2;
-
- if (defined $name) {
- $name =~ s/^\(\s*//;
- $name =~ s/\s*\)$//;
- }
- else {
- $name = 'default';
- }
- push(@values, 'component', $comp, $name);
- }
- else {
- $errorString = "ERROR: Unrecognized line: $line";
- $status = -1;
- }
-
- return $status, $errorString, @values;
-}
-
-
-sub parse_scope {
- my($self) = shift;
- my($fh) = shift;
- my($name) = shift;
- my($type) = shift;
- my($validNames) = shift;
- my($flags) = shift;
- my($status) = 0;
- my($errorString) = "ERROR: Unable to process $name";
-
- if (!defined $flags) {
- $flags = {};
- }
-
- while(<$fh>) {
- my($line) = $self->strip_line($_);
-
- if ($line eq '') {
- }
- elsif ($line =~ /^}/) {
- $status = 1;
- $errorString = '';
- $self->handle_scoped_end($type, $flags);
- last;
- }
- else {
- my(@values) = ();
- if ($self->parse_assignment($line, \@values)) {
- if (defined $$validNames{$values[1]}) {
- if ($values[0] eq 'assignment') {
- $self->process_assignment($values[1], $values[2], $flags);
- }
- elsif ($values[0] eq 'assign_add') {
- $self->process_assignment_add($values[1], $values[2], $flags);
- }
- elsif ($values[0] eq 'assign_sub') {
- $self->process_assignment_sub($values[1], $values[2], $flags);
- }
- }
- else {
- $status = 0;
- $errorString = "ERROR: Invalid assignment name: $values[1]";
- last;
- }
- }
- else {
- ($status, $errorString) = $self->handle_scoped_unknown($fh,
- $type,
- $flags,
- $line);
- if (!$status) {
- last;
- }
- }
- }
- }
- return $status, $errorString;
-}
-
-
-sub base_directory {
- my($self) = shift;
- return basename($self->getcwd());
-}
-
-
-sub generate_default_file_list {
- my($self) = shift;
- my($dir) = shift;
- my($dh) = new FileHandle();
- my(@files) = ();
-
- if (!defined $dir) {
- $dir = '.';
- }
-
- if (opendir($dh, $dir)) {
- @files = grep(!/^\.\.?$/, readdir($dh));
- if ($self->sort_files()) {
- @files = sort { $self->file_sorter($a, $b) } @files;
- }
-
- ## Prefix each file name with the directory
- ## only if it's not .
- if ($dir ne '.') {
- for(my $i = 0; $i <= $#files; $i++) {
- $files[$i] = "$dir/$files[$i]";
- }
- }
-
- closedir($dh);
- }
- return @files;
-}
-
-
-sub windows_crlf {
- #my($self) = shift;
- if ($^O eq 'MSWin32' || $^O eq 'cygwin') {
- return "\n";
- }
- else {
- return "\r\n";
- }
-}
-
-
-sub transform_file_name {
- my($self) = shift;
- my($name) = shift;
-
- $name =~ s/[\s\/\\]/_/g;
- return $name;
-}
-
-
-sub add_file_written {
- my($self) = shift;
- my($file) = shift;
-
- foreach my $written (@{$self->{'files_written'}}) {
- if ($written eq $file) {
- print "WARNING: $file has been overwritten by a " .
- "$self->{'grammar_type'} with a duplicate name.\n";
- last;
- }
- }
- push(@{$self->{'files_written'}}, $file);
-}
-
-
-sub extension_recursive_input_list {
- my($self) = shift;
- my($dir) = shift;
- my($ext) = shift;
- my($fh) = new FileHandle();
- my(@files) = ();
-
- if (opendir($fh, $dir)) {
- foreach my $file (grep(!/^\.\.?$/, readdir($fh))) {
- my($full) = ($dir ne '.' ? "$dir/" : '') . $file;
- if (-d $full) {
- push(@files, $self->extension_recursive_input_list($full, $ext));
- }
- elsif ($full =~ /$ext$/) {
- push(@files, $full);
- }
- }
- closedir($fh);
- }
-
- return @files;
-}
-
-
-sub modify_assignment_value {
- my($self) = shift;
- my($value) = shift;
-
- if ($self->convert_slashes()) {
- $value = $self->slash_to_backslash($value);
- }
- return $value;
-}
-
-
-sub process_assignment {
- my($self) = shift;
- my($name) = shift;
- my($value) = shift;
- my($assign) = shift;
- my($tag) = ($self->{'reading_global'} ? 'global_assign' : 'assign');
-
- ## If no hash table was passed in
- if (!defined $assign) {
- $assign = $self->{$tag};
- }
-
- ## If we haven't yet defined the hash table in this project
- if (!defined $assign) {
- $assign = {};
- $self->{$tag} = $assign;
- }
-
- if (defined $value) {
- $value =~ s/^\s+//;
- $value =~ s/\s+$//;
-
- ## Modify the assignment value before saving it
- $value = $self->modify_assignment_value($value);
- }
-
- $$assign{$name} = $value;
-}
-
-
-sub process_assignment_add {
- my($self) = shift;
- my($name) = shift;
- my($value) = shift;
- my($assign) = shift;
- my($nval) = $self->get_assignment($name, $assign);
-
- if (defined $nval) {
- $nval = "$value $nval";
- }
- else {
- $nval = $value;
- }
- $self->process_assignment($name, $nval, $assign);
- $self->process_duplicate_modification($name, $assign);
-}
-
-
-sub process_assignment_sub {
- my($self) = shift;
- my($name) = shift;
- my($value) = shift;
- my($assign) = shift;
- my($nval) = $self->get_assignment($name, $assign);
-
- if (defined $nval) {
- my($parts) = $self->create_array($nval);
- $nval = '';
- foreach my $part (@$parts) {
- if ($part ne $value && $part ne '') {
- $nval .= "$part ";
- }
- }
- $self->process_assignment($name, $nval, $assign);
- }
-}
-
-
-sub save_state {
- my($self) = shift;
- my(%state) = ();
-
- ## Make a deep copy of each state value. That way our array
- ## references and hash references do not get accidentally modified.
- foreach my $skey (@statekeys) {
- if (UNIVERSAL::isa($self->{$skey}, 'ARRAY')) {
- $state{$skey} = [];
- foreach my $element (@{$self->{$skey}}) {
- push(@{$state{$skey}}, $element);
- }
- }
- elsif (UNIVERSAL::isa($self->{$skey}, 'HASH')) {
- $state{$skey} = {};
- foreach my $key (keys %{$self->{$skey}}) {
- $state{$skey}->{$key} = $self->{$skey}->{$key};
- }
- }
- else {
- $state{$skey} = $self->{$skey};
- }
- }
-
- return %state;
-}
-
-
-sub restore_state {
- my($self) = shift;
- my($state) = shift;
-
- ## Overwrite each state value
- foreach my $skey (@statekeys) {
- $self->{$skey} = $$state{$skey};
- }
-}
-
-
-sub get_global_cfg {
- my($self) = shift;
- return $self->{'global'};
-}
-
-
-sub get_template_override {
- my($self) = shift;
- return $self->{'template'};
-}
-
-
-sub get_ti_override {
- my($self) = shift;
- return $self->{'ti'};
-}
-
-
-sub get_relative {
- my($self) = shift;
- return $self->{'relative'};
-}
-
-
-sub get_current_input {
- my($self) = shift;
- return $self->{'current_input'};
-}
-
-
-sub get_progress_callback {
- my($self) = shift;
- return $self->{'progress'};
-}
-
-
-sub get_addtemp {
- my($self) = shift;
- return $self->{'addtemp'};
-}
-
-
-sub get_addproj {
- my($self) = shift;
- return $self->{'addproj'};
-}
-
-
-sub get_toplevel {
- my($self) = shift;
- return $self->{'toplevel'};
-}
-
-
-sub get_files_written {
- my($self) = shift;
- return $self->{'files_written'};
-}
-
-
-sub get_assignment {
- my($self) = shift;
- my($name) = shift;
- my($assign) = shift;
-
- ## If no hash table was passed in
- if (!defined $assign) {
- my($tag) = ($self->{'reading_global'} ? 'global_assign' : 'assign');
- $assign = $self->{$tag};
- }
-
- return $$assign{$name};
-}
-
-
-sub get_baseprojs {
- my($self) = shift;
- return $self->{'baseprojs'};
-}
-
-
-sub get_dynamic {
- my($self) = shift;
- return $self->{'dynamic'};
-}
-
-
-sub get_static {
- my($self) = shift;
- return $self->{'static'};
-}
-
-# ************************************************************
-# Virtual Methods To Be Overridden
-# ************************************************************
-
-sub handle_scoped_end {
- #my($self) = shift;
- #my($type) = shift;
- #my($flags) = shift;
-}
-
-
-sub handle_scoped_unknown {
- my($self) = shift;
- my($fh) = shift;
- my($type) = shift;
- my($flags) = shift;
- my($line) = shift;
- return 0, "ERROR: Unrecognized line: $line";
-}
-
-
-sub process_duplicate_modification {
- #my($self) = shift;
- #my($name) = shift;
- #my($assign) = shift;
-}
-
-sub generate_recursive_input_list {
- #my($self) = shift;
- #my($dir) = shift;
- return ();
-}
-
-
-sub crlf {
- #my($self) = shift;
- return "\n";
-}
-
-
-sub reset_values {
- #my($self) = shift;
-}
-
-
-sub sort_files {
- #my($self) = shift;
- return 1;
-}
-
-
-sub file_sorter {
- my($self) = shift;
- my($left) = shift;
- my($right) = shift;
- return $left cmp $right;
-}
-
-
-sub read_global_configuration {
- #my($self) = shift;
- #my($input) = shift;
- return 1;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/Driver.pm b/bin/MakeProjectCreator/modules/Driver.pm
deleted file mode 100644
index 8aff9671adf..00000000000
--- a/bin/MakeProjectCreator/modules/Driver.pm
+++ /dev/null
@@ -1,346 +0,0 @@
-package Driver;
-
-# ************************************************************
-# Description : Functionality to call a workspace or project creator
-# Author : Chad Elliott
-# Create Date : 5/28/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use Options;
-use Parser;
-
-use vars qw(@ISA);
-@ISA = qw(Parser Options);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($index) = 0;
-my(@progress) = ('|', '/', '-', '\\');
-my($cmdenv) = 'MPC_COMMANDLINE';
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($path) = shift;
- my($name) = shift;
- my(@creators) = @_;
- my($self) = $class->SUPER::new();
-
- $self->{'path'} = $path;
- $self->{'name'} = $name;
- $self->{'version'} = 1.7;
- $self->{'types'} = {};
- $self->{'creators'} = \@creators;
- $self->{'default'} = $creators[0];
- $self->{'reldefs'} = {};
- $self->{'relorder'} = [];
-
- return $self;
-}
-
-
-sub convert_slashes {
- #my($self) = shift;
- return 0;
-}
-
-
-sub parse_line {
- my($self) = shift;
- my($ih) = shift;
- my($line) = shift;
- my($status) = 1;
- my($errorString) = '';
-
- if ($line eq '') {
- }
- elsif ($line =~ /^(\w+)(\s*,\s*(.*))?$/) {
- my($name) = $1;
- my($value) = $3;
- if (defined $value) {
- $value =~ s/^\s+//;
- $value =~ s/\s+$//;
- }
- $self->{'reldefs'}->{$name} = $value;
- push(@{$self->{'relorder'}}, $name);
- }
- else {
- $status = 0;
- $errorString = "ERROR: Unrecognized line: $line";
- }
-
- return $status, $errorString;
-}
-
-
-sub optionError {
- my($self) = shift;
- my($line) = shift;
- my($base) = $self->{'name'};
-
- if (defined $line) {
- print STDERR "$line\n";
- }
- my($spaces) = (' ' x (length($base) + 8));
- print STDERR "$base v$self->{'version'}\n" .
- "Usage: $base [-global <file>] [-include <directory>] [-recurse]\n" .
- $spaces . "[-ti <dll | lib | dll_exe | lib_exe>:<file>]\n" .
- $spaces . "[-template <file>] [-relative NAME=VAR] [-base <project>]\n" .
- $spaces . "[-noreldefs] [-notoplevel] [-static] [-static_only]\n" .
- $spaces . "[-value_template <NAME+=VAL | NAME=VAL | NAME-=VAL>]\n" .
- $spaces . "[-value_project <NAME+=VAL | NAME=VAL | NAME-=VAL>]\n" .
- $spaces . "[-type <";
-
- my(@keys) = sort keys %{$self->{'types'}};
- for(my $i = 0; $i <= $#keys; $i++) {
- print STDERR $keys[$i];
- if ($i != $#keys) {
- print STDERR ' | ';
- }
- if ((($i + 1) % 6) == 0) {
- print STDERR "\n$spaces ";
- }
- }
- print STDERR ">]\n" .
- $spaces . "[files]\n\n";
-
- my($default) = $self->extractType($self->{'default'});
- print STDERR
-" -base Add <project> as a base project to each generated\n" .
-" project file.\n" .
-" -global Specifies the global input file. Values stored\n" .
-" within this file are applied to all projects.\n" .
-" -include Specifies a directory to search when looking for base\n" .
-" projects, template input files and templates. This\n" .
-" option can be used multiple times to add directories.\n" .
-" -ti Specifies the template input file (with no extension)\n" .
-" for the specific type as shown above\n" .
-" (ex. -ti dll_exe:vc8exe)\n" .
-" -template Specifies the template name (with no extension).\n" .
-" -static Specifies that static projects will be generated in\n" .
-" addition to dynamic projects.\n" .
-" -static_only Specifies that only static projects will be generated.\n" .
-" -recurse Recurse from the current directory and generate from\n" .
-" all found input files.\n" .
-" -relative Any \$() variable in an mpc that is matched to NAME\n" .
-" is replaced by VAR only if VAR can be made into a\n" .
-" relative path based on the current working directory.\n" .
-" -noreldefs Do not try to generate default relative definitions.\n" .
-" -notoplevel Do not generate the top level target file. Files\n" .
-" are still process, but no top level file is created.\n" .
-" -value_template This option allows modification of a template input\n" .
-" name value pair. Use += to add VAL to the NAME's\n" .
-" value. Use -= to subtract and = to override the value.\n" .
-" It is important to note that this will only modify\n" .
-" existing template input name value pairs and can not\n" .
-" be used to introduce new name value pairs.\n" .
-" -value_project This option allows modification of a project variable\n" .
-" assignment . Use += to add VAL to the NAME's value.\n" .
-" Use -= to subtract and = to override the value.\n" .
-" This can be used to introduce new name value pairs to\n" .
-" a project. However, it must be a valid project\n" .
-" assignment.\n" .
-" -type Specifies the type of project file to generate. This\n" .
-" option can be used multiple times to generate multiple\n" .
-" types. If -type is not used, it defaults to '$default'.\n";
-
- exit(0);
-}
-
-
-sub run {
- my($self) = shift;
- my(@args) = @_;
- my($status) = 0;
-
- ## Dynamically load in each perl module and set up
- ## the type tags and project creators
- my($creators) = $self->{'creators'};
- foreach my $creator (@$creators) {
- my($tag) = $self->extractType($creator);
- $self->{'types'}->{$tag} = $creator;
- }
-
- ## Before we process the arguments, we will prepend the $cmdenv
- ## environment variable.
- if (defined $ENV{$cmdenv}) {
- my($envargs) = $self->create_array($ENV{$cmdenv});
- unshift(@args, @$envargs);
- }
-
- my($options) = $self->options($self->{'name'},
- $self->{'types'},
- 1,
- @args);
- if (!defined $options) {
- return $status;
- }
-
- ## Set up a hash that we can use to keep track of what
- ## has been 'required'
- my(%loaded) = ();
-
- ## Set up the default generator, if no type is selected
- if (!defined $options->{'generators'}->[0]) {
- push(@{$options->{'generators'}}, $self->{'default'});
- }
-
- if ($options->{'recurse'}) {
- if (defined $options->{'input'}->[0]) {
- ## This is an error.
- ## -recurse was used and input files were specified.
- $self->optionError('No files should be ' .
- 'specified when using -recurse');
- }
- else {
- ## We have to load at least one generator here in order
- ## to call the generate_recursive_input_list virtual function.
- my($name) = $options->{'generators'}->[0];
- if (!$loaded{$name}) {
- require "$name.pm";
- $loaded{$name} = 1;
- }
-
- ## Generate the recursive input list
- my($generator) = $name->new();
- my(@input) = $generator->generate_recursive_input_list('.');
- $options->{'input'} = \@input;
-
- ## If no files were found above, then we issue a warning
- ## that we are going to use the default input
- if (!defined $options->{'input'}->[0]) {
- print "WARNING: No files were found using the -recurse option.\n" .
- " Using the default input.\n";
- }
- }
- }
-
- ## Set up default values
- if (!defined $options->{'input'}->[0]) {
- push(@{$options->{'input'}}, '');
- }
- if (!defined $options->{'global'}) {
- my($global) = $self->{'path'} . '/config/global.mpb';
- if (-r $global) {
- $options->{'global'} = $global;
- }
- }
- ## Always add the default include paths
- unshift(@{$options->{'include'}}, $self->{'path'} . '/templates');
- unshift(@{$options->{'include'}}, $self->{'path'} . '/config');
-
- if ($options->{'reldefs'}) {
- ## Only try to read the file if it exists
- my($rel) = $self->{'path'} . '/config/default.rel';
- if (-r $rel) {
- my($srel, $errorString) = $self->read_file($rel);
- if (!$srel) {
- print STDERR "$errorString\nin $rel\n";
- return $status;
- }
- }
-
- foreach my $key (@{$self->{'relorder'}}) {
- if (defined $ENV{$key} &&
- !defined $options->{'relative'}->{$key}) {
- $options->{'relative'}->{$key} = $ENV{$key};
- }
- if (defined $self->{'reldefs'}->{$key} &&
- !defined $options->{'relative'}->{$key}) {
- my($value) = $self->{'reldefs'}->{$key};
- if ($value =~ /\$(\w+)(.*)?/) {
- my($var) = $1;
- my($extra) = $2;
- $options->{'relative'}->{$key} =
- $options->{'relative'}->{$var} . $extra;
- }
- else {
- $options->{'relative'}->{$key} = $value;
- }
- }
- }
- }
-
- ## Set up un-buffered output for the progress callback
- $| = 1;
-
- ## Save the original directory outside of the loop
- ## to avoid calling it multiple times.
- my($orig_dir) = $self->getcwd();
-
- ## Generate the files
- foreach my $cfile (@{$options->{'input'}}) {
- ## To correctly reference any pathnames in the input file, chdir to
- ## its directory if there's any directory component to the specified path.
- my($base) = basename($cfile);
- foreach my $name (@{$options->{'generators'}}) {
- if (!$loaded{$name}) {
- require "$name.pm";
- $loaded{$name} = 1;
- }
- my($file) = $cfile;
- my($generator) = $name->new($options->{'global'},
- $options->{'include'},
- $options->{'template'},
- $options->{'ti'},
- $options->{'dynamic'},
- $options->{'static'},
- $options->{'relative'},
- $options->{'addtemp'},
- $options->{'addproj'},
- (-t 1 ? \&progress : undef),
- $options->{'toplevel'},
- $options->{'baseprojs'});
- if ($base ne $file) {
- my($dir) = dirname($file);
- if (!$generator->cd($dir)) {
- print STDERR "ERROR: Unable to change to directory: $dir\n";
- $status++;
- last;
- }
- $file = $base;
- }
- print 'Generating output using ' .
- ($file eq '' ? 'default input' : $file) . "\n";
- print 'Start Time: ' . scalar(localtime(time())) . "\n";
- if (!$generator->generate($file)) {
- print STDERR "ERROR: Unable to process: $file\n";
- $status++;
- last;
- }
- print ' End Time: ' . scalar(localtime(time())) . "\n";
- $generator->cd($orig_dir);
- }
- if ($status) {
- last;
- }
- }
-
- return $status;
-}
-
-
-sub progress {
- ## This method will be called before each output
- ## file (or set of output files in vc6's case) is written.
- print "$progress[$index]\r";
- $index++;
- if ($index > $#progress) {
- $index = 0;
- }
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/EM3ProjectCreator.pm b/bin/MakeProjectCreator/modules/EM3ProjectCreator.pm
deleted file mode 100644
index b15f24d9726..00000000000
--- a/bin/MakeProjectCreator/modules/EM3ProjectCreator.pm
+++ /dev/null
@@ -1,79 +0,0 @@
-package EM3ProjectCreator;
-
-# ************************************************************
-# Description : An eMbedded Visual C++ 3.00 Project Creator
-# Author : Chad Elliott
-# Create Date : 7/3/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use VC6ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(VC6ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub fill_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
-
- if ($name eq 'make_file_name') {
- $value = $self->base_project_name() . '.vcn';
- }
-
- return $value;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- return $self->project_name() . '.vcp';
-}
-
-
-sub static_project_file_name {
- my($self) = shift;
- return $self->project_name() . $self->get_static_append() . '.vcp';
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'em3vcpdllexe';
-}
-
-
-sub get_lib_exe_template_input_file {
- #my($self) = shift;
- return 'em3vcplibexe';
-}
-
-
-sub get_lib_template_input_file {
- #my($self) = shift;
- return 'em3vcplib';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'em3vcpdll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'em3vcp';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/EM3WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/EM3WorkspaceCreator.pm
deleted file mode 100644
index a149e551cf5..00000000000
--- a/bin/MakeProjectCreator/modules/EM3WorkspaceCreator.pm
+++ /dev/null
@@ -1,43 +0,0 @@
-package EM3WorkspaceCreator;
-
-# ************************************************************
-# Description : An eMbedded v3 Workspace Creator
-# Author : Chad Elliott
-# Create Date : 7/3/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use EM3ProjectCreator;
-use VC6WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(VC6WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_workspace_name() . '.vcw';
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "Microsoft eMbedded Visual Tools Workspace File, Format Version 3.00$crlf" .
- "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!$crlf" .
- $crlf;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/GHSProjectCreator.pm b/bin/MakeProjectCreator/modules/GHSProjectCreator.pm
deleted file mode 100644
index 95302457818..00000000000
--- a/bin/MakeProjectCreator/modules/GHSProjectCreator.pm
+++ /dev/null
@@ -1,62 +0,0 @@
-package GHSProjectCreator;
-
-# ************************************************************
-# Description : Not a complete implementation for GHS
-# Author : Chad Elliott
-# Create Date : 4/19/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub file_sorter {
- my($self) = shift;
- my($left) = shift;
- my($right) = shift;
- return lc($left) cmp lc($right);
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return "ghs/$name.bld";
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'ghsexe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'ghsdll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'ghs';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/GHSWorkspaceCreator.pm b/bin/MakeProjectCreator/modules/GHSWorkspaceCreator.pm
deleted file mode 100644
index e26f2e51f0f..00000000000
--- a/bin/MakeProjectCreator/modules/GHSWorkspaceCreator.pm
+++ /dev/null
@@ -1,76 +0,0 @@
-package GHSWorkspaceCreator;
-
-# ************************************************************
-# Description : An incomplete GHS Workspace creator
-# Author : Chad Elliott
-# Create Date : 7/3/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use GHSProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_modified_workspace_name('ghs/default', '.bld');
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "#!build$crlf" .
- "default:$crlf";
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($gen) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- ## Print out the projet
- print $fh "\tnobuild$crlf" .
- "\t:cx_option=noexceptions$crlf" .
- "\t:cx_option=std_namespaces$crlf" .
- "\t:cx_template_option=noautomatic$crlf" .
- "\t:language=cxx$crlf" .
- "\t:cx_mode=ansi$crlf" .
- "\t:cx_lib=scnoe$crlf";
-
- foreach my $project (@list) {
- ## Convert all /'s to \
- $project = $self->slash_to_backslash($project);
-
- print $fh "..\\$project$crlf";
- if ($gen->exe_target()) {
- print $fh "\tprogram$crlf";
- }
- else {
- print $fh "\tlibrary$crlf";
- }
- }
-}
-
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/GNUACEProjectCreator.pm b/bin/MakeProjectCreator/modules/GNUACEProjectCreator.pm
deleted file mode 100644
index a7c55ef5898..00000000000
--- a/bin/MakeProjectCreator/modules/GNUACEProjectCreator.pm
+++ /dev/null
@@ -1,202 +0,0 @@
-package GNUACEProjectCreator;
-
-# ************************************************************
-# Description : A GNU Project Creator for ACE
-# Author : Chad Elliott
-# Create Date : 3/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my(%compscript) = ('ACE_COMPONENTS' => ['--ace', '--set'],
- 'TAO_COMPONENTS' => ['--tao', '--set'],
- 'ORBSVCS_COMPONENTS' => ['--orbsvcs', '--append'],
- );
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub sort_files {
- #my($self) = shift;
- return 0;
-}
-
-
-sub convert_slashes {
- #my($self) = shift;
- return 0;
-}
-
-
-sub fill_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
- my($crlf) = $self->crlf();
- my($tag) = 'source_files';
- my($names) = $self->{$tag};
-
- if ($name eq 'gnu_source_files') {
- my(%vpath) = ();
- $value = '';
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
-
- foreach my $key (sort keys %$comps) {
- my($a) = $$comps{$key};
- my(@arr) = @$a;
- my($cpy) = $key;
-
- $cpy =~ s/^\d+_//;
- $value .= "$crlf$crlf$cpy = \\";
- for(my $i = 0; $i <= $#arr; $i++) {
- my($item) = $arr[$i];
- my($dname) = dirname($item);
-
- $item =~ s/\.[^\.]+$//;
- if ($dname ne '.' && $dname !~ /^\.\.\//) {
- $vpath{$dname} = 1;
- }
- $value .= "$crlf $item" . ($i != $#arr ? " \\" : '');
- }
- }
- }
- foreach my $name (keys %$names) {
- my($fname) = '';
- my($comps) = $$names{$name};
- foreach my $key (sort keys %$comps) {
- $fname = $key;
- $fname =~ s/^\d+_//;
- last;
- }
-
- if ($name ne 'default') {
- $fname = 'FILES';
- $value .= "$crlf$crlf" . "ifndef $name$crlf" .
- " $name = \\$crlf";
- my(@keys) = sort keys %$comps;
- for(my $i = 0; $i <= $#keys; $i++) {
- $keys[$i] =~ s/^\d+_//;
- my($key) = $keys[$i];
- $value .= " $key" . ($i != $#keys ? " \\" : '') . $crlf;
- }
- $value .= "endif # $name";
-
- foreach my $key (@keys) {
- $value .= "$crlf$crlf" . "ifneq (,\$(findstring $key, \$($name)))$crlf" .
- " $fname += \$($key)$crlf" .
- "endif # $key";
- }
- }
- }
- my(@vkeys) = sort keys %vpath;
- if ($#vkeys >= 0) {
- $value .= "$crlf$crlf" . 'VPATH = .';
- foreach my $key (@vkeys) {
- $value .= ":$key";
- }
- }
- }
- elsif ($name eq 'build') {
- foreach my $name (keys %$names) {
- if ($name ne 'default') {
- if (!defined $value) {
- $value = 'BUILD +=';
- }
- $value .= " $name";
- }
- }
- }
- elsif ($name eq 'comptarget') {
- foreach my $name (keys %$names) {
- if (defined $compscript{$name}) {
- if (!defined $value) {
- $value = '';
- }
- $value .= "$crlf.PHONY: $name$crlf" .
- "$name:$crlf" .
- "\t\@sh \$(ACE_ROOT)/bin/ace_components $compscript{$name}->[0] $compscript{$name}->[1] '\$($name)'$crlf$crlf" .
- "compclean:$crlf" .
- "\t\@sh \$(ACE_ROOT)/bin/ace_components $compscript{$name}->[0] --remove";
- }
- }
- }
- elsif ($name eq 'compclean') {
- foreach my $name (keys %$names) {
- if (defined $compscript{$name}) {
- $value = 'compclean';
- last;
- }
- }
- }
- elsif ($name eq 'notdirfiles') {
- $value = '$(notdir $(FILES))';
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my($arr) = $$comps{$key};
- foreach my $file (@$arr) {
- if ($file =~ /^\.\.\//) {
- $value = '$(FILES)';
- last;
- }
- }
- }
- }
- }
- elsif ($name eq 'tao') {
- if ($self->get_assignment('includes') =~ /tao/i ||
- $self->get_assignment('libpaths') =~ /tao/i) {
- $value = 1;
- }
- }
-
- return $value;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return 'Makefile' . ($name eq '' ? '' : ".$name");
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'gnuexe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'gnudll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'gnu';
-}
-
-1;
diff --git a/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm b/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm
deleted file mode 100644
index 9c00bc944b2..00000000000
--- a/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm
+++ /dev/null
@@ -1,98 +0,0 @@
-package GNUACEWorkspaceCreator;
-
-# ************************************************************
-# Description : A GNU Workspace (Makefile) creator for ACE
-# Author : Chad Elliott
-# Create Date : 5/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use GNUACEProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_modified_workspace_name('Makefile', '');
-}
-
-
-sub workspace_per_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "#----------------------------------------------------------------------------$crlf" .
- "# GNU Workspace$crlf" .
- "#----------------------------------------------------------------------------$crlf" .
- $crlf;
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- ## Print out the projet Makefile
- print $fh "include \$(ACE_ROOT)/include/makeinclude/macros.GNU$crlf" .
- "TARGETS_NESTED := \$(TARGETS_NESTED:.nested=)$crlf";
-
- ## Only use the list if there is more than one project
- if ($#list > 0) {
- print $fh "MFILES = \\$crlf";
- for(my $i = 0; $i <= $#list; $i++) {
- print $fh " $list[$i]";
- if ($i != $#list) {
- print $fh ' \\';
- }
- print $fh $crlf;
- }
- }
-
- print $fh $crlf .
- "\$(TARGETS_NESTED):$crlf" .
- "ifneq (Windows,\$(findstring Windows,\$(OS)))$crlf";
-
- ## If there is more than one project, use a for loop
- if ($#list > 0) {
- print $fh "\t\@for file in \$(MFILES); do \\$crlf" .
- "\t\$(MAKE) -f `basename \$\$file` -C `dirname \$\$file` \$(\@); \\$crlf" .
- "\tdone$crlf";
- }
- else {
- ## Otherwise, just list the call to make without a for loop
- print $fh "\t\@\$(MAKE) -f " . basename($list[0]) . ' -C ' . dirname($list[0]) . " \$(\@);$crlf";
- }
-
- print $fh "else$crlf";
- foreach my $project (@list) {
- print $fh "\t-\@cmd /c \"\$(MAKE) -f " . basename($project) . ' -C ' . dirname($project) . " \$(\@)\"$crlf";
- }
- print $fh "endif$crlf";
-}
-
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/GUID.pm b/bin/MakeProjectCreator/modules/GUID.pm
deleted file mode 100644
index 015db9c2a47..00000000000
--- a/bin/MakeProjectCreator/modules/GUID.pm
+++ /dev/null
@@ -1,58 +0,0 @@
-package GUID;
-
-# ************************************************************
-# Description : Generate GUID's for VC7 projects and workspaces
-# Author : Chad Elliott
-# Create Date : 5/14/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($self) = bless {
- }, $class;
- return $self;
-}
-
-
-sub generate {
- my($self) = shift;
- my($out) = shift;
- my($in) = shift;
- my($cwd) = shift;
- my($chash) = $self->hash($cwd);
- my($nhash) = $self->hash($out);
- my($ihash) = $self->hash($in);
- my($val) = 0xfeca1bad;
-
- return sprintf("%08X-%04X-%04X-%04X-%04X%08X",
- $nhash, ($val >> 16) & 0xffff, ($val & 0xffff),
- ($ihash >> 16) & 0xffff, $ihash & 0xffff, $chash);
-}
-
-
-sub hash {
- my($self) = shift;
- my($str) = shift;
- my($value) = 0;
-
- if (defined $str) {
- my($length) = length($str);
- for(my $i = 0; $i < $length; $i++) {
- $value = ($value << 4) ^ ($value >> 28) ^ ord(substr($str, $i, 1));
- }
- }
-
- return $value;
-}
-
-1;
diff --git a/bin/MakeProjectCreator/modules/MakeProjectCreator.pm b/bin/MakeProjectCreator/modules/MakeProjectCreator.pm
deleted file mode 100644
index c852fca6905..00000000000
--- a/bin/MakeProjectCreator/modules/MakeProjectCreator.pm
+++ /dev/null
@@ -1,65 +0,0 @@
-package MakeProjectCreator;
-
-# ************************************************************
-# Description : A Generic Make Project Creator
-# Author : Chad Elliott
-# Create Date : 2/18/2003
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub sort_files {
- #my($self) = shift;
- return 0;
-}
-
-
-sub convert_slashes {
- #my($self) = shift;
- return 0;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return 'Makefile' . ($name eq '' ? '' : ".$name");
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'makeexe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'makedll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'make';
-}
-
-1;
diff --git a/bin/MakeProjectCreator/modules/MakeWorkspaceCreator.pm b/bin/MakeProjectCreator/modules/MakeWorkspaceCreator.pm
deleted file mode 100644
index 99675f875fc..00000000000
--- a/bin/MakeProjectCreator/modules/MakeWorkspaceCreator.pm
+++ /dev/null
@@ -1,98 +0,0 @@
-package MakeWorkspaceCreator;
-
-# ************************************************************
-# Description : A Generic Workspace (Makefile) creator
-# Author : Chad Elliott
-# Create Date : 2/18/2003
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use MakeProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_modified_workspace_name('Makefile', '');
-}
-
-
-sub workspace_per_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "#----------------------------------------------------------------------------$crlf" .
- "# Make Workspace$crlf" .
- "#----------------------------------------------------------------------------$crlf" .
- $crlf;
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- ## Only use the list if there is more than one project
- if ($#list > 0) {
- print $fh "MFILES = \\$crlf";
- for(my $i = 0; $i <= $#list; $i++) {
- print $fh " $list[$i]";
- if ($i != $#list) {
- print $fh " \\";
- }
- print $fh $crlf;
- }
- }
-
- ## Print out the projet Makefile
- print $fh $crlf .
- "all clean realclean:$crlf";
-
- ## If there is more than one project, use a for loop
- if ($#list > 0) {
- print $fh "\t\@for file in \$(MFILES); do \\$crlf" .
- "\told=`pwd`; \\$crlf" .
- "\tcd `dirname \$\$file`; \\$crlf" .
- "\t\$(MAKE) -f `basename \$\$file` \$(\@); \\$crlf" .
- "\tcd \$\$old; \\$crlf" .
- "\tdone$crlf";
- }
- else {
- ## Otherwise, just list the call to make without a for loop
- print $fh "\t\@";
- my($dname) = dirname($list[0]);
- if ($dname ne '.') {
- print $fh "cd $dname && ";
- }
- print $fh "\$(MAKE) -f " .
- ($dname eq '.' ? $list[0] : basename($list[0])) .
- " \$(\@);$crlf";
- }
-}
-
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/NMakeProjectCreator.pm b/bin/MakeProjectCreator/modules/NMakeProjectCreator.pm
deleted file mode 100644
index e6709bf3a1a..00000000000
--- a/bin/MakeProjectCreator/modules/NMakeProjectCreator.pm
+++ /dev/null
@@ -1,66 +0,0 @@
-package NMakeProjectCreator;
-
-# ************************************************************
-# Description : An NMake Project Creator
-# Author : Chad Elliott
-# Create Date : 5/31/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub sort_files {
- #my($self) = shift;
- return 0;
-}
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return "$name.mak";
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'nmakeexe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'nmakedll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'nmake';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/NMakeWorkspaceCreator.pm b/bin/MakeProjectCreator/modules/NMakeWorkspaceCreator.pm
deleted file mode 100644
index 553edfce8e6..00000000000
--- a/bin/MakeProjectCreator/modules/NMakeWorkspaceCreator.pm
+++ /dev/null
@@ -1,121 +0,0 @@
-package NMakeWorkspaceCreator;
-
-# ************************************************************
-# Description : A NMake Workspace (Makefile) creator
-# Author : Chad Elliott
-# Create Date : 6/10/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use File::Basename;
-
-use NMakeProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_modified_workspace_name('Makefile', '');
-}
-
-
-sub workspace_per_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "# Microsoft Developer Studio Generated NMAKE File$crlf$crlf";
-}
-
-
-sub write_project_targets {
- my($self) = shift;
- my($fh) = shift;
- my($target) = shift;
- my($list) = shift;
- my($crlf) = $self->crlf();
-
- foreach my $project (@$list) {
- my($dir) = dirname($project);
- my($chdir) = 0;
- my($back) = 1;
-
- ## If the directory isn't '.' then we need
- ## to figure out how to get back to our starting point
- if ($dir ne '.') {
- $chdir = 1;
- my($length) = length($dir);
- for(my $i = 0; $i < $length; $i++) {
- if (substr($dir, $i, 1) eq '/') {
- $back++;
- }
- }
- }
-
- print $fh ($chdir ? "\tcd $dir$crlf" : '') .
- "\t\$(MAKE) /f " . basename($project) . " $target$crlf" .
- ($chdir ? "\tcd " . ('../' x $back) . $crlf : '');
- }
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
- my($default) = 'Win32 Debug';
-
- ## Determine the default configuration
- foreach my $project (keys %$pjs) {
- my($name, $deps, $pguid, @cfgs) = @{$pjs->{$project}};
- @cfgs = sort @cfgs;
- if (defined $cfgs[0]) {
- $default = $cfgs[0];
- $default =~ s/(.*)\|(.*)/$2 $1/;
- last;
- }
- }
-
- ## Print out the content
- print $fh '!IF "$(CFG)" == ""' . $crlf .
- 'CFG=' . $default . $crlf .
- '!MESSAGE No configuration specified. ' .
- 'Defaulting to ' . $default . '.' . $crlf .
- '!ENDIF' . $crlf;
-
- foreach my $target ('ALL', 'DEPEND', 'IDL_STUBS', 'CLEAN', 'REALCLEAN') {
- print $fh $crlf .
- $target . ':' . $crlf;
- $self->write_project_targets($fh, 'CFG="$(CFG)" ' . $target, \@list);
- }
-}
-
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/Options.pm b/bin/MakeProjectCreator/modules/Options.pm
deleted file mode 100644
index db3295bab8b..00000000000
--- a/bin/MakeProjectCreator/modules/Options.pm
+++ /dev/null
@@ -1,297 +0,0 @@
-package Options;
-
-# ************************************************************
-# Description : Process mpc command line options
-# Author : Chad Elliott
-# Create Date : 3/20/2003
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub optionError {
- #my($self) = shift;
- #my($str) = shift;
-}
-
-
-sub completion_command {
- my($self) = shift;
- my($name) = shift;
- my($types) = shift;
- my($str) = "complete $name " .
- "'c/-/(global include type template relative " .
- "ti static noreldefs notoplevel " .
- "value_template value_project)/' " .
- "'c/dll:/f/' 'c/dll_exe:/f/' 'c/lib_exe:/f/' 'c/lib:/f/' " .
- "'n/-ti/(dll lib dll_exe lib_exe)/:' 'n/-type/(";
-
- my(@keys) = sort keys %$types;
- for(my $i = 0; $i <= $#keys; $i++) {
- $str .= $keys[$i];
- if ($i != $#keys) {
- $str .= " ";
- }
- }
- $str .= ")/'";
- return $str;
-}
-
-
-sub options {
- my($self) = shift;
- my($name) = shift;
- my($types) = shift;
- my($defaults) = shift;
- my(@args) = @_;
- my(@include) = ();
- my(@input) = ();
- my(@generators) = ();
- my(@baseprojs) = ();
- my(%ti) = ();
- my(%relative) = ();
- my(%addtemp) = ();
- my(%addproj) = ();
- my($global) = undef;
- my($template) = undef;
- my($dynamic) = ($defaults ? 1 : undef);
- my($reldefs) = ($defaults ? 1 : undef);
- my($toplevel) = ($defaults ? 1 : undef);
- my($static) = ($defaults ? 0 : undef);
- my($recurse) = ($defaults ? 0 : undef);
-
- ## Process the command line arguments
- for(my $i = 0; $i <= $#args; $i++) {
- my($arg) = $args[$i];
- if ($arg eq '-complete') {
- print $self->completion_command($name, $types) . "\n";
- return undef;
- }
- elsif ($arg eq '-base') {
- $i++;
- if (!defined $args[$i]) {
- $self->optionError('-base requires an argument');
- }
- else {
- push(@baseprojs, $args[$i]);
- }
- }
- elsif ($arg eq '-type') {
- $i++;
- if (!defined $args[$i]) {
- $self->optionError('-type requires an argument');
- }
- else {
- my($type) = lc($args[$i]);
- if (defined $types->{$type}) {
- my($call) = $types->{$type};
- my($found) = 0;
- foreach my $generator (@generators) {
- if ($generator eq $call) {
- $found = 1;
- last;
- }
- }
- if (!$found) {
- push(@generators, $call);
- }
- }
- else {
- $self->optionError("Invalid type: $args[$i]");
- }
- }
- }
- elsif ($arg eq '-global') {
- $i++;
- $global = $args[$i];
- if (!defined $global) {
- $self->optionError('-global requires a file name argument');
- }
- }
- elsif ($arg eq '-include') {
- $i++;
- my($include) = $args[$i];
- if (!defined $include) {
- $self->optionError('-include requires a directory argument');
- }
- else {
- push(@include, $include);
- }
- }
- elsif ($arg eq '-noreldefs') {
- $reldefs = 0;
- }
- elsif ($arg eq '-notoplevel') {
- $toplevel = 0;
- }
- elsif ($arg eq '-recurse') {
- $recurse = 1;
- }
- elsif ($arg eq '-template') {
- $i++;
- $template = $args[$i];
- if (!defined $template) {
- $self->optionError('-template requires a file name argument');
- }
- }
- elsif ($arg eq '-relative') {
- $i++;
- my($rel) = $args[$i];
- if (!defined $rel) {
- $self->optionError('-relative requires a variable assignment argument');
- }
- else {
- if ($rel =~ /(\w+)\s*=\s*(.*)/) {
- my($name) = $1;
- my($val) = $2;
- $val =~ s/^\s+//;
- $val =~ s/\s+$//;
- $relative{$name} = $val;
- }
- else {
- $self->optionError('Invalid option to -relative');
- }
- }
- }
- elsif ($arg eq '-ti') {
- $i++;
- my($tmpi) = $args[$i];
- if (!defined $tmpi) {
- $self->optionError('-ti requires a template input argument');
- }
- else {
- if ($tmpi =~ /(dll|lib|dll_exe|lib_exe):(.*)/) {
- my($key) = $1;
- my($name) = $2;
- $ti{$key} = $name;
- }
- else {
- $self->optionError("Invalid -ti argument: $tmpi");
- }
- }
- }
- elsif ($arg eq '-value_template') {
- $i++;
- my($value) = $args[$i];
- if (!defined $value) {
- $self->optionError('-value_template requires a variable assignment argument');
- }
- else {
- if ($value =~ /(\w+)\s*([\-+]?=)\s*(.*)/) {
- my($name) = $1;
- my($op) = $2;
- my($val) = $3;
- $val =~ s/^\s+//;
- $val =~ s/\s+$//;
- if ($op eq '+=') {
- $op = 1;
- }
- elsif ($op eq '-=') {
- $op = -1;
- }
- else {
- $op = 0;
- }
- $addtemp{$name} = [$op, $val];
- }
- else {
- $self->optionError('Invalid option to -value_template');
- }
- }
- }
- elsif ($arg eq '-value_project') {
- $i++;
- my($value) = $args[$i];
- if (!defined $value) {
- $self->optionError('-value_project requires a variable assignment argument');
- }
- else {
- if ($value =~ /(\w+)\s*([\-+]?=)\s*(.*)/) {
- my($name) = $1;
- my($op) = $2;
- my($val) = $3;
- $val =~ s/^\s+//;
- $val =~ s/\s+$//;
- if ($op eq '+=') {
- $op = 1;
- }
- elsif ($op eq '-=') {
- $op = -1;
- }
- else {
- $op = 0;
- }
- $addproj{$name} = [$op, $val];
- }
- else {
- $self->optionError('Invalid option to -value_project');
- }
- }
- }
- elsif ($arg eq '-static') {
- $static = 1;
- }
- elsif ($arg eq '-static_only') {
- $static = 1;
- $dynamic = 0;
- }
- elsif ($arg =~ /^-/) {
- $self->optionError("Unknown option: $arg");
- }
- else {
- push(@input, $arg);
- }
- }
-
- my(%options) = ('global' => $global,
- 'include' => \@include,
- 'input' => \@input,
- 'generators' => \@generators,
- 'baseprojs' => \@baseprojs,
- 'template' => $template,
- 'ti' => \%ti,
- 'dynamic' => $dynamic,
- 'static' => $static,
- 'relative' => \%relative,
- 'reldefs' => $reldefs,
- 'toplevel' => $toplevel,
- 'recurse' => $recurse,
- 'addtemp' => \%addtemp,
- 'addproj' => \%addproj,
- );
-
- return \%options;
-}
-
-
-sub is_set {
- my($self) = shift;
- my($key) = shift;
- my($options) = shift;
-
- if (UNIVERSAL::isa($options->{$key}, 'ARRAY')) {
- if (defined $options->{$key}->[0]) {
- return 'ARRAY';
- }
- }
- elsif (UNIVERSAL::isa($options->{$key}, 'HASH')) {
- my(@keys) = keys %{$options->{$key}};
- if (defined $keys[0]) {
- return 'HASH';
- }
- }
- elsif (defined $options->{$key}) {
- return 'SCALAR';
- }
-
- return undef;
-}
-
-1;
diff --git a/bin/MakeProjectCreator/modules/Parser.pm b/bin/MakeProjectCreator/modules/Parser.pm
deleted file mode 100644
index 1376c8ac408..00000000000
--- a/bin/MakeProjectCreator/modules/Parser.pm
+++ /dev/null
@@ -1,175 +0,0 @@
-package Parser;
-
-# ************************************************************
-# Description : A basic parser that requires a parse_line override
-# Author : Chad Elliott
-# Create Date : 5/16/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use FileHandle;
-
-use StringProcessor;
-
-use vars qw(@ISA);
-@ISA = qw(StringProcessor);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($cwd) = Cwd::getcwd();
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($inc) = shift;
- my($self) = $class->SUPER::new();
-
- $self->{'line_number'} = 0;
- $self->{'include'} = $inc;
-
- return $self;
-}
-
-
-sub cd {
- my($self) = shift;
- my($dir) = shift;
- my($status) = chdir($dir);
- if ($status && $dir ne '.') {
- if ($dir =~ /^\// || $dir =~ /^[A-Za-z]:/) {
- $cwd = $dir;
- }
- else {
- $cwd .= "/$dir";
- }
- }
- return $status;
-}
-
-
-sub getcwd {
- #my($self) = shift;
- return $cwd;
-}
-
-
-sub strip_line {
- my($self) = shift;
- my($line) = shift;
-
- ++$self->{'line_number'};
- $line =~ s/\/\/.*//;
- $line =~ s/^\s+//;
- $line =~ s/\s+$//;
-
- return $line;
-}
-
-
-sub collect_line {
- my($self) = shift;
- my($fh) = shift;
- my($lref) = shift;
- my($line) = shift;
-
- $$lref = $self->strip_line($line);
- return $self->parse_line($fh, $$lref);
-}
-
-
-sub read_file {
- my($self) = shift;
- my($input) = shift;
- my($ih) = new FileHandle();
- my($status) = 1;
- my($errorString) = '';
-
- $self->{'line_number'} = 0;
- if (open($ih, $input)) {
- my($line) = "";
- while(<$ih>) {
- ($status, $errorString) = $self->collect_line($ih, \$line, $_);
-
- if (!$status) {
- last;
- }
- }
- close($ih);
- }
- else {
- $errorString = 'ERROR: Unable to open for reading';
- $status = 0;
- }
-
- return $status, $errorString;
-}
-
-
-sub line_number {
- my($self) = shift;
- my($number) = shift;
-
- if (defined $number) {
- $self->{'line_number'} = $number;
- }
-
- return $self->{'line_number'};
-}
-
-
-sub slash_to_backslash {
- my($self) = shift;
- my($file) = shift;
- $file =~ s/\//\\/g;
- return $file;
-}
-
-
-sub get_include_path {
- my($self) = shift;
- return $self->{'include'};
-}
-
-
-sub search_include_path {
- my($self) = shift;
- my($file) = shift;
- my($found) = undef;
-
- foreach my $include (@{$self->{'include'}}) {
- if (-r "$include/$file") {
- $found = "$include/$file";
- last;
- }
- }
- return $found;
-}
-
-
-# ************************************************************
-# Virtual Methods To Be Overridden
-# ************************************************************
-
-sub convert_slashes {
- #my($self) = shift;
- return 1;
-}
-
-
-sub parse_line {
- #my($self) = shift;
- #my($ih) = shift;
- #my($line) = shift;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/ProjectCreator.pm b/bin/MakeProjectCreator/modules/ProjectCreator.pm
deleted file mode 100644
index 112e6f75fe5..00000000000
--- a/bin/MakeProjectCreator/modules/ProjectCreator.pm
+++ /dev/null
@@ -1,1663 +0,0 @@
-package ProjectCreator;
-
-# ************************************************************
-# Description : Base class for all project creators
-# Author : Chad Elliott
-# Create Date : 3/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use FileHandle;
-use File::Path;
-use File::Basename;
-
-use Creator;
-use TemplateInputReader;
-use TemplateParser;
-
-use vars qw(@ISA);
-@ISA = qw(Creator);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($BaseClassExtension) = 'mpb';
-my($ProjectCreatorExtension) = 'mpc';
-my($TemplateExtension) = 'mpd';
-my($TemplateInputExtension) = 'mpt';
-
-## Valid names for assignments within a project
-my(%validNames) = ('exename' => 1,
- 'sharedname' => 1,
- 'staticname' => 1,
- 'libpaths' => 1,
- 'install' => 1,
- 'includes' => 1,
- 'idlflags' => 1,
- 'idlpreprocessor' => 1,
- 'defaultlibs' => 1,
- 'depends' => 1,
- 'libs' => 1,
- 'lit_libs' => 1,
- 'pch_header' => 1,
- 'pch_source' => 1,
- 'ssl' => 1,
- 'dllout' => 1,
- 'libout' => 1,
- 'dllflags' => 1,
- 'libflags' => 1,
- 'version' => 1,
- 'requires' => 1,
- 'avoids' => 1,
- 'compname' => 1,
- 'comps' => 1,
- 'tagname' => 1,
- 'tagchecks' => 1,
- 'include_dir' => 1,
- 'core' => 1,
- 'idlgendir' => 1,
- );
-
-## Deal with these components in a special way
-my(@specialComponents) = ('header_files', 'inline_files');
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($global) = shift;
- my($inc) = shift;
- my($template) = shift;
- my($ti) = shift;
- my($dynamic) = shift;
- my($static) = shift;
- my($relative) = shift;
- my($addtemp) = shift;
- my($addproj) = shift;
- my($progress) = shift;
- my($toplevel) = shift;
- my($baseprojs) = shift;
- my($self) = Creator::new($class, $global, $inc,
- $template, $ti, $dynamic, $static,
- $relative, $addtemp, $addproj,
- $progress, $toplevel, $baseprojs,
- 'project');
-
- $self->{$self->{'type_check'}} = 0;
- $self->{'project_info'} = [];
- $self->{'reading_parent'} = [];
- $self->{'dexe_template_input'} = undef;
- $self->{'lexe_template_input'} = undef;
- $self->{'lib_template_input'} = undef;
- $self->{'dll_template_input'} = undef;
- $self->{'idl_defaulted'} = 0;
- $self->{'source_defaulted'} = 0;
- $self->{'writing_type'} = 0;
- $self->{'flag_overrides'} = {};
- $self->{'special_supplied'} = {};
-
- ## Set up the verbatim constructs
- $self->{'verbatim'} = {};
-
- ## Valid component names within a project along with the valid file extensions
- my(%vc) = ('source_files' => [ "\\.cpp", "\\.cxx", "\\.cc", "\\.c", "\\.C", ],
- 'template_files' => [ "_T\\.cpp", "_T\\.cxx", "_T\\.cc", "_T\\.c", "_T\\.C", ],
- 'header_files' => [ "\\.h", "\\.hxx", "\\.hh", ],
- 'inline_files' => [ "\\.i", "\\.inl", ],
- 'idl_files' => [ "\\.idl", ],
- 'documentation_files' => [ "README", "readme", "\\.doc", "\\.txt", ],
- 'resource_files' => [ "\\.rc", ],
- );
-
- ## Exclude these extensions when auto generating the component values
- my(%ec) = ('source_files' => [ "_T\\.cpp", "_T\\.cxx", "_T\\.cc", "_T\\.C", ],
- );
-
- ## Match up assignments with the valid components
- my(%ma) = ('source_files' => [ 'includes' ],
- 'idl_files' => [ 'idlgendir', 'idlflags' ],
- );
- $self->{'matching_assignments'} = \%ma;
- $self->{'valid_components'} = \%vc;
- $self->{'exclude_components'} = \%ec;
- $self->{'skeleton_endings'} = [ 'C', 'S' ];
- $self->{'type_specific_assign'} = {};
- $self->{'pctype'} = $self->extractType("$self");
-
- ## Allow subclasses to override the default extensions
- $self->set_component_extensions();
-
- return $self;
-}
-
-
-sub read_global_configuration {
- my($self) = shift;
- my($input) = $self->get_global_cfg();
- my($status) = 1;
-
- if (defined $input) {
- $self->{'reading_global'} = 1;
- $status = $self->parse_file($input);
- $self->{'reading_global'} = 0;
- }
-
- return $status;
-}
-
-
-sub parse_line {
- my($self) = shift;
- my($ih) = shift;
- my($line) = shift;
- my($type) = $self->{'grammar_type'};
- my($status,
- $errorString,
- @values) = $self->parse_known($line);
-
- ## parse_known() passes back an array of values
- ## that make up the contents of the line parsed.
- ## The array can have 0 to 3 items. The first,
- ## if defined, is always an identifier of some
- ## sort.
-
- if ($status && defined $values[0]) {
- if ($values[0] eq $type) {
- my($name) = $values[1];
- my($typecheck) = $self->{'type_check'};
- if (defined $name && $name eq '}') {
- ## Project Ending
- my($rp) = $self->{'reading_parent'};
- if (!defined $$rp[0] && !$self->{'reading_global'}) {
- ## Fill in all the default values
- $self->generate_defaults();
-
- ## Fill in type specific assignments
- my($tsa) = $self->{'type_specific_assign'}->{$self->{'pctype'}};
- if (defined $tsa) {
- foreach my $key (keys %$tsa) {
- $self->process_assignment_add($key, $$tsa{$key});
- }
- }
-
- ## Perform any additions, subtractions
- ## or overrides for the project values.
- my($addproj) = $self->get_addproj();
- foreach my $ap (keys %$addproj) {
- if (defined $validNames{$ap}) {
- my($val) = $$addproj{$ap};
- if ($$val[0] > 0) {
- $self->process_assignment_add($ap, $$val[1]);
- }
- elsif ($$val[0] < 0) {
- $self->process_assignment_sub($ap, $$val[1]);
- }
- else {
- $self->process_assignment($ap, $$val[1]);
- }
- }
- else {
- $errorString = 'ERROR: Invalid ' .
- "assignment modification name: $ap";
- $status = 0;
- }
- }
-
- if ($status) {
- ## End of project; Write out the file.
- $self->write_project();
-
- foreach my $key (keys %{$self->{'valid_components'}}) {
- delete $self->{$key};
- }
- $self->{'assign'} = {};
- $self->{'verbatim'} = {};
- $self->{'type_specific_assign'} = {};
- }
- }
- $self->{$typecheck} = 0;
- $self->{'idl_defaulted'} = 0;
- $self->{'flag_overrides'} = {};
- $self->{'source_defaulted'} = 0;
- $self->{'special_supplied'} = {};
- }
- else {
- ## Project Beginning
- ## Deal with the inheritance hiearchy first
- my($parents) = $values[2];
-
- ## Add in the base projects from the command line
- if (!$self->{'reading_global'} &&
- !defined $self->{'reading_parent'}->[0]) {
- my($baseprojs) = $self->get_baseprojs();
-
- if (defined $parents) {
- foreach my $base (@$baseprojs) {
- my($found) = 0;
- foreach my $parent (@$parents) {
- if ($base eq $parent) {
- $found = 1;
- last;
- }
- }
- if (!$found) {
- push(@$parents, $base);
- }
- }
- }
- else {
- $parents = $baseprojs;
- }
- }
-
- if (defined $parents) {
- foreach my $parent (@$parents) {
- ## Read in the parent onto ourself
- my($file) = $self->search_include_path(
- "$parent.$BaseClassExtension");
- if (!defined $file) {
- $file = $self->search_include_path(
- "$parent.$ProjectCreatorExtension");
- }
-
- if (defined $file) {
- push(@{$self->{'reading_parent'}}, 1);
- $status = $self->parse_file($file);
- pop(@{$self->{'reading_parent'}});
-
- if (!$status) {
- $errorString = "ERROR: Invalid parent: $parent";
- }
- }
- else {
- $status = 0;
- $errorString = "ERROR: Unable to locate parent: $parent";
- }
- }
- }
-
- ## Set up some initial values
- if (defined $name) {
- $name =~ s/^\(\s*//;
- $name =~ s/\s*\)$//;
- $self->process_assignment('project_name', $name);
- }
- $self->{$typecheck} = 1;
-
- ## Copy each value from global_assign into assign
- if (!$self->{'reading_global'}) {
- foreach my $key (keys %{$self->{'global_assign'}}) {
- if (!defined $self->{'assign'}->{$key}) {
- $self->{'assign'}->{$key} = $self->{'global_assign'}->{$key};
- }
- }
- }
- }
- }
- elsif ($values[0] eq 'assignment') {
- my($name) = $values[1];
- my($value) = $values[2];
- if (defined $validNames{$name}) {
- $self->process_assignment($name, $value);
- }
- else {
- $errorString = "ERROR: Invalid assignment name: $name";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'assign_add') {
- my($name) = $values[1];
- my($value) = $values[2];
- if (defined $validNames{$name}) {
- $self->process_assignment_add($name, $value);
- }
- else {
- $errorString = "ERROR: Invalid addition name: $name";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'assign_sub') {
- my($name) = $values[1];
- my($value) = $values[2];
- if (defined $validNames{$name}) {
- $self->process_assignment_sub($name, $value);
- }
- else {
- $errorString = "ERROR: Invalid subtraction name: $name";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'component') {
- my($comp) = $values[1];
- my($name) = $values[2];
- if (defined $name) {
- $name =~ s/^\(\s*//;
- $name =~ s/\s*\)$//;
- }
- else {
- $name = 'default';
- }
-
- my($vc) = $self->{'valid_components'};
- if (defined $$vc{$comp}) {
- if (!$self->parse_components($ih, $comp, $name)) {
- $errorString = "ERROR: Unable to process $comp";
- $status = 0;
- }
- }
- else {
- if ($comp eq 'verbatim') {
- my($type, $loc) = split(/\s*,\s*/, $name);
- if (!$self->parse_verbatim($ih, $comp, $type, $loc)) {
- $errorString = "ERROR: Unable to process $comp";
- $status = 0;
- }
- }
- elsif ($comp eq 'specific') {
- ($status, $errorString) = $self->parse_scope(
- $ih, $values[1], $values[2], \%validNames,
- $self->{'type_specific_assign'}->{$self->{'pctype'}});
- }
- else {
- $errorString = "ERROR: Invalid component name: $comp";
- $status = 0;
- }
- }
- }
- else {
- $errorString = "ERROR: Unrecognized line: $line";
- $status = 0;
- }
- }
- elsif ($status == -1) {
- $status = 0;
- }
-
- return $status, $errorString;
-}
-
-
-sub parse_components {
- my($self) = shift;
- my($fh) = shift;
- my($tag) = shift;
- my($name) = shift;
- my($current) = '000_FILES';
- my($status) = 1;
- my($names) = {};
- my($comps) = {};
- my($order) = 0;
- my($set) = 0;
- my(%flags) = ();
-
- if (defined $self->{$tag}) {
- $names = $self->{$tag};
- }
- else {
- $self->{$tag} = $names;
- }
- if (defined $$names{$name}) {
- $comps = $$names{$name};
- }
- else {
- $$names{$name} = $comps;
- }
- if (!defined $$comps{$current}) {
- $$comps{$current} = [];
- }
-
- foreach my $special (@specialComponents) {
- if ($special eq $tag) {
- $self->{'special_supplied'}->{$tag} = 1;
- last;
- }
- }
-
- while(<$fh>) {
- my($line) = $self->strip_line($_);
-
- if ($line eq '') {
- }
- elsif ($line =~ /^(\w+)\s*{$/) {
- if (!defined $current || !$set) {
- if (defined $current && !defined $$comps{$current}->[0]) {
- ## The default components name was never used
- ## so we remove it from the components
- delete $$comps{$current};
- }
- $current = sprintf("%03d_$1", $order);
- $set = 1;
- $order++;
- if (!defined $$comps{$current}) {
- $$comps{$current} = [];
- }
- }
- else {
- $status = 0;
- last;
- }
- }
- elsif ($line =~ /^}/) {
- if (defined $current && $set) {
- $current = undef;
- }
- else {
- ## This is not an error,
- ## this is the end of the components
- last;
- }
- }
- elsif (defined $current) {
- my(@values) = ();
- ## If this returns true, then we've found an assignment
- if ($self->parse_assignment($line, \@values)) {
- my($over) = {};
- if (defined $self->{'flag_overrides'}->{$tag}) {
- $over = $self->{'flag_overrides'}->{$tag};
- }
- else {
- $self->{'flag_overrides'}->{$tag} = $over;
- }
-
- if ($values[0] eq 'assignment') {
- $self->process_assignment($values[1],
- $values[2], \%flags);
- }
- elsif ($values[0] eq 'assign_add') {
- $self->process_assignment_add($values[1],
- $values[2], \%flags);
- }
- elsif ($values[0] eq 'assign_sub') {
- $self->process_assignment_sub($values[1],
- $values[2], \%flags);
- }
- }
- else {
- my($over) = $self->{'flag_overrides'}->{$tag};
- if (defined $over) {
- $$over{$line} = \%flags;
- }
- my($array) = $$comps{$current};
- push(@$array, $line);
- }
- }
- else {
- $status = 0;
- last;
- }
- }
-
- return $status;
-}
-
-
-sub parse_verbatim {
- my($self) = shift;
- my($fh) = shift;
- my($tag) = shift;
- my($type) = shift;
- my($loc) = shift;
-
- ## All types are lowercase
- $type = lc($type);
-
- if (!defined $self->{'verbatim'}->{$type}) {
- $self->{'verbatim'}->{$type} = {};
- }
- $self->{'verbatim'}->{$type}->{$loc} = [];
- my($array) = $self->{'verbatim'}->{$type}->{$loc};
-
- while(<$fh>) {
- my($line) = $self->strip_line($_);
-
- if ($line eq '') {
- }
- elsif ($line =~ /^}/) {
- ## This is not an error,
- ## this is the end of the components
- last;
- }
- else {
- push(@$array, $line);
- }
- }
-
- return 1;
-}
-
-
-sub handle_scoped_end {
- my($self) = shift;
- my($type) = shift;
- my($flags) = shift;
-
- if (defined $self->{'type_specific_assign'}->{$type}) {
- foreach my $key (keys %$flags) {
- $self->{'type_specific_assign'}->{$type}->{$key} = $$flags{$key};
- }
- }
- else {
- $self->{'type_specific_assign'}->{$type} = $flags;
- }
-}
-
-
-sub process_duplicate_modification {
- my($self) = shift;
- my($name) = shift;
- my($assign) = shift;
-
- ## If we are modifying the libs, libpaths or includes assignment with
- ## either addition or subtraction, we are going to
- ## perform a little fix on the value to avoid multiple
- ## libraries and to try to insure the correct linking order
- if ($name eq 'libs' || $name eq 'libpaths' || $name eq 'includes') {
- my($nval) = $self->get_assignment($name, $assign);
- if (defined $nval) {
- my($parts) = $self->create_array($nval);
- my(%seen) = ();
- my($value) = '';
- foreach my $part (reverse @$parts) {
- if (!defined $seen{$part}) {
- $value = "$part $value";
- $seen{$part} = 1;
- }
- }
- $self->process_assignment($name, $value, $assign);
- }
- }
-}
-
-
-sub read_template_input {
- my($self) = shift;
- my($status) = 1;
- my($errorString) = '';
- my($file) = undef;
- my($tag) = undef;
- my($ti) = $self->get_ti_override();
- my($override) = 0;
-
- if ($self->exe_target()) {
- if ($self->{'writing_type'} == 1) {
- $tag = 'lexe_template_input';
- if (!defined $self->{$tag}) {
- if (defined $$ti{'lib_exe'}) {
- $file = $$ti{'lib_exe'};
- $override = 1;
- }
- else {
- $file = $self->get_lib_exe_template_input_file();
- }
- }
- }
- else {
- $tag = 'dexe_template_input';
- if (!defined $self->{$tag}) {
- if (defined $$ti{'dll_exe'}) {
- $file = $$ti{'dll_exe'};
- $override = 1;
- }
- else {
- $file = $self->get_dll_exe_template_input_file();
- }
- }
- }
- }
- else {
- if ($self->{'writing_type'} == 1) {
- $tag = 'lib_template_input';
- if (!defined $self->{$tag}) {
- if (defined $$ti{'lib'}) {
- $file = $$ti{'lib'};
- $override = 1;
- }
- else {
- $file = $self->get_lib_template_input_file();
- }
- }
- }
- else {
- $tag = 'dll_template_input';
- if (!defined $self->{$tag}) {
- if (defined $$ti{'dll'}) {
- $file = $$ti{'dll'};
- $override = 1;
- }
- else {
- $file = $self->get_dll_template_input_file();
- }
- }
- }
- }
-
- if (defined $file) {
- my($file) = $self->search_include_path("$file.$TemplateInputExtension");
- if (defined $file) {
- $self->{$tag} = new TemplateInputReader($self->get_include_path());
- ($status, $errorString) = $self->{$tag}->read_file($file);
- }
- else {
- if ($override) {
- $status = 0;
- $errorString = 'Unable to locate template input file.';
- }
- }
- }
-
- return $status, $errorString;
-}
-
-
-sub already_added {
- my($self) = shift;
- my($array) = shift;
- my($name) = shift;
-
- foreach my $file (@$array) {
- if ($file eq $name) {
- return 1;
- }
- }
- return 0;
-}
-
-
-sub add_idl_generated {
- my($self) = shift;
- my($tag) = shift;
- my($idl) = shift;
- my($names) = $self->{$tag};
- my($vc) = $self->{'valid_components'};
- my($wanted) = $$vc{$tag}->[0];
- my(@added) = ();
-
- $wanted =~ s/\\//;
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my($array) = $$comps{$key};
- foreach my $i (@$idl) {
- my($file) = $i;
- $file =~ s/\.idl$//;
- foreach my $ending (@{$self->{'skeleton_endings'}}) {
- my($created) = "$file$ending$wanted";
- if (!$self->already_added($array, $created)) {
- push(@added, $created);
- }
- }
- }
- ## Put the generated files at the front
- if (defined $added[0]) {
- unshift(@$array, @added);
- }
- }
- }
-}
-
-
-sub generate_default_target_names {
- my($self) = shift;
-
- if (!$self->exe_target()) {
- my($sharedname) = $self->get_assignment('sharedname');
- if (defined $sharedname &&
- !defined $self->get_assignment('staticname')) {
- $self->process_assignment('staticname', $sharedname);
- }
- my($staticname) = $self->get_assignment('staticname');
- if (defined $staticname &&
- !defined $self->get_assignment('sharedname')) {
- $self->process_assignment('sharedname', $staticname);
- $sharedname = $staticname;
- }
-
- ## If it's neither an exe or library target, we will search
- ## through the source files for a main()
- if (!$self->lib_target()) {
- my($fh) = new FileHandle();
- my($exename) = undef;
- foreach my $file ($self->get_component_list('source_files')) {
- if (open($fh, $file)) {
- while(<$fh>) {
- ## Remove c++ comments (ignore c style comments for now)
- $_ =~ s/\/\/.*//;
-
- ## Check for main
- if (/(main|ACE_MAIN|ACE_WMAIN|ACE_TMAIN)\s*\(/) {
- ## If we found a main, set the exename to the basename
- ## of the cpp file with the extension removed
- $exename = basename($file);
- $exename =~ s/\.[^\.]+$//;
- last;
- }
- }
- close($fh);
- }
-
- ## Set the exename assignment
- if (defined $exename) {
- $self->process_assignment('exename', $exename);
- last;
- }
- }
- }
- }
-}
-
-
-sub generate_default_pch_filenames {
- my($self) = shift;
- my($files) = shift;
- my($pname) = $self->get_assignment('project_name');
-
- if (!defined $self->get_assignment('pch_header')) {
- my($count) = 0;
- my($matching) = undef;
- foreach my $file (@$files) {
- foreach my $ext (@{$self->{'valid_components'}->{'header_files'}}) {
- if ($file =~ /(.*_pch$ext)/) {
- $self->process_assignment('pch_header', $1);
- ++$count;
- if ($file =~ /$pname/) {
- $matching = $file;
- }
- last;
- }
- }
- }
- if ($count > 1 && defined $matching) {
- $self->process_assignment('pch_header', $matching);
- }
- }
-
- if (!defined $self->get_assignment('pch_source')) {
- my($count) = 0;
- my($matching) = undef;
- foreach my $file (@$files) {
- foreach my $ext (@{$self->{'valid_components'}->{'source_files'}}) {
- if ($file =~ /(.*_pch$ext)/) {
- $self->process_assignment('pch_source', $1);
- ++$count;
- if ($file =~ /$pname/) {
- $matching = $file;
- }
- last;
- }
- }
- }
- if ($count > 1 && defined $matching) {
- $self->process_assignment('pch_source', $matching);
- }
- }
-}
-
-
-sub fix_pch_filenames {
- my($self) = shift;
- foreach my $type ('pch_header', 'pch_source') {
- if ($self->get_assignment($type) eq '') {
- $self->process_assignment($type, undef);
- }
- }
-}
-
-
-sub is_special_tag {
- my($self) = shift;
- my($tag) = shift;
-
- foreach my $t (@specialComponents) {
- if ($tag eq $t) {
- return 1;
- }
- }
-
- return 0;
-}
-
-
-sub escape_regex_special {
- my($self) = shift;
- my($name) = shift;
-
- $name =~ s/\\/\\\\/g;
- $name =~ s/\$/\\\$/g;
- $name =~ s/\[/\\\[/g;
- $name =~ s/\]/\\\]/g;
- $name =~ s/\(/\\\(/g;
- $name =~ s/\)/\\\)/g;
-
- return $name;
-}
-
-
-sub sift_files {
- my($self) = shift;
- my($files) = shift;
- my($exts) = shift;
- my($pchh) = shift;
- my($pchc) = shift;
- my($tag) = shift;
- my($array) = shift;
- my(@saved) = ();
- my($ec) = $self->{'exclude_components'};
-
- foreach my $file (@$files) {
- foreach my $ext (@$exts) {
- ## Always exclude the precompiled header and cpp
- if ($file =~ /$ext$/ && (!defined $pchh || $file ne $pchh) &&
- (!defined $pchc || $file ne $pchc)) {
- my($exclude) = 0;
- if (defined $$ec{$tag}) {
- my($excludes) = $$ec{$tag};
- foreach my $exc (@$excludes) {
- if ($file =~ /$exc$/) {
- $exclude = 1;
- last;
- }
- }
- }
- elsif ($tag eq 'resource_files') {
- ## Save these files for later. There may
- ## be more than one and we want to try and
- ## find the one that corresponds to this project
- $exclude = 1;
- push(@saved, $file);
- }
-
- if (!$exclude) {
- if (!$self->already_added($array, $file)) {
- push(@$array, $file);
- }
- }
- last;
- }
- }
- }
-
- ## Now deal with the saved files
- if (defined $saved[0]) {
- my($pjname) = $self->escape_regex_special(
- $self->get_assignment('project_name'));
- foreach my $save (@saved) {
- my($file) = $self->escape_regex_special($save);
- if ($pjname =~ /$file/ || $file =~ /$pjname/) {
- if (!$self->already_added($array, $file)) {
- push(@$array, $file);
- }
- }
- }
- }
-}
-
-
-sub generate_default_components {
- my($self) = shift;
- my($files) = shift;
- my($passed) = shift;
- my($vc) = $self->{'valid_components'};
- my(@tags) = (defined $passed ? $passed : keys %$vc);
- my($pchh) = $self->get_assignment('pch_header');
- my($pchc) = $self->get_assignment('pch_source');
-
- foreach my $tag (@tags) {
- my($exts) = $$vc{$tag};
- if (defined $$exts[0]) {
- if (defined $self->{$tag}) {
- ## If the tag is defined, then process directories
- my($names) = $self->{$tag};
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- my($array) = $$comps{$comp};
- if (defined $passed) {
- $self->sift_files($files, $exts, $pchh, $pchc, $tag, $array);
- }
- else {
- my(@built) = ();
- foreach my $file (@$array) {
- if (-d $file) {
- my(@gen) = $self->generate_default_file_list($file);
- $self->sift_files(\@gen, $exts, $pchh, $pchc, $tag, \@built);
- }
- else {
- if (!$self->already_added(\@built, $file)) {
- push(@built, $file);
- }
- }
- }
- $$comps{$comp} = \@built;
- }
- }
- }
- }
- else {
- ## Generate default values for undefined tags
- my($names) = {};
- $self->{$tag} = $names;
- my($comps) = {};
- $$names{'default'} = $comps;
- $$comps{'000_FILES'} = [];
- my($array) = $$comps{'000_FILES'};
-
- if (!$self->is_special_tag($tag)) {
- $self->sift_files($files, $exts, $pchh, $pchc, $tag, $array);
- if ($tag eq 'idl_files' && defined $$array[0]) {
- $self->{'idl_defaulted'} = 1;
- }
- elsif ($tag eq 'source_files') {
- ## If we are auto-generating the source_files, then
- ## we need to make sure that any idl generated source
- ## files that are added are put at the front of the list.
- my(@front) = ();
- my(@copy) = @$array;
- my(@exts) = $self->generated_source_extensions($tag);
-
- $self->{'source_defaulted'} = 1;
- @$array = ();
- foreach my $file (@copy) {
- my($found) = 0;
- foreach my $ext (@exts) {
- if ($file =~ /$ext$/) {
- ## No need to check for previously added files
- ## here since there are none.
- push(@front, $file);
- $found = 1;
- last;
- }
- }
- if (!$found) {
- ## No need to check for previously added files
- ## here since there are none.
- push(@$array, $file);
- }
- }
-
- if (defined $front[0]) {
- unshift(@$array, @front);
- }
- }
- }
- }
- }
- }
-}
-
-
-sub remove_duplicated_files {
- my($self) = shift;
- my($dest) = shift;
- my($source) = shift;
- my($names) = $self->{$dest};
- my(@slist) = $self->get_component_list($source);
-
- ## Find out which source files are listed
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my($array) = $$comps{$key};
- my($count) = scalar(@$array);
- for(my $i = 0; $i < $count; ++$i) {
- foreach my $sfile (@slist) {
- ## Is the source file is in the component array?
- if ($$array[$i] eq $sfile) {
- ## Remove the element and fix the index and count
- splice(@$array, $i, 1);
- --$count;
- --$i;
- last;
- }
- }
- }
- }
- }
-}
-
-
-sub generated_source_extensions {
- my($self) = shift;
- my($tag) = shift;
- my($vc) = $self->{'valid_components'};
- my($gc) = $$vc{$tag};
- my(@gen) = ();
-
- foreach my $e (@$gc) {
- foreach my $ending (@{$self->{'skeleton_endings'}}) {
- push(@gen, "$ending$e");
- }
- }
- return @gen;
-}
-
-
-sub generated_source_listed {
- my($self) = shift;
- my($tag) = shift;
- my($idl) = shift;
- my($names) = $self->{$tag};
- my(@gen) = $self->generated_source_extensions($tag);
- my(@found) = ();
-
- ## Find out which generated source files are listed
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my($array) = $$comps{$key};
- foreach my $val (@$array) {
- foreach my $ext (@gen) {
- foreach my $i (@$idl) {
- my($ifile) = $self->escape_regex_special($i);
- if ($val =~ /$ifile$ext$/) {
- push(@found, $val);
- }
- }
- }
- }
- }
- }
- return (defined $found[0]);
-}
-
-
-sub generate_default_idl_generated {
- my($self) = shift;
- my($tags) = shift;
-
- if ($self->{'idl_defaulted'}) {
- ## After all source and headers have been defaulted, see if we
- ## need to add the idl generated .h, .i and .cpp files
- if (defined $self->{'idl_files'}) {
- ## Build up the list of idl files
- my(@idl) = ();
- my($names) = $self->{'idl_files'};
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my($array) = $$comps{$key};
- foreach my $val (@$array) {
- my($f) = $val;
- $f =~ s/\.idl$//;
- push(@idl, $f);
- }
- }
- }
-
- foreach my $type (@$tags) {
- if (!$self->generated_source_listed($type, \@idl)) {
- $self->add_idl_generated($type, \@idl);
- }
- }
- }
- }
-}
-
-
-sub add_source_corresponding_component_files {
- my($self) = shift;
- my($tag) = shift;
- my(@all) = ();
- my($vc) = $self->{'valid_components'};
-
- foreach my $filetag ('source_files', 'template_files') {
- my($names) = $self->{$filetag};
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- push(@all, @{$$comps{$comp}});
- }
- }
- }
-
- ## We need to cross-check the idl files. But we need to remove
- ## the idl extension first.
- my(@idl) = $self->get_component_list('idl_files');
- for(my $i = 0; $i <= $#idl; $i++) {
- $idl[$i] =~ s/\.idl$//;
- }
-
- ## for each cpp file, we add a corresponding header or inline file
- ## if it exists and is not already in the list of headers
- my($names) = $self->{$tag};
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- my($array) = $$comps{$comp};
- foreach my $cpp (@all) {
- my($found) = 0;
- my($c) = $cpp;
- $c =~ s/\.[^\.]+$//;
- foreach my $file (@$array) {
- my($added) = $c;
- if ($file =~ /(\.[^\.]+)$/) {
- $added .= $1;
- }
-
- if ($added eq $file) {
- $found = 1;
- last;
- }
- }
-
- if (!$found) {
- my($added) = 0;
- foreach my $e (@{$$vc{$tag}}) {
- my($ext) = $e;
- $ext =~ s/\\//g;
-
- ## If the file is readable
- my($file) = "$c$ext";
- if (-r $file) {
- if (!$self->already_added($array, $file)) {
- push(@$array, $file);
- }
- $added = 1;
- last;
- }
- }
- if (!$added) {
- ## If we did not add the file in the above loop,
- ## we must check to see if the file *would be* generated
- ## from idl. If so, we will add the file with the default
- ## (i.e. first) file extension.
- foreach my $idlfile (@idl) {
- my($idl) = $self->escape_regex_special($idlfile);
- if ($c =~ /^$idl/) {
- foreach my $ending (@{$self->{'skeleton_endings'}}) {
- if ($c =~ /^$idl$ending$/) {
- my($ext) = $$vc{$tag}->[0];
- $ext =~ s/\\//g;
- my($file) = "$c$ext";
- if (!$self->already_added($array, $file)) {
- push(@$array, $file);
- }
- $added = 1;
- last;
- }
- }
- }
- last;
- }
- }
- }
- }
- }
- }
-}
-
-
-sub generate_defaults {
- my($self) = shift;
-
- ## Generate default project name
- if (!defined $self->get_assignment('project_name')) {
- my($current) = $self->get_current_input();
- if ($current eq '') {
- $self->process_assignment('project_name', $self->base_directory());
- }
- else {
- $current =~ s/\.[^\.]+$//;
- $self->process_assignment('project_name', $current);
- }
- }
-
- ## Generate the default pch file names (if needed)
- my(@files) = $self->generate_default_file_list();
- $self->generate_default_pch_filenames(\@files);
-
- ## If the pch file names are empty strings then we need to fix that
- $self->fix_pch_filenames();
-
- ## Generate default components, but @specialComponents
- ## are skipped in the initial default components generation
- $self->generate_default_components(\@files);
-
- ## Remove source files that are also listed in the template files
- ## If we do not do this, then generated projects can be invalid.
- $self->remove_duplicated_files('source_files', 'template_files');
-
- ## Generate the default idl generated list of source files
- ## only if we defaulted the idl file list
- $self->generate_default_idl_generated(['source_files']);
-
- ## Add @specialComponents files based on the
- ## source_components (i.e. .h and .i or .inl based on .cpp)
- foreach my $tag (@specialComponents) {
- $self->add_source_corresponding_component_files($tag);
- }
-
- ## Now, if the @specialComponents are still empty
- ## then take any file that matches the components extension
- foreach my $tag (@specialComponents) {
- if (!$self->{'special_supplied'}->{$tag}) {
- my($names) = $self->{$tag};
- if (defined $names) {
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- my($array) = $$comps{$comp};
- if (!defined $$array[0] || $self->{'source_defaulted'}) {
- $self->generate_default_components(\@files, $tag);
- }
- }
- }
- }
- }
- }
-
- ## Generate default target names after all source files are added
- $self->generate_default_target_names();
-}
-
-
-sub project_name {
- my($self) = shift;
- return $self->get_assignment('project_name');
-}
-
-
-sub lib_target {
- my($self) = shift;
- return (defined $self->get_assignment('sharedname') ||
- defined $self->get_assignment('staticname'));
-}
-
-
-sub exe_target {
- my($self) = shift;
- return (defined $self->get_assignment('exename'));
-}
-
-
-sub get_component_list {
- my($self) = shift;
- my($tag) = shift;
- my($names) = $self->{$tag};
- my(@list) = ();
-
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (sort keys %$comps) {
- my($array) = $$comps{$key};
- push(@list, @$array);
- }
- }
-
- if ($self->convert_slashes()) {
- for(my $i = 0; $i <= $#list; $i++) {
- $list[$i] = $self->slash_to_backslash($list[$i]);
- }
- }
-
- if ($self->sort_files()) {
- @list = sort { $self->file_sorter($a, $b) } @list;
- }
-
- return @list;
-}
-
-
-sub need_to_write_project {
- my($self) = shift;
- foreach my $key (keys %{$self->{'valid_components'}}) {
- my($names) = $self->{$key};
- foreach my $name (keys %$names) {
- foreach my $key (sort keys %{$names->{$name}}) {
- if (defined $names->{$name}->{$key}->[0]) {
- return 1;
- }
- }
- }
- }
-
- return 0;
-}
-
-
-sub write_output_file {
- my($self) = shift;
- my($name) = shift;
- my($status) = 0;
- my($error) = '';
- my($tover) = $self->get_template_override();
- my($template) = (defined $tover ? $tover : $self->get_template()) .
- ".$TemplateExtension";
- my($tfile) = $self->search_include_path($template);
-
- if (defined $tfile) {
- ## Read in the template values for the
- ## specific target and project type
- ($status, $error) = $self->read_template_input();
-
- if ($status) {
- my($tp) = new TemplateParser($self);
-
- ## Set the project_file assignment for the template parser
- $self->process_assignment('project_file', $name);
-
- ($status, $error) = $tp->parse_file($tfile);
-
- if ($status) {
- if ($self->get_toplevel()) {
- my($fh) = new FileHandle();
- my($dir) = dirname($name);
-
- if ($dir ne '.') {
- mkpath($dir, 0, 0777);
- }
-
- if (open($fh, ">$name")) {
- my($lines) = $tp->get_lines();
- foreach my $line (@$lines) {
- print $fh $line;
- }
- close($fh);
-
- $self->add_file_written($name);
- }
- else {
- $error = "ERROR: Unable to open $name for output.";
- $status = 0;
- }
- }
- }
- }
- }
- else {
- $error = "ERROR: Unable to locate the template file: $template.";
- $status = 0;
- }
-
- return $status, $error;
-}
-
-
-sub write_project {
- my($self) = shift;
- my($status) = 1;
- my($error) = '';
- my($name) = $self->transform_file_name($self->project_file_name());
- my($prjname) = $self->get_assignment('project_name');
- my($progress) = $self->get_progress_callback();
-
- if (defined $progress) {
- &$progress();
- }
-
- if ($self->need_to_write_project()) {
- ## Writing the non-static file so set it to 0
- if ($self->get_dynamic()) {
- $self->{'writing_type'} = 0;
- $self->process_assignment('project_name',
- $prjname . $self->get_type_append());
- ($status, $error) = $self->write_output_file($name);
- }
-
- if ($status && $self->get_static() && $self->separate_static_project()) {
- ## Set the project name back to what it originally was
- $self->process_assignment('project_name', $prjname);
- $name = $self->transform_file_name($self->static_project_file_name());
-
- ## Writing the static file so set it to 1
- $self->{'writing_type'} = 1;
- $self->process_assignment('project_name',
- $prjname . $self->get_type_append());
- ($status, $error) = $self->write_output_file($name);
- }
-
- if (!$status) {
- print STDERR "$error\n";
- }
- }
-
- return $status;
-}
-
-
-sub get_project_info {
- my($self) = shift;
- return $self->{'project_info'};
-}
-
-
-sub get_writing_type {
- my($self) = shift;
- return $self->{'writing_type'};
-}
-
-
-sub set_component_extensions {
- my($self) = shift;
- my($vc) = $self->{'valid_components'};
- my($ec) = $self->{'exclude_components'};
-
- foreach my $key (keys %$vc) {
- my($ov) = $self->override_valid_component_extensions($key);
- if (defined $ov) {
- $$vc{$key} = $ov;
- }
- }
-
- foreach my $key (keys %$ec) {
- my($ov) = $self->override_exclude_component_extensions($key);
- if (defined $ov) {
- $$ec{$key} = $ov;
- }
- }
-}
-
-
-sub reset_values {
- my($self) = shift;
- $self->{'project_info'} = [];
-}
-
-
-sub get_template_input {
- my($self) = shift;
-
- if ($self->lib_target()) {
- if ($self->{'writing_type'} == 1) {
- return $self->{'lib_template_input'};
- }
- else {
- return $self->{'dll_template_input'};
- }
- }
-
- if ($self->{'writing_type'} == 1) {
- return $self->{'lexe_template_input'};
- }
- else {
- return $self->{'dexe_template_input'};
- }
-}
-
-
-sub update_project_info {
- my($self) = shift;
- my($tparser) = shift;
- my($append) = shift;
- my($names) = shift;
- my($sep) = shift;
- my($pi) = $self->get_project_info();
- my($value) = '';
- my($arr) = ($append && defined $$pi[0] ? pop(@$pi) : []);
-
- ## Set up the hash table when we are starting a new project_info
- if ($append == 0) {
- $self->{'project_info_hash_table'} = {};
- }
-
- ## Append the values of all names into one string
- my(@narr) = @$names;
- for(my $i = 0; $i <= $#narr; $i++) {
- my($key) = $narr[$i];
- $value .= $self->translate_value($key,
- $tparser->get_value_with_default($key)) .
- (defined $sep && $i != $#narr ? $sep : '');
- }
-
- ## If we haven't seen this value yet, put it on the array
- if (!defined $self->{'project_info_hash_table'}->{"@narr $value"}) {
- $self->{'project_info_hash_table'}->{"@narr $value"} = 1;
- $self->save_project_value("@narr", $value);
- push(@$arr, $value);
- }
-
- ## Always push the array back onto the project_info
- push(@$pi, $arr);
-
- return $value;
-}
-
-
-sub get_verbatim {
- my($self) = shift;
- my($marker) = shift;
- my($str) = undef;
- my($thash) = $self->{'verbatim'}->{$self->{'pctype'}};
-
- if (defined $thash) {
- if (defined $thash->{$marker}) {
- my($crlf) = $self->crlf();
- foreach my $line (@{$thash->{$marker}}) {
- if (!defined $str) {
- $str = '';
- }
- $str .= $self->process_special($line) . $crlf;
- }
- if (defined $str) {
- $str .= $crlf;
- }
- }
- }
- return $str;
-}
-
-
-sub generate_recursive_input_list {
- my($self) = shift;
- my($dir) = shift;
- return $self->extension_recursive_input_list($dir,
- $ProjectCreatorExtension);
-}
-
-# ************************************************************
-# Virtual Methods To Be Overridden
-# ************************************************************
-
-sub specific_lookup {
- #my($self) = shift;
- #my($key) = shift;
- return undef;
-}
-
-
-sub save_project_value {
- #my($self) = shift;
- #my($name) = shift;
- #my($value) = shift;
-}
-
-
-sub get_type_append {
- #my($self) = shift;
- return '';
-}
-
-
-sub translate_value {
- my($self) = shift;
- my($key) = shift;
- my($val) = shift;
-
- if ($key eq 'depends' && $val ne '') {
- my($arr) = $self->create_array($val);
- $val = '';
- foreach my $entry (@$arr) {
- $val .= '"' . $self->project_file_name($entry) . '" ';
- }
- $val =~ s/\s+$//;
- }
- return $val;
-}
-
-
-sub fill_value {
- #my($self) = shift;
- #my($name) = shift;
- return undef;
-}
-
-
-sub separate_static_project {
- #my($self) = shift;
- return 0;
-}
-
-
-sub project_file_name {
- #my($self) = shift;
- return undef;
-}
-
-
-sub static_project_file_name {
- #my($self) = shift;
- return undef;
-}
-
-
-sub override_valid_component_extensions {
- #my($self) = shift;
- #my($comp) = shift;
- return undef;
-}
-
-
-sub override_exclude_component_extensions {
- #my($self) = shift;
- #my($comp) = shift;
- return undef;
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return undef;
-}
-
-
-sub get_lib_exe_template_input_file {
- #my($self) = shift;
- return undef;
-}
-
-
-sub get_lib_template_input_file {
- #my($self) = shift;
- return undef;
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return undef;
-}
-
-
-sub get_template {
- #my($self) = shift;
- return undef;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/StringProcessor.pm b/bin/MakeProjectCreator/modules/StringProcessor.pm
deleted file mode 100644
index 9bb05eb5665..00000000000
--- a/bin/MakeProjectCreator/modules/StringProcessor.pm
+++ /dev/null
@@ -1,106 +0,0 @@
-package StringProcessor;
-
-# ************************************************************
-# Description : Perform various algorithms on strings
-# Author : Chad Elliott
-# Create Date : 3/07/2003
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($self) = bless {
- }, $class;
- return $self;
-}
-
-
-sub extractType {
- my($self) = shift;
- my($name) = shift;
- my($type) = $name;
-
- if ($name =~ /(.*)(Project|Workspace)Creator/) {
- $type = $1;
- }
-
- return lc($type);
-}
-
-
-sub process_special {
- my($self) = shift;
- my($line) = shift;
- my($length) = length($line);
-
- for(my $i = 0; $i < $length; $i++) {
- my($ch) = substr($line, $i, 1);
- if ($ch eq "\\" && $i + 1 < $length) {
- substr($line, $i, 1) = '';
- $length--;
- }
- elsif ($ch eq '"') {
- substr($line, $i, 1) = '';
- $length--;
- $i--;
- }
- }
- return $line;
-}
-
-
-sub create_array {
- my($self) = shift;
- my($line) = shift;
- my(@array) = ();
- my($length) = length($line);
- my($prev) = 0;
- my($double) = 0;
- my($single) = 0;
-
- for(my $i = 0; $i <= $length; $i++) {
- my($ch) = substr($line, $i, 1);
- if (!$double && !$single && ($ch eq '' || $ch =~ /\s/)) {
- my($val) = substr($line, $prev, $i - $prev);
- $val =~ s/^\s+//;
- $val =~ s/\s+$//;
- if ($val =~ /^\"(.*)\"$/) {
- $val = $1;
- }
- elsif ($val =~ /^\'(.*)\'$/) {
- $val = $1;
- }
- push(@array, $val);
- for(; $i < $length; $i++) {
- if (substr($line, $i, 1) !~ /\s/) {
- $i--;
- last;
- }
- }
- $prev = $i + 1;
- }
- elsif ($double && $ch eq "\\" && $i + 1 < $length) {
- substr($line, $i, 1) = '';
- $length--;
- }
- elsif ($ch eq '"') {
- $double ^= 1;
- }
- elsif ($ch eq "'") {
- $single ^= 1;
- }
- }
- return \@array;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/TemplateInputReader.pm b/bin/MakeProjectCreator/modules/TemplateInputReader.pm
deleted file mode 100644
index 40f663ca253..00000000000
--- a/bin/MakeProjectCreator/modules/TemplateInputReader.pm
+++ /dev/null
@@ -1,143 +0,0 @@
-package TemplateInputReader;
-
-# ************************************************************
-# Description : Reads the template input and stores the values
-# Author : Chad Elliott
-# Create Date : 5/16/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use Parser;
-
-use vars qw(@ISA);
-@ISA = qw(Parser);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($mpt) = 'mpt';
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($inc) = shift;
- my($self) = Parser::new($class, $inc);
-
- $self->{'values'} = {};
- $self->{'cindex'} = 0;
- $self->{'current'} = [ $self->{'values'} ];
-
- return $self;
-}
-
-
-sub parse_line {
- my($self) = shift;
- my($ih) = shift;
- my($line) = shift;
- my($status) = 1;
- my($errorString) = '';
- my($current) = $self->{'current'};
-
- if ($line eq '') {
- }
- elsif ($line =~ /^([\w\s]+)\s*{$/) {
- ## Entering a new scope
- my($name) = $1;
- $name =~ s/\s+$//;
- if (!defined $$current[$self->{'cindex'}]->{$name}) {
- $$current[$self->{'cindex'}]->{$name} = {};
- }
- push(@$current, $$current[$self->{'cindex'}]->{$name});
- $self->{'cindex'}++;
- }
- elsif ($line =~ /^}$/) {
- if ($self->{'cindex'} > 0) {
- pop(@$current);
- $self->{'cindex'}--;
- }
- else {
- $status = 0;
- $errorString = 'ERROR: Unmatched curly brace';
- }
- }
- elsif ($line =~ /^(\w+)\s*(\+=|=)\s*(.*)?/) {
- my($name) = $1;
- my($op) = $2;
- my($value) = $3;
-
- if (defined $value) {
- $value = $self->create_array($value);
- }
- else {
- $value = '';
- }
-
- if ($op eq '+=') {
- my($ref) = $$current[$self->{'cindex'}]->{$name};
- if (defined $ref) {
- if (UNIVERSAL::isa($ref, 'ARRAY')) {
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- push(@$ref, @$value);
- }
- else {
- push(@$ref, $value);
- }
- }
- else {
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- $$current[$self->{'cindex'}]->{$name} .= " @$value";
- }
- else {
- $$current[$self->{'cindex'}]->{$name} .= $value;
- }
- }
- }
- else {
- $$current[$self->{'cindex'}]->{$name} = $value;
- }
- }
- else {
- if (!$$current[$self->{'cindex'}]->{$name}) {
- $$current[$self->{'cindex'}]->{$name} = $value;
- }
- else {
- $status = 0;
- $errorString = "ERROR: Redifinition of '$name'";
- }
- }
- }
- elsif ($line =~ /^conditional_include\s+"([\w\s\-\+\/\\\.]+)"$/) {
- my($file) = $self->search_include_path("$1.$mpt");
- if (defined $file) {
- my($ol) = $self->{'line_number'};
- ($status, $errorString) = $self->read_file($file);
- $self->{'line_number'} = $ol;
- }
- }
- else {
- $status = 0;
- $errorString = "ERROR: Unrecognized line: $line";
- }
-
- return $status, $errorString;
-}
-
-
-sub get_value {
- my($self) = shift;
- my($tag) = shift;
- return $self->{'values'}->{$tag};
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/TemplateParser.pm b/bin/MakeProjectCreator/modules/TemplateParser.pm
deleted file mode 100644
index 386299532c0..00000000000
--- a/bin/MakeProjectCreator/modules/TemplateParser.pm
+++ /dev/null
@@ -1,1008 +0,0 @@
-package TemplateParser;
-
-# ************************************************************
-# Description : Parses the template and fills in missing values
-# Author : Chad Elliott
-# Create Date : 5/17/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use Parser;
-
-use vars qw(@ISA);
-@ISA = qw(Parser);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my(%keywords) = ('if' => 1,
- 'else' => 1,
- 'endif' => 1,
- 'noextension' => 1,
- 'dirname' => 1,
- 'basename' => 1,
- 'basenoextension' => 1,
- 'foreach' => 1,
- 'forfirst' => 1,
- 'fornotfirst' => 1,
- 'fornotlast' => 1,
- 'forlast' => 1,
- 'endfor' => 1,
- 'comment' => 1,
- 'flag_overrides' => 1,
- 'marker' => 1,
- );
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($prjc) = shift;
- my($self) = Parser::new($class);
-
- $self->{'prjc'} = $prjc;
- $self->{'ti'} = $prjc->get_template_input();
- $self->{'crlf'} = undef;
- $self->{'values'} = {};
- $self->{'defaults'} = {};
- $self->{'lines'} = [];
- $self->{'built'} = '';
- $self->{'sstack'} = [];
- $self->{'lstack'} = [];
- $self->{'if_skip'} = 0;
-
- $self->{'foreach'} = {};
- $self->{'foreach'}->{'count'} = -1;
- $self->{'foreach'}->{'nested'} = 0;
- $self->{'foreach'}->{'name'} = [];
- $self->{'foreach'}->{'names'} = [];
- $self->{'foreach'}->{'text'} = [];
- $self->{'foreach'}->{'scope'} = [];
- $self->{'foreach'}->{'temp_scope'} = [];
- $self->{'foreach'}->{'processing'} = 0;
-
- return $self;
-}
-
-
-sub basename {
- my($self) = shift;
- my($file) = shift;
- for(my $i = length($file) - 1; $i >= 0; --$i) {
- my($ch) = substr($file, $i, 1);
- if ($ch eq '/' || $ch eq '\\') {
- ## The template file may use this value (<%basename_found%>)
- ## to determine whether a basename removed the directory or not
- $self->{'values'}->{'basename_found'} = 1;
- return substr($file, $i + 1);
- }
- }
- delete $self->{'values'}->{'basename_found'};
- return $file;
-}
-
-
-sub dirname {
- my($self) = shift;
- my($file) = shift;
- for(my $i = length($file) - 1; $i != 0; --$i) {
- my($ch) = substr($file, $i, 1);
- if ($ch eq '/' || $ch eq '\\') {
- ## The template file may use this value (<%dirname_found%>)
- ## to determine whether a dirname removed the basename or not
- $self->{'values'}->{'dirname_found'} = 1;
- return substr($file, 0, $i);
- }
- }
- delete $self->{'values'}->{'dirname_found'};
- return '.';
-}
-
-
-sub strip_line {
- my($self) = shift;
- my($line) = shift;
-
- ## Override strip_line() from Parser.
- ## We need to preserve leading space and
- ## there is no comment string in templates.
- ++$self->{'line_number'};
- $line =~ s/\s+$//;
-
- return $line;
-}
-
-
-## Append the current value to the line that is being
-## built. This line may be a foreach line or a general
-## line without a foreach.
-sub append_current {
- my($self) = shift;
- my($value) = shift;
- my($index) = $self->{'foreach'}->{'count'};
-
- if ($index >= 0) {
- $self->{'foreach'}->{'text'}->[$index] .= $value;
- }
- else {
- $self->{'built'} .= $value;
- }
-}
-
-
-sub adjust_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = shift;
-
- ## Perform any additions, subtractions
- ## or overrides for the template values.
- my($addtemp) = $self->{'prjc'}->get_addtemp();
- foreach my $at (keys %$addtemp) {
- if ($at eq $name) {
- my($val) = $$addtemp{$at};
- if ($$val[0] > 0) {
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- $value = [ $$val[1], @$value ];
- }
- else {
- $value = "$$val[1] $value";
- }
- }
- elsif ($$val[0] < 0) {
- my($parts) = undef;
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- my(@copy) = @$value;
- $parts = \@copy;
- }
- else {
- $parts = $self->create_array($value);
- }
-
- $value = '';
- foreach my $part (@$parts) {
- if ($part ne $$val[1] && $part ne '') {
- $value .= "$part ";
- }
- }
- $value =~ s/^\s+//;
- $value =~ s/\s+$//;
- }
- else {
- $value = $$val[1];
- }
- }
- }
-
- return $value;
-}
-
-
-sub set_current_values {
- my($self) = shift;
- my($name) = shift;
- my($set) = 0;
-
- ## If any value within a foreach matches the name
- ## of a hash table within the template input we will
- ## set the values of that hash table in the current scope
- if (defined $self->{'ti'}) {
- my($counter) = $self->{'foreach'}->{'count'};
- if ($counter >= 0) {
- my($value) = $self->{'ti'}->get_value($name);
- if (defined $value && UNIVERSAL::isa($value, 'HASH')) {
- my(%copy) = ();
- foreach my $key (keys %$value) {
- $copy{$key} = $self->adjust_value($key, $$value{$key});
- }
- $self->{'foreach'}->{'temp_scope'}->[$counter] = \%copy;
- $set = 1;
- }
- }
- }
- return $set;
-}
-
-
-sub relative {
- my($self) = shift;
- my($value) = shift;
- my($rel) = $self->{'prjc'}->get_relative();
- my(@keys) = keys %$rel;
-
- if (defined $value && defined $keys[0] && $value =~ /\$/) {
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- my(@built) = ();
- foreach my $val (@$value) {
- push(@built, $self->relative($val));
- }
- $value = \@built;
- }
- else {
- my($cwd) = $self->getcwd();
- my($start) = 0;
- my($fixed) = 0;
-
- if ($cwd =~ /[a-z]:[\/\\]/) {
- substr($cwd, 0, 1) = uc(substr($cwd, 0, 1));
- }
-
- while(substr($value, $start) =~ /(\$\(([^)]+)\))/) {
- my($whole) = $1;
- my($name) = $2;
- my($val) = $$rel{$name};
-
- if (defined $val) {
- if ($^O eq 'cygwin' && !$fixed &&
- $cwd !~ /[A-Za-z]:/ && $val =~ /[A-Za-z]:/) {
- my($cyg) = `cygpath -w $cwd`;
- if (defined $cyg) {
- $cyg =~ s/\\/\//g;
- chop($cwd = $cyg);
- $fixed = 1;
- }
- }
-
- ## Fix up the value for Windows (capitalize the drive and
- ## switch the \\'s to /
- $val =~ s/\\/\//g;
- if ($val =~ /[a-z]:\//) {
- substr($val, 0, 1) = uc(substr($val, 0, 1));
- }
-
- if (index($cwd, $val) == 0) {
- my($count) = 0;
- my($current) = $cwd;
- substr($current, 0, length($val)) = '';
- while($current =~ /^\\/) {
- $current =~ s/^\///;
- }
- my($length) = length($current);
- for(my $i = 0; $i < $length; ++$i) {
- if (substr($current, $i, 1) eq '/') {
- ++$count;
- }
- }
- $val = '../' x $count;
- $val =~ s/\/$//;
- if ($self->{'prjc'}->convert_slashes()) {
- $val = $self->slash_to_backslash($val);
- }
- substr($value, $start) =~ s/\$\([^)]+\)/$val/;
- $whole = $val;
- }
- }
- $start += length($whole);
- }
- }
- }
-
- return $value;
-}
-
-
-sub get_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
- my($counter) = $self->{'foreach'}->{'count'};
-
- ## First, check the temporary scope (set inside a foreach)
- if ($counter >= 0) {
- while(!defined $value && $counter >= 0) {
- $value = $self->{'foreach'}->{'temp_scope'}->[$counter]->{$name};
- --$counter;
- }
- $counter = $self->{'foreach'}->{'count'};
- }
-
- if (!defined $value) {
- ## Next, check for a template value
- my($ti) = $self->{'ti'};
- if (defined $ti) {
- $value = $ti->get_value($name);
- if (defined $value) {
- $value = $self->adjust_value($name, $value);
- }
- }
-
- if (!defined $value) {
- ## Next, check the inner to outer foreach
- ## scopes for overriding values
- while(!defined $value && $counter >= 0) {
- $value = $self->{'foreach'}->{'scope'}->[$counter]->{$name};
- --$counter;
- }
-
- ## Then get the value from the project creator
- if (!defined $value) {
- $value = $self->{'prjc'}->get_assignment($name);
-
- ## Then get it from our known values
- if (!defined $value) {
- $value = $self->{'values'}->{$name};
- if (!defined $value) {
- ## Call back onto the project creator to allow
- ## it to fill in the value before defaulting to undef.
- $value = $self->{'prjc'}->fill_value($name);
- }
- }
- }
- }
- }
-
- return $self->relative($value);
-}
-
-
-sub get_value_with_default {
- my($self) = shift;
- my($name) = shift;
- my($value) = $self->get_value($name);
-
- if (defined $value) {
- if (UNIVERSAL::isa($value, 'ARRAY')) {
- $value = "@$value";
- }
- }
- else {
- $value = $self->{'defaults'}->{$name};
- if (!defined $value) {
-# print "DEBUG: WARNING: $name defaulting to empty string\n";
- $value = '';
- }
- else {
-# print "DEBUG: WARNING: $name using default value of $value\n";
- $value = $self->adjust_value($name, $value);
- }
- $value = $self->relative($value);
- }
-
- return $value;
-}
-
-
-sub process_foreach {
- my($self) = shift;
- my($index) = $self->{'foreach'}->{'count'};
- my($text) = $self->{'foreach'}->{'text'}->[$index];
- my($status) = 1;
- my($errorString) = '';
- my(@values) = ();
- my($names) = $self->create_array($self->{'foreach'}->{'names'}->[$index]);
- my($name) = $self->{'foreach'}->{'name'}->[$index];
-
- foreach my $n (@$names) {
- my($vals) = $self->get_value($n);
- if (defined $vals && $vals ne '') {
- if (!UNIVERSAL::isa($vals, 'ARRAY')) {
- $vals = $self->create_array($vals);
- }
- push(@values, @$vals);
- }
- if (!defined $name) {
- $name = $n;
- $name =~ s/s$//;
- }
- }
-
- ## Reset the text (it will be regenerated by calling parse_line
- $self->{'foreach'}->{'text'}->[$index] = '';
-
- if (defined $values[0]) {
- my($scope) = $self->{'foreach'}->{'scope'}->[$index];
-
- $$scope{'forlast'} = 0;
- $$scope{'fornotlast'} = 1;
- $$scope{'forfirst'} = 1;
- $$scope{'fornotfirst'} = 0;
-
- ## If the foreach values are mixed (HASH and SCALAR), then
- ## remove the SCALAR values.
- my($pset) = undef;
- for(my $i = 0; $i <= $#values; ++$i) {
- my($set) = $self->set_current_values($values[$i]);
- if (!defined $pset) {
- $pset |= $set;
- }
- else {
- if ($pset && !$set) {
- splice(@values, $i, 1);
- $i = 0;
- $pset = undef;
- }
- }
- }
-
- for(my $i = 0; $i <= $#values; ++$i) {
- my($value) = $values[$i];
-
- ## Set the corresponding values in the temporary scope
- $self->set_current_values($value);
-
- ## Set the special values that only exist
- ## within a foreach
- if ($i != 0) {
- $$scope{'forfirst'} = 0;
- $$scope{'fornotfirst'} = 1;
- }
- if ($i == $#values) {
- $$scope{'forlast'} = 1;
- $$scope{'fornotlast'} = 0;
- }
- ## We don't use adjust_value here because these names
- ## are generated from a foreach and should not be adjusted.
- $$scope{$name} = $value;
-
- ## A tiny hack for VC7
- if ($name eq 'configuration') {
- $self->{'prjc'}->update_project_info($self, 1,
- ['configuration', 'platform'],
- '|');
- }
-
- ## Now parse the line of text, each time
- ## with different values
- ++$self->{'foreach'}->{'processing'};
- ($status, $errorString) = $self->parse_line(undef, $text);
- --$self->{'foreach'}->{'processing'};
- if (!$status) {
- last;
- }
- }
- }
-
- return $status, $errorString;
-}
-
-
-sub handle_end {
- my($self) = shift;
- my($name) = shift;
- my($status) = 1;
- my($errorString) = '';
- my($end) = pop(@{$self->{'sstack'}});
- pop(@{$self->{'lstack'}});
-
- if (!defined $end) {
- $status = 0;
- $errorString = "ERROR: Unmatched $name\n";
- }
- elsif ($end eq 'endif') {
- $self->{'if_skip'} = 0;
- }
- elsif ($end eq 'endfor') {
- my($index) = $self->{'foreach'}->{'count'};
- ($status, $errorString) = $self->process_foreach();
- if ($status) {
- --$self->{'foreach'}->{'count'};
- $self->append_current($self->{'foreach'}->{'text'}->[$index]);
- }
- }
-
- return $status, $errorString;
-}
-
-
-sub get_flag_overrides {
- my($self) = shift;
- my($name) = shift;
- my($type) = shift;
- my($value) = undef;
- my($file) = $self->get_value($name);
- my($prjc) = $self->{'prjc'};
- my($fo) = $prjc->{'flag_overrides'};
-
- foreach my $key (keys %$fo) {
- if ($key =~ /^$name/) {
- foreach my $of (keys %{$$fo{$key}}) {
- my($cv) = $of;
- if ($prjc->convert_slashes()) {
- $cv = $prjc->slash_to_backslash($of);
- }
- if ($cv eq $file) {
- foreach my $ma (keys %{$prjc->{'matching_assignments'}}) {
- if ($ma eq $key) {
- foreach my $aname (@{$prjc->{'matching_assignments'}->{$ma}}) {
- if ($aname eq $type &&
- defined $$fo{$key}->{$of}->{$aname}) {
- $value = $$fo{$key}->{$of}->{$aname};
- last;
- }
- }
- last;
- }
- }
- last;
- }
- }
- last;
- }
- }
- return $value;
-}
-
-
-sub handle_if {
- my($self) = shift;
- my($val) = shift;
- my($name) = 'endif';
-
- push(@{$self->{'lstack'}}, $self->line_number() . " $val");
- if (!$self->{'if_skip'}) {
- my($true) = 1;
- push(@{$self->{'sstack'}}, $name);
- if ($val =~ /^!(.*)/) {
- $val = $1;
- $val =~ s/^\s+//;
- $true = 0;
- }
-
- if ($val =~ /flag_overrides\(([^\)]+),\s*([^\)]+)\)/) {
- $val = $self->get_flag_overrides($1, $2);
- }
- else {
- $val = $self->get_value($val)
- }
-
- if (!defined $val) {
- $self->{'if_skip'} = $true;
- }
- else {
- $self->{'if_skip'} = !$true;
- }
- }
- else {
- push(@{$self->{'sstack'}}, "*$name");
- }
-}
-
-
-sub handle_else {
- my($self) = shift;
- my(@scopy) = @{$self->{'sstack'}};
-
- ## This method does not take into account that
- ## multiple else clauses could be supplied to a single if.
- ## Someday, this may be fixed.
- if (defined $scopy[$#scopy] && $scopy[$#scopy] eq 'endif') {
- $self->{'if_skip'} ^= 1;
- }
-}
-
-
-sub handle_foreach {
- my($self) = shift;
- my($val) = shift;
- my($name) = 'endfor';
-
- push(@{$self->{'lstack'}}, $self->line_number());
- if (!$self->{'if_skip'}) {
- my($vname) = undef;
- if ($val =~ /([^,]+),(.*)/) {
- $vname = $1;
- $val = $2;
- $vname =~ s/^\s+//;
- $vname =~ s/\s+$//;
- $val =~ s/^\s+//;
- $val =~ s/\s+$//;
- }
-
- push(@{$self->{'sstack'}}, $name);
- ++$self->{'foreach'}->{'count'};
-
- my($index) = $self->{'foreach'}->{'count'};
- $self->{'foreach'}->{'name'}->[$index] = $vname;
- $self->{'foreach'}->{'names'}->[$index] = $val;
- $self->{'foreach'}->{'text'}->[$index] = '';
- $self->{'foreach'}->{'scope'}->[$index] = {};
- }
- else {
- push(@{$self->{'sstack'}}, "*$name");
- }
-}
-
-
-sub handle_special {
- my($self) = shift;
- my($name) = shift;
- my($val) = shift;
-
- ## If $name (fornotlast, forfirst, etc.) is set to 1
- ## Then we append the $val onto the current string that's
- ## being built.
- if ($self->get_value($name)) {
- $self->append_current($val);
- }
-}
-
-
-sub handle_noextension {
- my($self) = shift;
- my($name) = shift;
-
- if (!$self->{'if_skip'}) {
- my($val) = $self->get_value_with_default($name);
- $val =~ s/\.[^\.]+$//;
- $self->append_current($val);
- }
-}
-
-
-sub handle_dirname {
- my($self) = shift;
- my($name) = shift;
-
- if (!$self->{'if_skip'}) {
- my($val) = $self->dirname($self->get_value_with_default($name));
- $self->append_current($val);
- }
-}
-
-
-sub handle_basename {
- my($self) = shift;
- my($name) = shift;
-
- if (!$self->{'if_skip'}) {
- my($val) = $self->basename($self->get_value_with_default($name));
- $self->append_current($val);
- }
-}
-
-
-sub handle_basenoextension {
- my($self) = shift;
- my($name) = shift;
-
- if (!$self->{'if_skip'}) {
- my($val) = $self->basename($self->get_value_with_default($name));
- $val =~ s/\.[^\.]+$//;
- $self->append_current($val);
- }
-}
-
-
-sub handle_flag_overrides {
- my($self) = shift;
- my($name) = shift;
- my($type) = '';
-
- ($name, $type) = split(/,\s*/, $name);
-
- if (!$self->{'if_skip'}) {
- my($value) = $self->get_flag_overrides($name, $type);
- if (defined $value) {
- $self->append_current($value);
- }
- }
-}
-
-
-sub handle_marker {
- my($self) = shift;
- my($name) = shift;
-
- if (!$self->{'if_skip'}) {
- my($value) = $self->{'prjc'}->get_verbatim($name);
- if (defined $value) {
- $self->append_current($value);
- }
- }
-}
-
-
-## Given a line that starts with an identifier, we split
-## then name from the possible value stored inside ()'s and
-## we stop looking at the line when we find the %> ending
-sub split_name_value {
- my($self) = shift;
- my($line) = shift;
- my($length) = length($line);
- my($name) = undef;
- my($val) = undef;
-
- for(my $i = 0; $i < $length; ++$i) {
- my($ch) = substr($line, $i, 1);
- if (!defined $name && $ch eq '(') {
- $name = substr($line, 0, $i);
- $val = '';
- }
- elsif (!defined $name && $ch eq '%') {
- if (substr($line, $i + 1, 1) eq '>') {
- $name = substr($line, 0, $i);
- last;
- }
- }
- elsif (defined $val && $ch ne ')') {
- $val .= $ch;
- }
- elsif (defined $val && $ch eq ')') {
- if (substr($line, $i + 1, 2) eq '%>') {
- last;
- }
- else {
- $val .= $ch;
- }
- }
- }
-
- return $name, $val;
-}
-
-
-sub process_name {
- my($self) = shift;
- my($line) = shift;
- my($length) = 0;
- my($status) = 1;
- my($errorString) = '';
-
- if ($line eq '') {
- }
- elsif ($line =~ /^(\w+)(\(([^\)]+|\".*\"|flag_overrides\([^\)]+,\s*[^\)]+\))\))?%>/) {
- my($name, $val) = $self->split_name_value($line);
-
- $length += length($name);
- if (defined $val) {
- $length += length($val) + 2;
- }
-
- if (defined $keywords{$name}) {
- if ($name eq 'endif' || $name eq 'endfor') {
- ($status, $errorString) = $self->handle_end($name);
- }
- elsif ($name eq 'if') {
- $self->handle_if($val);
- }
- elsif ($name eq 'else') {
- $self->handle_else();
- }
- elsif ($name eq 'foreach') {
- $self->handle_foreach($val);
- }
- elsif ($name eq 'fornotlast' || $name eq 'forlast' ||
- $name eq 'fornotfirst' || $name eq 'forfirst') {
- $self->handle_special($name, $self->process_special($val));
- }
- elsif ($name eq 'comment') {
- ## Ignore the contents of the comment
- }
- elsif ($name eq 'flag_overrides') {
- $self->handle_flag_overrides($val);
- }
- elsif ($name eq 'marker') {
- $self->handle_marker($val);
- }
- elsif ($name eq 'noextension') {
- $self->handle_noextension($val);
- }
- elsif ($name eq 'dirname') {
- $self->handle_dirname($val);
- }
- elsif ($name eq 'basename') {
- $self->handle_basename($val);
- }
- elsif ($name eq 'basenoextension') {
- $self->handle_basenoextension($val);
- }
- }
- else {
- if (!$self->{'if_skip'}) {
- if (defined $val && !defined $self->{'defaults'}->{$name}) {
- $self->{'defaults'}->{$name} = $self->process_special($val);
- }
-
- $val = $self->get_value_with_default($name);
- $self->append_current($val);
- }
- }
- }
- else {
- my($error) = $line;
- my($length) = length($line);
- for(my $i = 0; $i < $length; ++$i) {
- my($part) = substr($line, $i, 2);
- if ($part eq '%>') {
- $error = substr($line, 0, $i + 2);
- last;
- }
- }
- $status = 0;
- $errorString = "ERROR: Unable to parse line starting at $error";
- }
-
- return $status, $errorString, $length;
-}
-
-
-sub collect_data {
- my($self) = shift;
- my($prjc) = $self->{'prjc'};
-
- ## Save crlf so we don't have to keep going back to the prjc
- $self->{'crlf'} = $prjc->crlf();
-
- ## Collect the components into {'values'} somehow
- foreach my $key (keys %{$prjc->{'valid_components'}}) {
- my(@list) = $prjc->get_component_list($key);
- if (defined $list[0]) {
- $self->{'values'}->{$key} = "@list";
- }
- }
-
- ## A tiny hack (mainly for VC6 projects)
- ## for the workspace generator. It needs to know the
- ## target names to match up with the project name.
- $prjc->update_project_info($self, 0, ['project_name']);
-
- ## This is for all projects
- $prjc->update_project_info($self, 1, ['depends']);
-
- ## VC7 Projects need to know the GUID.
- ## We need to save this value in our known values
- ## since each guid generated will be different. We need
- ## this to correspond to the same guid used in the workspace.
- my($guid) = $prjc->update_project_info($self, 1, ['guid']);
- $self->{'values'}->{'guid'} = $guid;
-}
-
-
-sub is_only_keyword {
- my($self) = shift;
- my($line) = shift;
-
- ## Does the line contain only a keyword?
- if ($line =~ /^<%(.*)%>$/) {
- my($part) = $1;
- if ($part !~ /%>/) {
- $part =~ s/\(.*//;
- return (defined $keywords{$part} ? 1 : 0);
- }
- }
- return 0;
-}
-
-
-sub parse_line {
- my($self) = shift;
- my($ih) = shift;
- my($line) = shift;
- my($status) = 1;
- my($errorString) = '';
- my($length) = length($line);
- my($name) = 0;
- my($crlf) = $self->{'crlf'};
- my($clen) = length($crlf);
- my($startempty) = ($line eq '' ? 1 : 0);
- my($append_name) = 0;
-
- ## If processing a foreach or the line only
- ## contains a keyword, then we do
- ## not need to add a newline to the end.
- if ($self->{'foreach'}->{'processing'} == 0 &&
- !$self->is_only_keyword($line)) {
- $line .= $crlf;
- $length += $clen;
- }
-
- if ($self->{'foreach'}->{'count'} < 0) {
- $self->{'built'} = '';
- }
-
- for(my $i = 0; $i < $length; ++$i) {
- my($part) = substr($line, $i, 2);
- if ($part eq '<%') {
- ++$i;
- $name = 1;
- }
- elsif ($part eq '%>') {
- ++$i;
- $name = 0;
- if ($append_name) {
- $append_name = 0;
- if (!$self->{'if_skip'}) {
- $self->append_current($part);
- }
- }
- }
- elsif ($name) {
- my($substr) = substr($line, $i);
- my($efcheck) = ($substr =~ /^endfor\%\>/);
- my($focheck) = ($substr =~ /^foreach\(/);
-
- if ($focheck && $self->{'foreach'}->{'count'} >= 0) {
- ++$self->{'foreach'}->{'nested'};
- }
-
- if ($self->{'foreach'}->{'count'} < 0 ||
- $self->{'foreach'}->{'processing'} > $self->{'foreach'}->{'nested'} ||
- (($efcheck || $focheck) &&
- $self->{'foreach'}->{'nested'} == $self->{'foreach'}->{'processing'})) {
- my($nlen) = 0;
- ($status,
- $errorString,
- $nlen) = $self->process_name($substr);
-
- if ($status && $nlen == 0) {
- $errorString = "ERROR: Could not parse this line at column $i";
- $status = 0;
- }
- if (!$status) {
- last;
- }
-
- $i += ($nlen - 1);
- }
- else {
- $name = 0;
- if (!$self->{'if_skip'}) {
- $self->append_current('<%' . substr($line, $i, 1));
- $append_name = 1;
- }
- }
-
- if ($efcheck && $self->{'foreach'}->{'nested'} > 0) {
- --$self->{'foreach'}->{'nested'};
- }
- }
- else {
- if (!$self->{'if_skip'}) {
- $self->append_current(substr($line, $i, 1));
- }
- }
- }
-
- if ($self->{'foreach'}->{'count'} < 0) {
- ## If the line started out empty and we're not
- ## skipping from the start or the built up line is not empty
- if ($startempty ||
- ($self->{'built'} ne $crlf && $self->{'built'} ne '')) {
- push(@{$self->{'lines'}}, $self->{'built'});
- }
- }
-
- return $status, $errorString;
-}
-
-
-sub parse_file {
- my($self) = shift;
- my($input) = shift;
-
- $self->collect_data();
- my($status, $errorString) = $self->read_file($input);
-
- if ($status) {
- my($sstack) = $self->{'sstack'};
- if (defined $$sstack[0]) {
- my($lstack) = $self->{'lstack'};
- $status = 0;
- $errorString = "ERROR: missing an $$sstack[0] starting at $$lstack[0]";
- }
- }
-
- if (!$status) {
- my($linenumber) = $self->line_number();
- $errorString = "$input: line $linenumber: $errorString\n";
- }
-
- return $status, $errorString;
-}
-
-
-sub get_lines {
- my($self) = shift;
- return $self->{'lines'};
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VA4ProjectCreator.pm b/bin/MakeProjectCreator/modules/VA4ProjectCreator.pm
deleted file mode 100644
index 942be40a726..00000000000
--- a/bin/MakeProjectCreator/modules/VA4ProjectCreator.pm
+++ /dev/null
@@ -1,129 +0,0 @@
-package VA4ProjectCreator;
-
-# ************************************************************
-# Description : A VA4 Project Creator
-# Author : Chad Elliott
-# Create Date : 7/8/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($sname) = '_Static';
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub translate_value {
- my($self) = shift;
- my($key) = shift;
- my($val) = shift;
-
- if ($key eq 'depends' && $val ne '') {
- my($wt) = $self->get_writing_type();
- my($arr) = $self->create_array($val);
- $val = '';
- foreach my $entry (@$arr) {
- $val .= '"' . ($wt == 1 ? $self->static_project_file_name($entry) :
- $self->project_file_name($entry)) . '" ';
- }
- $val =~ s/\s+$//;
- }
- return $val;
-}
-
-
-sub convert_slashes {
- #my($self) = shift;
- return 0;
-}
-
-
-sub file_sorter {
- my($self) = shift;
- my($left) = shift;
- my($right) = shift;
- return lc($left) cmp lc($right);
-}
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub separate_static_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return "$name.icc";
-}
-
-
-sub static_project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return "$name$sname.icc";
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'va4iccdllexe';
-}
-
-
-sub get_lib_exe_template_input_file {
- #my($self) = shift;
- return 'va4icclibexe';
-}
-
-
-sub get_lib_template_input_file {
- #my($self) = shift;
- return 'va4icclib';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'va4iccdll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'va4icc';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VA4WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/VA4WorkspaceCreator.pm
deleted file mode 100644
index 53b649696be..00000000000
--- a/bin/MakeProjectCreator/modules/VA4WorkspaceCreator.pm
+++ /dev/null
@@ -1,76 +0,0 @@
-package VA4WorkspaceCreator;
-
-# ************************************************************
-# Description : A VA4 Workspace Creator
-# Author : Chad Elliott
-# Create Date : 5/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use VA4ProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_workspace_name() . '.icp';
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "// Visual Age C++ 4 workspace file$crlf$crlf";
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- foreach my $project (@list) {
- my($base) = $project;
- $base =~ s/\.[^\.]+//;
- my($ics) = "$base.ics";
-
- print $fh "subproject $base icc \"$project\", ics \"$ics\"$crlf" .
- "{$crlf" .
- "}$crlf";
- }
-
- print $fh "build buildAll$crlf" .
- "{$crlf";
- foreach my $project (@list) {
- my($base) = $project;
- $base =~ s/\.[^\.]+//;
- print $fh " use $base$crlf";
- }
- print $fh "}$crlf$crlf";
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VC6ProjectCreator.pm b/bin/MakeProjectCreator/modules/VC6ProjectCreator.pm
deleted file mode 100644
index f2d4fccdeab..00000000000
--- a/bin/MakeProjectCreator/modules/VC6ProjectCreator.pm
+++ /dev/null
@@ -1,229 +0,0 @@
-package VC6ProjectCreator;
-
-# ************************************************************
-# Description : A VC6 Project Creator
-# Author : Chad Elliott
-# Create Date : 3/14/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($dynamiclib) = 'DLL';
-my($staticlib) = 'LIB';
-my($dynamicexe) = 'EXE';
-my($staticexe) = 'Static EXE';
-my($sname) = '_Static';
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub remove_type_append {
- my($self) = shift;
- my($str) = shift;
-
- foreach my $type ($staticexe, $dynamicexe, $staticlib, $dynamiclib) {
- if ($str =~ /(.*)\s+$type$/) {
- $str = $1;
- last;
- }
- }
-
- return $str;
-}
-
-
-sub base_project_name {
- my($self) = shift;
- return $self->transform_file_name(
- $self->remove_type_append($self->project_name()) .
- ($self->get_writing_type() == 1 ? $sname : ''));
-}
-
-
-sub get_static_append {
- #my($self) = shift;
- return $sname;
-}
-
-
-sub get_type_append {
- my($self) = shift;
- my($type) = '';
- if ($self->lib_target()) {
- ## Set the type_append preserving whitespace
- if ($self->get_writing_type() == 1) {
- $type = " $staticlib";
- }
- else {
- $type = " $dynamiclib";
- }
- }
- else {
- ## Set the type_append preserving whitespace
- if ($self->get_writing_type() == 1) {
- $type = " $staticexe";
- }
- else {
- $type = " $dynamicexe";
- }
- }
- return $type;
-}
-
-
-sub translate_value {
- my($self) = shift;
- my($key) = shift;
- my($val) = shift;
-
- if ($key eq 'depends' && $val ne '') {
- my($arr) = $self->create_array($val);
- my($app) = $dynamiclib;
- $val = '';
-
- ## Only write dependencies for non-static projects
- ## and static exe projects
- my($wt) = $self->get_writing_type();
- if ($wt == 0 || $self->exe_target()) {
- if ($wt == 1) {
- $app = $staticlib;
- }
- foreach my $entry (@$arr) {
- my($dep) = $app;
- ## Hack for executable dependencies
- if ($entry =~ /exe/i) {
- if ($wt == 1) {
- $dep = $staticexe;
- }
- else {
- $dep = $dynamicexe;
- }
- }
-
- $val .= "\"$entry $dep\" ";
- }
- $val =~ s/\s+$//;
- }
- }
- return $val;
-}
-
-
-sub file_sorter {
- my($self) = shift;
- my($left) = shift;
- my($right) = shift;
- return lc($left) cmp lc($right);
-}
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub fill_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
-
- if ($name eq 'make_file_name') {
- $value = $self->base_project_name() . '.mak';
- }
-
- return $value;
-}
-
-
-sub separate_static_project {
- #my($self) = shift;
- return 1;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- return $self->project_name() . '.dsp';
-}
-
-
-sub static_project_file_name {
- my($self) = shift;
- return $self->project_name() . "$sname.dsp";
-}
-
-
-sub override_valid_component_extensions {
- my($self) = shift;
- my($comp) = shift;
- my($array) = undef;
-
- if ($comp eq 'source_files') {
- my(@exts) = ("\\.cpp", "\\.cxx", "\\.c");
- $array = \@exts;
- }
-
- return $array;
-}
-
-
-sub override_exclude_component_extensions {
- my($self) = shift;
- my($comp) = shift;
- my($array) = undef;
-
- if ($comp eq 'source_files') {
- my(@exts) = ("_T\\.cpp", "_T\\.cxx");
- $array = \@exts;
- }
-
- return $array;
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'vc6dspdllexe';
-}
-
-
-sub get_lib_exe_template_input_file {
- #my($self) = shift;
- return 'vc6dsplibexe';
-}
-
-
-sub get_lib_template_input_file {
- #my($self) = shift;
- return 'vc6dsplib';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'vc6dspdll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'vc6dsp';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VC6WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/VC6WorkspaceCreator.pm
deleted file mode 100644
index bdb9954ff2a..00000000000
--- a/bin/MakeProjectCreator/modules/VC6WorkspaceCreator.pm
+++ /dev/null
@@ -1,132 +0,0 @@
-package VC6WorkspaceCreator;
-
-# ************************************************************
-# Description : A VC6 Workspace Creator
-# Author : Chad Elliott
-# Create Date : 5/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use VC6ProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_workspace_name() . '.dsw';
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "Microsoft Developer Studio Workspace File, Format Version 6.00$crlf" .
- "# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!$crlf" .
- $crlf;
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($projects) = $self->get_projects();
- my($pjs) = $self->get_project_info();
- my($crlf) = $self->crlf();
- my(%names) = ();
- my($dupfound) = 0;
-
- foreach my $project (@$projects) {
- my($pi) = $$pjs{$project};
- my($name, $deps) = @$pi;
- if (defined $names{$name}) {
- ## Having duplicate project names is an error in a VC6 Workspace.
- ## We will create the project, but we will warn the user that
- ## the project has duplicate names and will not load properly.
- print "WARNING: A project with the following name " .
- "has already been added: '$name'\n";
- ++$dupfound;
- }
- else {
- $names{$name} = 1;
- }
-
- ## Convert all /'s to \
- $project = $self->slash_to_backslash($project);
-
- print $fh "###############################################################################$crlf" .
- $crlf .
- "Project: \"$name\"=$project - Package Owner=<4>$crlf" .
- $crlf .
- "Package=<5>$crlf" .
- "{{{$crlf" .
- "}}}$crlf" .
- $crlf .
- "Package=<4>$crlf" .
- "{{{$crlf";
-
- if (defined $deps && $deps ne '') {
- my($darr) = $self->create_array($deps);
- foreach my $dep (@$darr) {
- ## Avoid cirular dependencies
- if ($name ne $dep) {
- print $fh " Begin Project Dependency$crlf" .
- " Project_Dep_Name $dep$crlf" .
- " End Project Dependency$crlf";
- }
- }
- }
-
- print $fh "}}}$crlf$crlf";
- }
-
- if ($dupfound > 0) {
- print "WARNING: $dupfound duplicate project" .
- ($dupfound == 1 ? '' : 's') .
- " found. This workspace will not load properly.\n";
- }
-}
-
-
-sub post_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "###############################################################################$crlf" .
- $crlf .
- "Global:$crlf" .
- $crlf .
- "Package=<5>$crlf" .
- "{{{$crlf" .
- "}}}$crlf" .
- $crlf .
- "Package=<3>$crlf" .
- "{{{$crlf" .
- "}}}$crlf" .
- $crlf .
- "###############################################################################$crlf" .
- $crlf;
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VC7ProjectCreator.pm b/bin/MakeProjectCreator/modules/VC7ProjectCreator.pm
deleted file mode 100644
index 30191fd7cbc..00000000000
--- a/bin/MakeProjectCreator/modules/VC7ProjectCreator.pm
+++ /dev/null
@@ -1,104 +0,0 @@
-package VC7ProjectCreator;
-
-# ************************************************************
-# Description : A VC7 Project Creator
-# Author : Chad Elliott
-# Create Date : 4/23/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use GUID;
-use ProjectCreator;
-
-use vars qw(@ISA);
-@ISA = qw(ProjectCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub specific_lookup {
- my($self) = shift;
- my($tag) = shift;
- my($val) = undef;
-
- if (defined $self->{'guid_names'} &&
- defined $self->{'guid_names'}->{$tag}) {
- $val = $self->{'guid_names'}->{$tag};
- }
-
- return $val;
-}
-
-
-sub save_project_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = shift;
-
- if ($name eq 'guid') {
- if (!defined $self->{'guid_names'}) {
- $self->{'guid_names'} = {};
- }
- $self->{'guid_names'}->{$self->project_file_name()} = $value;
- }
-}
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub fill_value {
- my($self) = shift;
- my($name) = shift;
- my($value) = undef;
-
- if ($name eq 'guid') {
- my($guid) = new GUID();
- $value = $guid->generate($self->project_file_name(),
- $self->get_current_input(),
- $self->getcwd());
- }
- return $value;
-}
-
-
-sub project_file_name {
- my($self) = shift;
- my($name) = shift;
-
- if (!defined $name) {
- $name = $self->project_name();
- }
-
- return "$name.vcproj";
-}
-
-
-sub get_dll_exe_template_input_file {
- #my($self) = shift;
- return 'vc7exe';
-}
-
-
-sub get_dll_template_input_file {
- #my($self) = shift;
- return 'vc7dll';
-}
-
-
-sub get_template {
- #my($self) = shift;
- return 'vc7';
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/VC7WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/VC7WorkspaceCreator.pm
deleted file mode 100644
index da47350d5bc..00000000000
--- a/bin/MakeProjectCreator/modules/VC7WorkspaceCreator.pm
+++ /dev/null
@@ -1,130 +0,0 @@
-package VC7WorkspaceCreator;
-
-# ************************************************************
-# Description : A VC7 Workspace Creator
-# Author : Chad Elliott
-# Create Date : 5/14/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-
-use VC7ProjectCreator;
-use WorkspaceCreator;
-
-use vars qw(@ISA);
-@ISA = qw(WorkspaceCreator);
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-
-sub crlf {
- my($self) = shift;
- return $self->windows_crlf();
-}
-
-
-sub workspace_file_name {
- my($self) = shift;
- return $self->get_workspace_name() . '.sln';
-}
-
-
-sub pre_workspace {
- my($self) = shift;
- my($fh) = shift;
- my($crlf) = $self->crlf();
-
- print $fh "Microsoft Visual Studio Solution File, Format Version 7.00$crlf";
-}
-
-
-sub write_comps {
- my($self) = shift;
- my($fh) = shift;
- my($gen) = shift;
- my($projects) = $self->get_projects();
- my($guid) = '8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942';
- my($pjs) = $self->get_project_info();
- my(@list) = $self->sort_dependencies($projects, $pjs);
- my($crlf) = $self->crlf();
-
- ## $guid above is the VC7 Project GUID. It should not change.
-
- ## Project Information
- foreach my $project (sort @list) {
- my($pi) = $$pjs{$project};
- my($name, $deps, $pguid) = @$pi;
-
- ## Convert all /'s to \
- my($cpy) = $self->slash_to_backslash($project);
- print $fh "Project(\"{$guid}\") = \"$name\", \"$cpy\", \"{$pguid}\"$crlf" .
- "EndProject$crlf";
- }
-
- ## Project Configurations
- print $fh "Global$crlf" .
- "\tGlobalSection(SolutionConfiguration) = preSolution$crlf";
-
- my(%configs) = ();
- foreach my $project (@list) {
- my($pi) = $$pjs{$project};
- my($name, $deps, $pguid, @cfgs) = @$pi;
- foreach my $cfg (@cfgs) {
- $cfg =~ s/\|.*//;
- $configs{$cfg} = 1;
- }
- }
- my($count) = 0;
- foreach my $key (sort keys %configs) {
- print $fh "\t\tConfigName.$count = $key$crlf";
- $count++;
- }
-
- ## Project Dependencies
- print $fh "\tEndGlobalSection$crlf" .
- "\tGlobalSection(ProjectDependencies) = postSolution$crlf";
- foreach my $project (@list) {
- my($pi) = $$pjs{$project};
- my($name, $deps, $pguid) = @$pi;
- if (defined $deps && $deps ne '') {
- my($darr) = $self->create_array($deps);
- my($i) = 0;
- foreach my $dep (@$darr) {
- my($val) = $gen->specific_lookup($dep);
- if (defined $val && $pguid ne $val) {
- print $fh "\t\t{$pguid}.$i = {$val}$crlf";
- $i++;
- }
- }
- }
- }
- print $fh "\tEndGlobalSection$crlf" .
- "\tGlobalSection(ProjectConfiguration) = postSolution$crlf";
-
- ## Project Configuration Names
- foreach my $project (sort @list) {
- my($pi) = $$pjs{$project};
- my($name, $deps, $pguid, @cfgs) = @$pi;
- foreach my $cfg (sort @cfgs) {
- my($c) = $cfg;
- $c =~ s/\|.*//;
- print $fh "\t\t{$pguid}.$c.ActiveCfg = $cfg$crlf" .
- "\t\t{$pguid}.$c.Build.0 = $cfg$crlf";
- }
- }
- print $fh "\tEndGlobalSection$crlf" .
- "\tGlobalSection(ExtensibilityGlobals) = postSolution$crlf" .
- "\tEndGlobalSection$crlf" .
- "\tGlobalSection(ExtensibilityAddIns) = postSolution$crlf" .
- "\tEndGlobalSection$crlf" .
- "EndGlobal$crlf";
-}
-
-
-1;
diff --git a/bin/MakeProjectCreator/modules/WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/WorkspaceCreator.pm
deleted file mode 100644
index 2901fdac8b9..00000000000
--- a/bin/MakeProjectCreator/modules/WorkspaceCreator.pm
+++ /dev/null
@@ -1,815 +0,0 @@
-package WorkspaceCreator;
-
-# ************************************************************
-# Description : Base class for all workspace creators
-# Author : Chad Elliott
-# Create Date : 5/13/2002
-# ************************************************************
-
-# ************************************************************
-# Pragmas
-# ************************************************************
-
-use strict;
-use FileHandle;
-use File::Path;
-use File::Basename;
-
-use Creator;
-use Options;
-
-use vars qw(@ISA);
-@ISA = qw(Creator Options);
-
-# ************************************************************
-# Data Section
-# ************************************************************
-
-my($wsext) = 'mwc';
-my($wsbase) = 'mwb';
-
-## Valid names for assignments within a workspace
-my(%validNames) = ('cmdline' => 1,
- 'implicit' => 1,
- );
-
-## Singleton hash maps of project information
-my(%allprinfo) = ();
-my(%allprojects) = ();
-
-# ************************************************************
-# Subroutine Section
-# ************************************************************
-
-sub new {
- my($class) = shift;
- my($global) = shift;
- my($inc) = shift;
- my($template) = shift;
- my($ti) = shift;
- my($dynamic) = shift;
- my($static) = shift;
- my($relative) = shift;
- my($addtemp) = shift;
- my($addproj) = shift;
- my($progress) = shift;
- my($toplevel) = shift;
- my($baseprojs) = shift;
- my($self) = Creator::new($class, $global, $inc,
- $template, $ti, $dynamic, $static,
- $relative, $addtemp, $addproj,
- $progress, $toplevel, $baseprojs,
- 'workspace');
- my($typecheck) = $self->{'type_check'};
-
- $self->{'workspace_name'} = undef;
- $self->{$typecheck} = 0;
- $self->{'projects'} = [];
- $self->{'project_info'} = {};
- $self->{'reading_parent'} = [];
- $self->{'project_files'} = [];
- $self->{'scoped_assign'} = {};
- $self->{'cacheok'} = 1;
-
- return $self;
-}
-
-
-sub modify_assignment_value {
- my($self) = shift;
- my($value) = shift;
-
- ## Workspace assignments do not need modification.
- return $value;
-}
-
-
-sub parse_line {
- my($self) = shift;
- my($ih) = shift;
- my($line) = shift;
- my($status,
- $errorString,
- @values) = $self->parse_known($line);
-
- ## Was the line recognized?
- if ($status && defined $values[0]) {
- if ($values[0] eq $self->{'grammar_type'}) {
- my($name) = $values[1];
- my($typecheck) = $self->{'type_check'};
- if (defined $name && $name eq '}') {
- my($rp) = $self->{'reading_parent'};
- if (!defined $$rp[0]) {
- ## Fill in all the default values
- $self->generate_defaults();
-
- ## End of workspace; Have subclass write out the file
- ## Generate the project files
- my($gstat, $generator) = $self->generate_project_files();
- if ($gstat) {
- $self->write_workspace($generator, 1);
- $self->{'assign'} = {};
- }
- else {
- $errorString = 'ERROR: Unable to ' .
- 'generate all of the project files';
- $status = 0;
- }
-
- $self->{'workspace_name'} = undef;
- $self->{'projects'} = [];
- $self->{'project_info'} = {};
- $self->{'project_files'} = [];
- }
- $self->{$typecheck} = 0;
- }
- else {
- ## Project Beginning
- ## Deal with the inheritance hiearchy first
- my($parents) = $values[2];
- if (defined $parents) {
- foreach my $parent (@$parents) {
- ## Read in the parent onto ourself
- my($file) = $self->search_include_path("$parent.$wsbase");
- if (!defined $file) {
- $file = $self->search_include_path("$parent.$wsext");
- }
-
- if (defined $file) {
- my($rp) = $self->{'reading_parent'};
- push(@$rp, 1);
- $status = $self->parse_file($file);
- pop(@$rp);
-
- if (!$status) {
- $errorString = "ERROR: Invalid parent: $parent";
- }
- }
- else {
- $status = 0;
- $errorString = "ERROR: Unable to locate parent: $parent";
- }
- }
- }
-
- ## Set up some initial values
- if (defined $name) {
- $name =~ s/^\(\s*//;
- $name =~ s/\s*\)$//;
- $self->{'workspace_name'} = $name;
- }
- $self->{$typecheck} = 1;
- }
- }
- elsif ($values[0] eq 'assignment') {
- if (defined $validNames{$values[1]}) {
- $self->process_assignment($values[1], $values[2]);
- }
- else {
- $errorString = "ERROR: Invalid assignment name: $values[1]";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'assign_add') {
- if (defined $validNames{$values[1]}) {
- $self->process_assignment_add($values[1], $values[2]);
- }
- else {
- $errorString = "ERROR: Invalid addition name: $values[1]";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'assign_sub') {
- if (defined $validNames{$values[1]}) {
- $self->process_assignment_sub($values[1], $values[2]);
- }
- else {
- $errorString = "ERROR: Invalid subtraction name: $values[1]";
- $status = 0;
- }
- }
- elsif ($values[0] eq 'component') {
- ($status, $errorString) = $self->parse_scope($ih,
- $values[1],
- $values[2],
- \%validNames);
- }
- else {
- $errorString = "ERROR: Unrecognized line: $line";
- $status = 0;
- }
- }
- elsif ($status == -1) {
- push(@{$self->{'project_files'}}, $line);
- $status = 1;
- }
-
- return $status, $errorString;
-}
-
-
-sub handle_scoped_unknown {
- my($self) = shift;
- my($fh) = shift;
- my($type) = shift;
- my($flags) = shift;
- my($line) = shift;
-
- if (-e $line) {
- if (-d $line) {
- ## This would be too hard to track which files
- ## got the scoped assignments, so we ignore these.
- print "WARNING: Scoped directory " .
- "assignments will be ignored: $line\n";
- }
- else {
- ## Assignment store
- $self->{'scoped_assign'}->{$line} = $flags;
- }
- }
- else {
- ## We couldn't determine if it was an mpc file or
- ## a directory, so we ignore these.
- print "WARNING: Scoped file does not " .
- "exist, so assignments will be ignored: $line\n";
- }
- push(@{$self->{'project_files'}}, $line);
-
- return 1, '';
-}
-
-
-sub search_for_files {
- my($self) = shift;
- my($files) = shift;
- my($exts) = shift;
- my($array) = shift;
- my($impl) = $self->get_assignment('implicit');
-
- foreach my $file (@$files) {
- if (-d $file) {
- my(@f) = $self->generate_default_file_list($file);
- $self->search_for_files(\@f, $exts, $array);
- if ($impl) {
- unshift(@$array, $file);
- }
- }
- else {
- foreach my $ext (@$exts) {
- if ($file =~ /$ext$/) {
- unshift(@$array, $file);
- }
- }
- }
- }
-}
-
-
-sub remove_duplicate_projects {
- my($self) = shift;
- my($list) = shift;
- my($count) = scalar(@$list);
-
- for(my $i = 0; $i < $count; ++$i) {
- my($file) = $$list[$i];
- foreach my $inner (@$list) {
- if ($file ne $inner && $file eq dirname($inner) && ! -d $inner) {
- splice(@$list, $i, 1);
- --$count;
- --$i;
- last;
- }
- }
- }
-}
-
-
-sub generate_default_components {
- my($self) = shift;
- my($files) = shift;
- my($pjf) = $self->{'project_files'};
- my(@exts) = ('\\.mpc');
- my($impl) = $self->get_assignment('implicit');
-
- if (defined $$pjf[0]) {
- ## If we have files, then process directories
- my(@built) = ();
- foreach my $file (@$pjf) {
- if (-d $file) {
- my(@found) = ();
- my(@gen) = $self->generate_default_file_list($file);
- $self->search_for_files(\@gen, \@exts, \@found);
- push(@built, @found);
- }
- else {
- push(@built, $file);
- }
- }
-
- ## If the workspace is set to implicit
- if ($impl) {
- ## Remove duplicates from this list
- $self->remove_duplicate_projects(\@built);
- }
-
- ## Set the project files
- $self->{'project_files'} = \@built;
- }
- else {
- ## Add all of the mpc files in this directory
- ## and in the subdirectories.
- $self->search_for_files($files, \@exts, $pjf);
-
- ## If the workspace is set to implicit
- if ($impl) {
- ## Remove duplicates from this list
- $self->remove_duplicate_projects($pjf);
- }
-
- ## If no files were found, then we push the empty
- ## string, so the Project Creator will generate
- ## the default project file.
- if (!defined $$pjf[0]) {
- push(@$pjf, '');
- }
- }
-}
-
-
-sub generate_defaults {
- my($self) = shift;
-
- ## Generate default workspace name
- if (!defined $self->{'workspace_name'}) {
- my($current) = $self->get_current_input();
- if ($current eq '') {
- $self->{'workspace_name'} = $self->base_directory();
- }
- else {
- $current =~ s/\.[^\.]+$//;
- $self->{'workspace_name'} = $current;
- }
- }
-
- my(@files) = $self->generate_default_file_list();
-
- ## Generate default components
- $self->generate_default_components(\@files);
-}
-
-
-sub get_workspace_name {
- my($self) = shift;
- return $self->{'workspace_name'};
-}
-
-
-sub write_workspace {
- my($self) = shift;
- my($generator) = shift;
- my($addfile) = shift;
- my($status) = 1;
-
- if ($self->get_toplevel()) {
- my($name) = $self->transform_file_name($self->workspace_file_name());
- if (defined $self->{'projects'}->[0]) {
- my($fh) = new FileHandle();
- my($dir) = dirname($name);
-
- if ($dir ne '.') {
- mkpath($dir, 0, 0777);
- }
- if (open($fh, ">$name")) {
- $self->pre_workspace($fh);
- $self->write_comps($fh, $generator);
- $self->post_workspace($fh);
- close($fh);
-
- if ($addfile) {
- $self->add_file_written($name);
- }
- }
- else {
- print STDERR "ERROR: Unable to open $name for output\n";
- $status = 0;
- }
- }
- else {
- print "WARNING: No projects were created.\n" .
- " Workspace $name has not been created.\n";
- }
- }
-
- return $status;
-}
-
-
-sub save_project_info {
- my($self) = shift;
- my($gen) = shift;
- my($gpi) = shift;
- my($dir) = shift;
- my($projects) = shift;
- my($pi) = shift;
- my($c) = 0;
-
- ## For each file written
- foreach my $pj (@$gen) {
- ## Save the full path to the project file in the array
- my($full) = ($dir ne '.' ? "$dir/" : '') . $pj;
- push(@$projects, $full);
-
- ## Get the corresponding generated project info and save it
- ## in the hash map keyed on the full project file name
- $$pi{$full} = $$gpi[$c];
- $c++;
- }
-}
-
-
-sub generate_project_files {
- my($self) = shift;
- my($status) = 0;
- my(@projects) = ();
- my(%pi) = ();
- my($generator) = $self->project_creator();
- my($cwd) = $self->getcwd();
- my($impl) = $self->get_assignment('implicit');
- my($postkey) = $generator->get_dynamic() .
- $generator->get_static() . "-$self";
- my($previmpl) = $impl;
- my($prevcache) = $self->{'cacheok'};
- my(%gstate) = $generator->save_state();
-
- ## Remove the address portion of the $self string
- $postkey =~ s/=.*//;
-
- foreach my $ofile (@{$self->{'project_files'}}) {
- my($file) = $ofile;
- my($dir) = dirname($file);
- my($restore) = 0;
-
- if (defined $self->{'scoped_assign'}->{$ofile}) {
- ## Handle the implicit assignment
- my($oi) = $self->{'scoped_assign'}->{$ofile}->{'implicit'};
- if (defined $oi) {
- $previmpl = $impl;
- $impl = $oi;
- }
-
- ## Handle the cmdline assignment
- my($cmdline) = $self->{'scoped_assign'}->{$ofile}->{'cmdline'};
- if (defined $cmdline && $cmdline ne '') {
- ## Save the cacheok value
- $prevcache = $self->{'cacheok'};
-
- ## Get the current parameters and process the command line
- my(%parameters) = $self->current_parameters();
- $self->process_cmdline($cmdline, \%parameters);
-
- ## Set the parameters on the generator
- $generator->restore_state(\%parameters);
- $restore = 1;
- }
- }
-
- ## If we are generating implicit projects and the file is a
- ## directory, then we set the dir to the file and empty the file
- if ($impl && -d $file) {
- $dir = $file;
- $file = '';
- }
-
- ## Generate the key for this project file
- my($prkey) = $self->getcwd() . "/$file-$postkey";
-
- ## We must change to the subdirectory for
- ## which this project file is intended
- if ($self->cd($dir)) {
- my($gen) = [];
- my($gpi) = [];
- if ($self->{'cacheok'} && defined $allprojects{$prkey}) {
- $gen = $allprojects{$prkey};
- $gpi = $allprinfo{$prkey};
- $status = 1;
- }
- else {
- $status = $generator->generate(basename($file));
-
- ## If any one project file fails, then stop
- ## processing altogether.
- if (!$status) {
- ## We don't restore the state before we leave,
- ## but that's ok since we will be exiting soon.
- return $status, $generator;
- }
-
- ## Get the individual project information and
- ## generated file name(s)
- $gen = $generator->get_files_written();
- $gpi = $generator->get_project_info();
-
- ## If we need to generate a workspace file per project
- ## then we generate a temporary project info and projects
- ## array and call write_project().
- if ($dir ne '.' && defined $$gen[0] && $self->workspace_per_project()) {
- my(%perpi) = ();
- my(@perprojects) = ();
- $self->save_project_info($gen, $gpi, '.', \@perprojects, \%perpi);
-
- ## Set our per project information
- $self->{'projects'} = \@perprojects;
- $self->{'project_info'} = \%perpi;
-
- ## Write our per project workspace
- $self->write_workspace($generator);
-
- ## Reset our project information to empty
- $self->{'projects'} = [];
- $self->{'project_info'} = {};
- }
-
- if ($self->{'cacheok'}) {
- $allprojects{$prkey} = $gen;
- $allprinfo{$prkey} = $gpi;
- }
- }
- $self->cd($cwd);
- $self->save_project_info($gen, $gpi, $dir, \@projects, \%pi);
- }
- else {
- ## Unable to change to the directory.
- ## We don't restore the state before we leave,
- ## but that's ok since we will be exiting soon.
- return 0, $generator;
- }
-
- ## Return things to the way they were
- if (defined $self->{'scoped_assign'}->{$ofile}) {
- $impl = $previmpl;
-
- if ($restore) {
- $self->{'cacheok'} = $prevcache;
- $generator->restore_state(\%gstate);
- }
- }
- }
-
- $self->{'projects'} = \@projects;
- $self->{'project_info'} = \%pi;
-
- return $status, $generator;
-}
-
-
-sub get_projects {
- my($self) = shift;
- return $self->{'projects'};
-}
-
-
-sub get_project_info {
- my($self) = shift;
- return $self->{'project_info'};
-}
-
-
-sub sort_dependencies {
- my($self) = shift;
- my($projects) = shift;
- my($pjs) = shift;
- my(@list) = @$projects;
- my(%prepend) = ();
-
- foreach my $project (@list) {
- my($dname) = dirname($project);
- if ($dname ne '.') {
- $prepend{basename($project)} = dirname($project);
- }
- }
-
- ## Put the projects in the order specified
- ## by the project dpendencies.
- for(my $i = 0; $i <= $#list; $i++) {
- my($project) = $list[$i];
- my($pi) = $$pjs{$project};
- my($name, $deps) = @$pi;
-
- if ($deps ne '') {
- my($darr) = $self->create_array($deps);
- my($moved) = 0;
- foreach my $dep (@$darr) {
- my($base) = basename($dep);
- my($full) = (defined $prepend{$base} ?
- "$prepend{$base}/" : '') . $base;
- if ($project ne $full) {
- ## See if the dependency is listed after this project
- for(my $j = $i; $j <= $#list; $j++) {
- if ($list[$j] eq $full) {
- ## If so, move it in front of the current project
- splice(@list, $i, 0, $full);
- splice(@list, $j + 1, 1);
- $moved = 1;
- $j--;
- }
- }
- }
- }
- if ($moved) {
- $i--;
- }
- }
- }
- return @list;
-}
-
-
-sub optionError {
- my($self) = shift;
- my($str) = shift;
- print 'WARNING: ' . $self->get_current_input() . ": $str\n";
-}
-
-
-sub process_cmdline {
- my($self) = shift;
- my($cmdline) = shift;
- my($parameters) = shift;
-
- ## It's ok to use the cache
- $self->{'cacheok'} = 1;
-
- if (defined $cmdline && $cmdline ne '') {
- my($args) = $self->create_array($cmdline);
-
- ## Look for environment variables
- foreach my $arg (@$args) {
- while($arg =~ /\$(\w+)/) {
- my($name) = $1;
- my($val) = undef;
- if ($name eq 'PWD') {
- $val = $self->getcwd();
- }
- elsif (defined $ENV{$name}) {
- $val = $ENV{$name};
- }
- $arg =~ s/\$\w+/$val/;
- }
- }
-
- my($options) = $self->options('MWC', {}, 0, @$args);
- if (defined $options) {
- foreach my $key (keys %$options) {
- my($type) = $self->is_set($key, $options);
- if ($type eq 'ARRAY') {
- push(@{$parameters->{$key}}, @{$options->{$key}});
- }
- elsif ($type eq 'HASH') {
- foreach my $hk (keys %{$options->{$key}}) {
- $parameters->{$key}->{$hk} = $options->{$key}->{$hk};
- }
- }
- elsif ($type eq 'SCALAR') {
- $parameters->{$key} = $options->{$key};
- }
- }
-
- ## Issue warnings for these options
- if (defined $options->{'recurse'}) {
- $self->optionError('-recurse is ignored');
- }
- if (defined $options->{'reldefs'}) {
- $self->optionError('-noreldefs is ignored');
- }
- if (defined $options->{'input'}->[0]) {
- $self->optionError('Command line files ' .
- 'specified in a workspace are ignored');
- }
-
- ## Determine if it's ok to use the cache
- my(@cacheInvalidating) = ('global', 'include', 'baseprojs',
- 'template', 'ti', 'relative',
- 'addtemp', 'addproj');
- foreach my $key (@cacheInvalidating) {
- if ($self->is_set($key, $options)) {
- $self->{'cacheok'} = 0;
- last;
- }
- }
- }
- }
-}
-
-
-sub current_parameters {
- my($self) = shift;
- my(%parameters) = $self->save_state();
-
- ## We always want the project creator to generate a toplevel
- $parameters{'toplevel'} = 1;
- return %parameters;
-}
-
-
-sub project_creator {
- my($self) = shift;
- my($str) = "$self";
-
- ## NOTE: If the subclassed WorkspaceCreator name prefix does not
- ## match the name prefix of the ProjectCreator, this code
- ## will not work and the subclassed WorkspaceCreator will
- ## need to override this method.
-
- $str =~ s/Workspace/Project/;
- $str =~ s/=HASH.*//;
-
- ## Set up values for each project creator
- ## If we have command line arguments in the workspace, then
- ## we process them before creating the project creator
- my($cmdline) = $self->get_assignment('cmdline');
- my(%parameters) = $self->current_parameters();
- $self->process_cmdline($cmdline, \%parameters);
-
- ## Create the new project creator with the updated parameters
- return $str->new($parameters{'global'},
- $parameters{'include'},
- $parameters{'template'},
- $parameters{'ti'},
- $parameters{'dynamic'},
- $parameters{'static'},
- $parameters{'relative'},
- $parameters{'addtemp'},
- $parameters{'addproj'},
- $parameters{'progress'},
- $parameters{'toplevel'},
- $parameters{'baseprojs'});
-}
-
-
-sub sort_files {
- #my($self) = shift;
- return 0;
-}
-
-
-sub get_modified_workspace_name {
- my($self) = shift;
- my($name) = shift;
- my($ext) = shift;
-
- if (!defined $self->{'previous_workspace_name'}) {
- $self->{'previous_workspace_name'} = $self->get_workspace_name();
- }
- elsif ($self->{'previous_workspace_name'} ne $self->get_workspace_name()) {
- $self->{'previous_workspace_name'} = $self->get_workspace_name();
- $self->{'current_workspace_name'} =
- "$name.$self->{'previous_workspace_name'}$ext";
- }
-
- return (defined $self->{'current_workspace_name'} ?
- $self->{'current_workspace_name'} : "$name$ext");
-}
-
-
-sub generate_recursive_input_list {
- my($self) = shift;
- my($dir) = shift;
- return $self->extension_recursive_input_list($dir, $wsext);
-}
-
-# ************************************************************
-# Virtual Methods To Be Overridden
-# ************************************************************
-
-sub workspace_file_name {
- #my($self) = shift;
- return '';
-}
-
-
-sub workspace_per_project {
- #my($self) = shift;
- return 0;
-}
-
-
-sub pre_workspace {
- #my($self) = shift;
- #my($fh) = shift;
-}
-
-
-sub write_comps {
- #my($self) = shift;
- #my($fh) = shift;
- #my($gens) = shift;
-}
-
-
-sub post_workspace {
- #my($self) = shift;
- #my($fh) = shift;
-}
-
-
-1;