diff options
author | elliott_c <ocielliottc@users.noreply.github.com> | 2003-03-21 16:44:42 +0000 |
---|---|---|
committer | elliott_c <ocielliottc@users.noreply.github.com> | 2003-03-21 16:44:42 +0000 |
commit | a6241630157c493863377389d8da79a11f61c50c (patch) | |
tree | c9bed765476d8256bf4eaf4393758d2e7b37bd4e | |
parent | 17a683a7b6fbf55491fef6f3de083b71eae1cd6e (diff) | |
download | ATCD-a6241630157c493863377389d8da79a11f61c50c.tar.gz |
ChangeLogTag: Fri Mar 21 10:42:41 2003 Chad Elliott <elliott_c@ociweb.com>
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/Creator.pm | 113 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/Driver.pm | 285 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/Options.pm | 260 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/Parser.pm | 6 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/ProjectCreator.pm | 84 | ||||
-rw-r--r-- | bin/MakeProjectCreator/modules/WorkspaceCreator.pm | 147 |
7 files changed, 565 insertions, 350 deletions
diff --git a/ChangeLog b/ChangeLog index 04d6f7b7577..8bfd25b69a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,23 @@ +Fri Mar 21 10:42:41 2003 Chad Elliott <elliott_c@ociweb.com> + + * bin/MakeProjectCreator/modules/Creator.pm: + * bin/MakeProjectCreator/modules/Parser.pm: + * bin/MakeProjectCreator/modules/ProjectCreator.pm: + + Factored assignment processing from ProjectCreator into Creator. + Factored convert_slashes() from ProjectCreator into Parser. + + * bin/MakeProjectCreator/modules/Driver.pm: + * bin/MakeProjectCreator/modules/Options.pm: + + Factored option processing from Driver into a new module, Options. + + * bin/MakeProjectCreator/modules/WorkspaceCreator.pm: + + Added support for workspace specific assignments. Currently the + only valid assignment is 'cmdline' which allows mwc to apply + command line options to a specific set of mpc files. + Fri Mar 21 09:48:33 2003 Chad Elliott <elliott_c@ociweb.com> * bin/MakeProjectCreator/USAGE: diff --git a/bin/MakeProjectCreator/modules/Creator.pm b/bin/MakeProjectCreator/modules/Creator.pm index df19d3adb6e..b7b50e83edf 100644 --- a/bin/MakeProjectCreator/modules/Creator.pm +++ b/bin/MakeProjectCreator/modules/Creator.pm @@ -37,20 +37,23 @@ sub new { my($type) = shift; my($self) = Parser::new($class); - $self->{'relative'} = $relative; - $self->{'template'} = $template; - $self->{'ti'} = $ti; - $self->{'global_cfg'} = $global; - $self->{'grammar_type'} = $type; - $self->{'type_check'} = $type . '_defined'; - $self->{'global_read'} = 0; - $self->{'include_path'} = $inc; - $self->{'current_input'} = ''; - $self->{'progress'} = $progress; - $self->{'addtemp'} = $addtemp; - $self->{'addproj'} = $addproj; - $self->{'toplevel'} = $toplevel; - $self->{'files_written'} = []; + $self->{'relative'} = $relative; + $self->{'template'} = $template; + $self->{'ti'} = $ti; + $self->{'global_cfg'} = $global; + $self->{'grammar_type'} = $type; + $self->{'type_check'} = $type . '_defined'; + $self->{'global_read'} = 0; + $self->{'include_path'} = $inc; + $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'} = {}; return $self; } @@ -435,10 +438,92 @@ sub extension_recursive_input_list { return @files; } + +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+$//; + + if ($self->convert_slashes()) { + $value = $self->slash_to_backslash($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 get_assignment { + my($self) = shift; + my($name) = shift; + my($tag) = ($self->{'reading_global'} ? 'global_assign' : 'assign'); + return $self->{$tag}->{$name}; +} + # ************************************************************ # Virtual Methods To Be Overridden # ************************************************************ +sub process_duplicate_modification { + #my($self) = shift; + #my($name) = shift; + #my($assign) = shift; +} + sub generate_recursive_input_list { #my($self) = shift; #my($dir) = shift; diff --git a/bin/MakeProjectCreator/modules/Driver.pm b/bin/MakeProjectCreator/modules/Driver.pm index 81e2c440418..87fe00e15a5 100644 --- a/bin/MakeProjectCreator/modules/Driver.pm +++ b/bin/MakeProjectCreator/modules/Driver.pm @@ -13,10 +13,11 @@ package Driver; use strict; use File::Basename; +use Options; use StringProcessor; use vars qw(@ISA); -@ISA = qw(StringProcessor); +@ISA = qw(StringProcessor Options); # ************************************************************ # Data Section @@ -48,7 +49,7 @@ sub new { } -sub usageAndExit { +sub optionError { my($self) = shift; my($line) = shift; my($base) = $self->{'name'}; @@ -121,45 +122,10 @@ sub usageAndExit { } -sub completion_command { - my($self) = shift; - my($str) = "complete $self->{'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 %{$self->{'types'}}; - for(my $i = 0; $i <= $#keys; $i++) { - $str .= $keys[$i]; - if ($i != $#keys) { - $str .= " "; - } - } - $str .= ")/'"; - return $str; -} - - sub run { my($self) = shift; my(@args) = @_; - my($global) = undef; - my(@include) = (); - my(@input) = (); - my(@generators) = (); my($status) = 0; - my($template) = undef; - my(%ti) = (); - my($dynamic) = 1; - my($static) = 0; - my(%relative) = (); - my($reldefs) = 1; - my($toplevel) = 1; - my($recurse) = 0; - my(%addtemp) = (); - my(%addproj) = (); ## Dynamically load in each perl module and set up ## the type tags and project creators @@ -176,175 +142,12 @@ sub run { unshift(@args, @$envargs); } - ## Process the command line arguments - for(my $i = 0; $i <= $#args; $i++) { - my($arg) = $args[$i]; - if ($arg eq '-complete') { - print $self->completion_command() . "\n"; - return $status; - } - elsif ($arg eq '-type') { - $i++; - if (!defined $args[$i]) { - $self->usageAndExit('-type requires an argument'); - } - - my($type) = lc($args[$i]); - if (defined $self->{'types'}->{$type}) { - my($call) = $self->{'types'}->{$type}; - my($found) = 0; - foreach my $generator (@generators) { - if ($generator eq $call) { - $found = 1; - last; - } - } - if (!$found) { - push(@generators, $call); - } - } - else { - $self->usageAndExit("Invalid type: $args[$i]"); - } - } - elsif ($arg eq '-global') { - $i++; - $global = $args[$i]; - if (!defined $global) { - $self->usageAndExit('-global requires a file name argument'); - } - } - elsif ($arg eq '-include') { - $i++; - my($include) = $args[$i]; - if (!defined $include) { - $self->usageAndExit('-include requires a directory argument'); - } - 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->usageAndExit('-template requires a file name argument'); - } - } - elsif ($arg eq '-relative') { - $i++; - my($rel) = $args[$i]; - if (!defined $rel) { - $self->usageAndExit('-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->usageAndExit('Invalid option to -relative'); - } - } - } - elsif ($arg eq '-ti') { - $i++; - my($tmpi) = $args[$i]; - if (!defined $tmpi) { - $self->usageAndExit('-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->usageAndExit("Invalid -ti argument: $tmpi"); - } - } - } - elsif ($arg eq '-value_template') { - $i++; - my($value) = $args[$i]; - if (!defined $value) { - $self->usageAndExit('-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->usageAndExit('Invalid option to -value_template'); - } - } - } - elsif ($arg eq '-value_project') { - $i++; - my($value) = $args[$i]; - if (!defined $value) { - $self->usageAndExit('-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->usageAndExit('Invalid option to -value_project'); - } - } - } - elsif ($arg eq '-static') { - $static = 1; - } - elsif ($arg eq '-static_only') { - $static = 1; - $dynamic = 0; - } - elsif ($arg =~ /^-/) { - $self->usageAndExit(); - } - else { - push(@input, $arg); - } + 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 @@ -352,21 +155,21 @@ sub run { my(%loaded) = (); ## Set up the default generator, if no type is selected - if (!defined $generators[0]) { - push(@generators, $self->{'default'}); + if (!defined $options->{'generators'}->[0]) { + push(@{$options->{'generators'}}, $self->{'default'}); } - if ($recurse) { - if (defined $input[0]) { + if ($options->{'recurse'}) { + if (defined $options->{'input'}->[0]) { ## This is an error. ## -recurse was used and input files were specified. - $self->usageAndExit('No files should be ' . - 'specified when using -recurse'); + $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) = $generators[0]; + my($name) = $options->{'generators'}->[0]; if (!$loaded{$name}) { require "$name.pm"; $loaded{$name} = 1; @@ -374,11 +177,12 @@ sub run { ## Generate the recursive input list my($generator) = $name->new(); - @input = $generator->generate_recursive_input_list('.'); + 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 $input[0]) { + if (!defined $options->{'input'}->[0]) { print "WARNING: No files were found using the -recurse option.\n" . " Using the default input.\n"; } @@ -386,34 +190,37 @@ sub run { } ## Set up default values - if (!defined $input[0]) { - push(@input, ''); + if (!defined $options->{'input'}->[0]) { + push(@{$options->{'input'}}, ''); } - if (!defined $global) { - $global = $self->{'path'} . '/config/global.mpb'; + if (!defined $options->{'global'}) { + $options->{'global'} = $self->{'path'} . '/config/global.mpb'; } ## Always add the default include paths - unshift(@include, $self->{'path'} . '/templates'); - unshift(@include, $self->{'path'} . '/config'); + unshift(@{$options->{'include'}}, $self->{'path'} . '/templates'); + unshift(@{$options->{'include'}}, $self->{'path'} . '/config'); - if ($reldefs) { - if (!defined $relative{'ACE_ROOT'} && defined $ENV{ACE_ROOT}) { - $relative{'ACE_ROOT'} = $ENV{ACE_ROOT}; + if ($options->{'reldefs'}) { + if (defined $ENV{ACE_ROOT} && + !defined $options->{'relative'}->{'ACE_ROOT'}) { + $options->{'relative'}->{'ACE_ROOT'} = $ENV{ACE_ROOT}; } - if (!defined $relative{'TAO_ROOT'}) { + if (!defined $options->{'relative'}->{'TAO_ROOT'}) { if (defined $ENV{TAO_ROOT}) { - $relative{'TAO_ROOT'} = $ENV{TAO_ROOT}; + $options->{'relative'}->{'TAO_ROOT'} = $ENV{TAO_ROOT}; } else { - $relative{'TAO_ROOT'} = "$relative{ACE_ROOT}/TAO"; + $options->{'relative'}->{'TAO_ROOT'} = + $options->{'relative'}->{'ACE_ROOT'} . '/TAO'; } } - if (!defined $relative{'CIAO_ROOT'}) { + if (!defined $options->{'relative'}->{'CIAO_ROOT'}) { if (defined $ENV{CIAO_ROOT}) { - $relative{'CIAO_ROOT'} = $ENV{CIAO_ROOT}; + $options->{'relative'}->{'CIAO_ROOT'} = $ENV{CIAO_ROOT}; } else { - $relative{'CIAO_ROOT'} = "$relative{ACE_ROOT}/TAO/CIAO"; + $options->{'relative'}->{'CIAO_ROOT'} = + $options->{'relative'}->{ACE_ROOT} . '/TAO/CIAO'; } } } @@ -426,20 +233,26 @@ sub run { my($orig_dir) = Cwd::getcwd(); ## Generate the files - foreach my $file (@input) { + foreach my $file (@{$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($file); - foreach my $name (@generators) { + foreach my $name (@{$options->{'generators'}}) { if (!$loaded{$name}) { require "$name.pm"; $loaded{$name} = 1; } - my($generator) = $name->new($global, \@include, $template, - \%ti, $dynamic, $static, \%relative, - \%addtemp, \%addproj, + 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), - $toplevel); + $options->{'toplevel'}); if ($base ne $file) { my($dir) = dirname($file); if (!$generator->cd($dir)) { diff --git a/bin/MakeProjectCreator/modules/Options.pm b/bin/MakeProjectCreator/modules/Options.pm new file mode 100644 index 00000000000..83d8d59bb5f --- /dev/null +++ b/bin/MakeProjectCreator/modules/Options.pm @@ -0,0 +1,260 @@ +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(%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 '-type') { + $i++; + if (!defined $args[$i]) { + $self->optionError('-type requires an argument'); + } + + 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'); + } + 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, + 'template' => $template, + 'ti' => \%ti, + 'dynamic' => $dynamic, + 'static' => $static, + 'relative' => \%relative, + 'reldefs' => $reldefs, + 'toplevel' => $toplevel, + 'recurse' => $recurse, + 'addtemp' => \%addtemp, + 'addproj' => \%addproj, + ); + + return \%options; +} + + +1; diff --git a/bin/MakeProjectCreator/modules/Parser.pm b/bin/MakeProjectCreator/modules/Parser.pm index d281b2ef039..f32402c872c 100644 --- a/bin/MakeProjectCreator/modules/Parser.pm +++ b/bin/MakeProjectCreator/modules/Parser.pm @@ -135,6 +135,12 @@ sub slash_to_backslash { # Virtual Methods To Be Overridden # ************************************************************ +sub convert_slashes { + #my($self) = shift; + return 1; +} + + sub parse_line { #my($self) = shift; #my($ih) = shift; diff --git a/bin/MakeProjectCreator/modules/ProjectCreator.pm b/bin/MakeProjectCreator/modules/ProjectCreator.pm index 1a8ee351a5a..24bc5b0b5b5 100644 --- a/bin/MakeProjectCreator/modules/ProjectCreator.pm +++ b/bin/MakeProjectCreator/modules/ProjectCreator.pm @@ -90,9 +90,7 @@ sub new { $progress, $toplevel, 'project'); $self->{$self->{'type_check'}} = 0; - $self->{'global_assign'} = {}; $self->{'project_info'} = []; - $self->{'reading_global'} = 0; $self->{'reading_parent'} = []; $self->{'dexe_template_input'} = undef; $self->{'lexe_template_input'} = undef; @@ -495,74 +493,6 @@ sub parse_verbatim { } -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+$//; - - if ($self->convert_slashes()) { - $value = $self->slash_to_backslash($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 process_duplicate_modification { my($self) = shift; my($name) = shift; @@ -1277,14 +1207,6 @@ sub exe_target { } -sub get_assignment { - my($self) = shift; - my($name) = shift; - my($tag) = ($self->{'reading_global'} ? 'global_assign' : 'assign'); - return $self->{$tag}->{$name}; -} - - sub get_component_list { my($self) = shift; my($tag) = shift; @@ -1583,12 +1505,6 @@ sub translate_value { } -sub convert_slashes { - #my($self) = shift; - return 1; -} - - sub fill_value { #my($self) = shift; #my($name) = shift; diff --git a/bin/MakeProjectCreator/modules/WorkspaceCreator.pm b/bin/MakeProjectCreator/modules/WorkspaceCreator.pm index f3dbf4f4483..0d9b090661f 100644 --- a/bin/MakeProjectCreator/modules/WorkspaceCreator.pm +++ b/bin/MakeProjectCreator/modules/WorkspaceCreator.pm @@ -16,9 +16,10 @@ use File::Path; use File::Basename; use Creator; +use Options; use vars qw(@ISA); -@ISA = qw(Creator); +@ISA = qw(Creator Options); # ************************************************************ # Data Section @@ -26,6 +27,10 @@ use vars qw(@ISA); my($wsext) = 'mwc'; +## Valid names for assignments within a workspace +my(%validNames) = ('cmdline' => 1, + ); + # ************************************************************ # Subroutine Section # ************************************************************ @@ -86,6 +91,7 @@ sub parse_line { my($gstat, $generator) = $self->generate_project_files(); if ($gstat) { $self->write_workspace($generator, 1); + $self->{'assign'} = {}; } else { $errorString = 'ERROR: Unable to ' . @@ -134,14 +140,40 @@ sub parse_line { $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; + } + } else { $errorString = "ERROR: Unrecognized line: $line"; $status = 0; } } elsif ($status == -1) { - my($project_files) = $self->{'project_files'}; - push(@$project_files, $line); + push(@{$self->{'project_files'}}, $line); $status = 1; } @@ -423,6 +455,72 @@ sub sort_dependencies { } +sub optionError { + my($self) = shift; + my($str) = shift; + print 'WARNING: ' . $self->get_current_input() . ": $str\n"; +} + + +sub process_cmdline { + my($self) = shift; + my($parameters) = shift; + + my($cmdline) = $self->get_assignment('cmdline'); + 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) { + if (UNIVERSAL::isa($options->{$key}, 'ARRAY')) { + if (defined $options->{$key}->[0]) { + push(@{$parameters->{$key}}, @{$options->{$key}}); + } + } + elsif (UNIVERSAL::isa($options->{$key}, 'HASH')) { + my(@keys) = keys %{$options->{$key}}; + if (defined $keys[0]) { + foreach my $hk (keys %{$options->{$key}}) { + $parameters->{$key}->{$hk} = $options->{$key}->{$hk}; + } + } + } + elsif (defined $options->{$key}) { + $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'); + } + } + } +} + sub project_creator { my($self) = shift; my($str) = "$self"; @@ -435,19 +533,36 @@ sub project_creator { $str =~ s/Workspace/Project/; $str =~ s/=HASH.*//; - ## For the toplevel parameter, we always pass 1 since the workspace - ## creator always wants the ProjectCreator to generate projects. - return $str->new($self->get_global_cfg(), - $self->get_include_path(), - $self->get_template_override(), - $self->get_ti_override(), - $self->get_dynamic(), - $self->get_static(), - $self->get_relative(), - $self->get_addtemp(), - $self->get_addproj(), - $self->get_progress_callback(), - 1); + ## 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(%parameters) = ('global' => $self->get_global_cfg(), + 'include' => $self->get_include_path(), + 'template' => $self->get_template_override(), + 'ti' => $self->get_ti_override(), + 'dynamic' => $self->get_dynamic(), + 'static' => $self->get_static(), + 'relative' => $self->get_relative(), + 'addtemp' => $self->get_addtemp(), + 'addproj' => $self->get_addproj(), + 'progress' => $self->get_progress_callback(), + 'toplevel' => 1, + ); + + $self->process_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'}); } |