summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelliott_c <ocielliottc@users.noreply.github.com>2003-03-21 16:44:42 +0000
committerelliott_c <ocielliottc@users.noreply.github.com>2003-03-21 16:44:42 +0000
commita6241630157c493863377389d8da79a11f61c50c (patch)
treec9bed765476d8256bf4eaf4393758d2e7b37bd4e
parent17a683a7b6fbf55491fef6f3de083b71eae1cd6e (diff)
downloadATCD-a6241630157c493863377389d8da79a11f61c50c.tar.gz
ChangeLogTag: Fri Mar 21 10:42:41 2003 Chad Elliott <elliott_c@ociweb.com>
-rw-r--r--ChangeLog20
-rw-r--r--bin/MakeProjectCreator/modules/Creator.pm113
-rw-r--r--bin/MakeProjectCreator/modules/Driver.pm285
-rw-r--r--bin/MakeProjectCreator/modules/Options.pm260
-rw-r--r--bin/MakeProjectCreator/modules/Parser.pm6
-rw-r--r--bin/MakeProjectCreator/modules/ProjectCreator.pm84
-rw-r--r--bin/MakeProjectCreator/modules/WorkspaceCreator.pm147
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'});
}