summaryrefslogtreecommitdiff
path: root/modules/ProjectCreator.pm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/ProjectCreator.pm')
-rw-r--r--modules/ProjectCreator.pm2154
1 files changed, 0 insertions, 2154 deletions
diff --git a/modules/ProjectCreator.pm b/modules/ProjectCreator.pm
deleted file mode 100644
index 6fc3f1c4..00000000
--- a/modules/ProjectCreator.pm
+++ /dev/null
@@ -1,2154 +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::Compare;
-use File::Basename;
-
-use Creator;
-use TemplateInputReader;
-use TemplateParser;
-use FeatureParser;
-
-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,
- );
-
-## Custom definitions only
-my(%customDefined) = ('automatic' => 1,
- 'command' => 1,
- 'commandflags' => 1,
- 'inputext' => 1,
- 'output_option' => 1,
- 'pre_extension' => 1,
- 'pre_filename' => 1,
- 'source_outputext' => 1,
- 'template_outputext' => 1,
- 'header_outputext' => 1,
- 'inline_outputext' => 1,
- 'documentation_outputext' => 1,
- 'resource_outputext' => 1,
- 'generic_outputext' => 1,
- );
-
-## Custom sections as well as definitions
-my(%custom) = ('commandflags' => 1,
- 'gendir' => 1,
- );
-
-## Deal with these components in a special way
-my(@specialComponents) = ('header_files', 'inline_files');
-
-## 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) = ('idl_files' => [ 'idlgendir', 'idlflags' ],
- );
-
-my(%genext) = ('idl_files' => {'automatic' => 1,
- 'pre_filename' => [ '' ],
- 'pre_extension' => [ 'C', 'S' ],
- 'source_files' => [ '\\.cpp', '\\.cxx', '\\.cc', '\\.C', ],
- 'inline_files' => [ '\\.i', '\\.inl', ],
- 'header_files' => [ '\\.h', '\\.hxx', '\\.hh', ],
- },
- );
-
-# ************************************************************
-# 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($gfeature) = shift;
- my($feature) = shift;
- my($self) = Creator::new($class, $global, $inc,
- $template, $ti, $dynamic, $static,
- $relative, $addtemp, $addproj,
- $progress, $toplevel, $baseprojs,
- $feature, '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->{'writing_type'} = 0;
- $self->{'flag_overrides'} = {};
- $self->{'special_supplied'} = {};
- $self->{'verbatim'} = {};
- $self->{'type_specific_assign'} = {};
- $self->{'pctype'} = $self->extractType("$self");
- $self->{'defaulted'} = {};
- $self->{'custom_types'} = {};
- $self->{'feature_parser'} = new FeatureParser($gfeature, $feature);
- $self->reset_generating_types();
-
- 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.
- ($status, $errorString) = $self->write_project();
-
- foreach my $key (keys %{$self->{'valid_components'}}) {
- delete $self->{$key};
- $self->{'defaulted'}->{$key} = 0;
- }
- $self->{'assign'} = {};
- $self->{'verbatim'} = {};
- $self->{'special_supplied'} = {};
- $self->{'type_specific_assign'} = {};
- $self->{'flag_overrides'} = {};
- $self->reset_generating_types();
- }
- }
- $self->{$typecheck} = 0;
- }
- 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) {
- if ($name =~ /[\/\\]/) {
- $status = 0;
- $errorString = 'ERROR: Projects can not have a slash ' .
- 'or a back slash in the name';
- }
- else {
- $name =~ s/^\(\s*//;
- $name =~ s/\s*\)$//;
- $name = $self->transform_file_name($name);
-
- ## Replace any *'s with the default name
- my($def) = $self->get_default_project_name();
- $name = $self->fill_type_name($name, $def);
-
- $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'}});
- }
- elsif ($comp eq 'define_custom') {
- ($status, $errorString) = $self->parse_define_custom($ih, $name);
- }
- 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_scoped_assignment {
- my($self) = shift;
- my($tag) = shift;
- my($type) = shift;
- my($name) = shift;
- my($value) = shift;
- my($flags) = shift;
- my($over) = {};
- my($status) = 0;
-
- if (defined $self->{'matching_assignments'}->{$tag}) {
- foreach my $possible (@{$self->{'matching_assignments'}->{$tag}}) {
- if ($possible eq $name) {
- $status = 1;
- last;
- }
- }
- }
-
- if ($status) {
- if (defined $self->{'flag_overrides'}->{$tag}) {
- $over = $self->{'flag_overrides'}->{$tag};
- }
- else {
- $self->{'flag_overrides'}->{$tag} = $over;
- }
-
- if ($type eq 'assignment') {
- $self->process_assignment($name,
- $value, $flags);
- }
- elsif ($type eq 'assign_add') {
- ## If there is no value in $$flags, then we need to get
- ## the outer scope value and put it in there.
- if (!defined $self->get_assignment($name, $flags)) {
- my($outer) = $self->get_assignment($name);
- $self->process_assignment($name, $outer, $flags);
- }
- $self->process_assignment_add($name,
- $value, $flags);
- }
- elsif ($type eq 'assign_sub') {
- ## If there is no value in $$flags, then we need to get
- ## the outer scope value and put it in there.
- if (!defined $self->get_assignment($name, $flags)) {
- my($outer) = $self->get_assignment($name);
- $self->process_assignment($name, $outer, $flags);
- }
- $self->process_assignment_sub($name,
- $value, $flags);
- }
- }
- return $status;
-}
-
-
-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)) {
- $status = $self->parse_scoped_assignment($tag, @values, \%flags);
- if (!$status) {
- last;
- }
- }
- 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 process_array_assignment {
- my($self) = shift;
- my($aref) = shift;
- my($type) = shift;
- my($array) = shift;
-
- if (!defined $$aref || $type eq 'assignment') {
- if ($type ne 'assign_sub') {
- $$aref = $array;
- }
- }
- else {
- if ($type eq 'assign_add') {
- push(@{$$aref}, @$array);
- }
- elsif ($type eq 'assign_sub') {
- my($count) = scalar(@{$$aref});
- for(my $i = 0; $i < $count; ++$i) {
- foreach my $val (@$array) {
- if ($$aref->[$i] eq $val) {
- splice(@{$$aref}, $i, 1);
- --$i;
- --$count;
- last;
- }
- }
- }
- }
- }
-}
-
-
-sub parse_define_custom {
- my($self) = shift;
- my($fh) = shift;
- my($tag) = shift;
- my($status) = 0;
- my($errorString) = "ERROR: Unable to process $tag";
- my(%flags) = ();
-
- ## Make the tag something _files
- $tag = lc($tag) . '_files';
-
- if (defined $self->{'valid_components'}->{$tag}) {
- $errorString = "ERROR: $tag has already been defined";
- }
- else {
- ## Update the custom_types assignment
- $self->process_assignment_add('custom_types', $tag);
-
- if (!defined $self->{'matching_assignments'}->{$tag}) {
- my(@keys) = keys %custom;
- $self->{'matching_assignments'}->{$tag} = \@keys;
- }
-
- while(<$fh>) {
- my($line) = $self->strip_line($_);
-
- if ($line eq '') {
- }
- elsif ($line =~ /^}/) {
- $status = 1;
- $errorString = '';
- if (!defined $self->{'generated_exts'}->{$tag}->{'pre_filename'}) {
- $self->{'generated_exts'}->{$tag}->{'pre_filename'} = [ '' ];
- }
- if (!defined $self->{'generated_exts'}->{$tag}->{'pre_extension'}) {
- $self->{'generated_exts'}->{$tag}->{'pre_extension'} = [ '' ];
- }
- if (!defined $self->{'generated_exts'}->{$tag}->{'automatic'}) {
- $self->{'generated_exts'}->{$tag}->{'automatic'} = 1;
- }
- last;
- }
- else {
- my(@values) = ();
- ## If this returns true, then we've found an assignment
- if ($self->parse_assignment($line, \@values)) {
- my($type) = $values[0];
- my($name) = $values[1];
- my($value) = $values[2];
- if (defined $customDefined{$name}) {
- if ($name eq 'inputext') {
- $value = $self->escape_regex_special($value);
- my(@array) = split(/\s*,\s*/, $value);
- $self->process_array_assignment(
- \$self->{'valid_components'}->{$tag}, $type, \@array);
- }
- else {
- if (!defined $self->{'generated_exts'}->{$tag}) {
- $self->{'generated_exts'}->{$tag} = {};
- }
- if ($name eq 'command' || $name eq 'automatic' ||
- $name eq 'commandflags' || $name eq 'output_option') {
- if ($type eq 'assignment') {
- $self->process_assignment(
- $name, $value,
- $self->{'generated_exts'}->{$tag});
- }
- elsif ($type eq 'assign_add') {
- $self->process_assignment_add(
- $name, $value,
- $self->{'generated_exts'}->{$tag});
- }
- elsif ($type eq 'assign_sub') {
- $self->process_assignment_sub(
- $name, $value,
- $self->{'generated_exts'}->{$tag});
- }
- }
- else {
- ## Transform the name from something outputext to
- ## something files. We expect this to match the
- ## names of valid_assignments.
- $name =~ s/outputext/files/g;
-
- ## Get it ready for regular expressions
- $value = $self->escape_regex_special($value);
-
- ## Process the array assignment
- my(@array) = split(/\s*,\s*/, $value);
- $self->process_array_assignment(
- \$self->{'generated_exts'}->{$tag}->{$name},
- $type, \@array);
- }
- }
- }
- else {
- $status = 0;
- $errorString = "ERROR: Invalid assignment name: $name";
- last;
- }
- }
- }
- }
- }
-
- return $status, $errorString;
-}
-
-
-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_generated_files {
- my($self) = shift;
- my($gentype) = shift;
- my($tag) = shift;
- my($arr) = shift;
- my($names) = $self->{$tag};
- my($wanted) = $self->{'valid_components'}->{$gentype}->[0];
-
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $key (keys %$comps) {
- my(@added) = ();
- my($array) = $$comps{$key};
- foreach my $i (@$arr) {
- my($file) = $i;
- $file =~ s/$wanted$//;
- foreach my $pf (@{$self->{'generated_exts'}->{$gentype}->{'pre_filename'}}) {
- foreach my $pe (@{$self->{'generated_exts'}->{$gentype}->{'pre_extension'}}) {
- $self->list_generated_file($gentype, $tag, \@added, "$pf$file$pe");
- }
- }
- }
- 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()
- my(@sources) = $self->get_component_list('source_files');
- if (!$self->lib_target()) {
- my($fh) = new FileHandle();
- my($exename) = undef;
- foreach my $file (@sources) {
- 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;
- }
- }
-
- ## If we still don't have a project type, then we will
- ## default to a library if there are source files
- if (!$self->exe_target() && $#sources >= 0) {
- my($base) = $self->get_assignment('project_name');
- $self->process_assignment('sharedname', $base);
- $self->process_assignment('staticname', $base);
- }
- }
- }
-}
-
-
-sub generate_default_pch_filenames {
- my($self) = shift;
- my($files) = shift;
- my($pname) = $self->escape_regex_special(
- $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') {
- my($pch) = $self->get_assignment($type);
- if (defined $pch && $pch eq '') {
- $self->process_assignment($type, undef);
- }
- }
-}
-
-
-sub remove_extra_pch_listings {
- my($self) = shift;
- my(@pchs) = ('pch_header', 'pch_source');
- my(@tags) = ('header_files', 'source_files');
-
- for(my $j = 0; $j <= $#pchs; ++$j) {
- my($pch) = $self->get_assignment($pchs[$j]);
-
- if (defined $pch) {
- ## If we are converting slashes, then we need to
- ## convert the pch file back to forward slashes
- if ($self->convert_slashes()) {
- $pch =~ s/\\/\//g;
- }
-
- ## Find out which files are duplicated
- my($names) = $self->{$tags[$j]};
- 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) {
- if ($pch eq $$array[$i]) {
- splice(@$array, $i, 1);
- --$count;
- }
- }
- }
- }
- }
- }
-}
-
-
-sub is_special_tag {
- my($self) = shift;
- my($tag) = shift;
-
- foreach my $t (@specialComponents) {
- if ($tag eq $t) {
- return 1;
- }
- }
-
- return 0;
-}
-
-
-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]) {
- if ($#saved == 0) {
- ## Theres only one rc file, take it
- push(@$array, $saved[0]);
- }
- else {
- my($unescaped) = $self->transform_file_name(
- $self->get_assignment('project_name'));
- my($pjname) = $self->escape_regex_special($unescaped);
- foreach my $save (@saved) {
- my($file) = $self->escape_regex_special($save);
- if ($unescaped =~ /$file/ || $save =~ /$pjname/) {
- if (!$self->already_added($array, $save)) {
- push(@$array, $save);
- }
- }
- }
- }
- }
-}
-
-
-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 (defined $self->{'generated_exts'}->{$tag}) {
- if (defined $$array[0]) {
- $self->{'defaulted'}->{$tag} = 1;
- }
- }
- elsif ($tag eq 'source_files') {
- foreach my $gentype (keys %{$self->{'generated_exts'}}) {
- ## If we are auto-generating the source_files, then
- ## we need to make sure that any generated source
- ## files that are added are put at the front of the list.
- my(@front) = ();
- my(@copy) = @$array;
- my(@exts) = $self->generated_extensions($gentype, $tag);
-
- $self->{'defaulted'}->{$tag} = 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 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_extensions {
- my($self) = shift;
- my($name) = shift;
- my($tag) = shift;
- my(@exts) = ();
- my($gen) = $self->{'generated_exts'}->{$name};
-
- if (defined $gen->{$tag}) {
- foreach my $pe (@{$gen->{'pre_extension'}}) {
- foreach my $ext (@{$gen->{$tag}}) {
- push(@exts, "$pe$ext");
- }
- }
- }
- return @exts;
-}
-
-
-sub generated_source_listed {
- my($self) = shift;
- my($gent) = shift;
- my($tag) = shift;
- my($arr) = shift;
- my($names) = $self->{$tag};
- my(@gen) = $self->generated_extensions($gent, $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 (@$arr) {
- my($ifile) = $self->escape_regex_special($i);
- if ($val =~ /$ifile$ext$/) {
- push(@found, $val);
- }
- }
- }
- }
- }
- }
- return (defined $found[0]);
-}
-
-
-sub list_default_generated {
- my($self) = shift;
- my($gentype) = shift;
- my($tags) = shift;
-
- if ($self->{'defaulted'}->{$gentype} &&
- $self->{'generated_exts'}->{$gentype}->{'automatic'}) {
- ## After all source and headers have been defaulted, see if we
- ## need to add the generated .h, .i and .cpp files
- if (defined $self->{$gentype}) {
- ## Build up the list of files
- my(@arr) = ();
- my($wanted) = $self->{'valid_components'}->{$gentype}->[0];
- my($names) = $self->{$gentype};
- 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/$wanted$//;
- push(@arr, $f);
- }
- }
- }
-
- foreach my $type (@$tags) {
- if (!$self->generated_source_listed($gentype, $type, \@arr)) {
- $self->add_generated_files($gentype, $type, \@arr);
- }
- }
- }
- }
-}
-
-
-sub list_generated_file {
- my($self) = shift;
- my($gentype) = shift;
- my($tag) = shift;
- my($array) = shift;
- my($file) = shift;
-
- if (defined $self->{'generated_exts'}->{$gentype}->{$tag}) {
- my(@gen) = $self->get_component_list($gentype);
- my(@genexts) = $self->generated_extensions($gentype, $tag);
- foreach my $gen (@gen) {
- ## If we are converting slashes, then we need to
- ## convert the component back to forward slashes
- if ($self->convert_slashes()) {
- $gen =~ s/\\/\//g;
- }
-
- ## Remove the extension
- my($start) = $gen;
- foreach my $ext (@{$self->{'valid_components'}->{$gentype}}) {
- $gen =~ s/$ext$//;
- if ($gen ne $start) {
- last;
- }
- }
-
- ## See if we need to add the file
- foreach my $pf (@{$self->{'generated_exts'}->{$gentype}->{'pre_filename'}}) {
- foreach my $genext (@genexts) {
- if ("$pf$gen$genext" =~ /$file(.*)?$/) {
- my($created) = "$file$1";
- $created =~ s/\\//g;
- if (!$self->already_added($array, $created)) {
- push(@$array, $created);
- }
- last;
- }
- }
- }
- }
- }
-}
-
-
-sub add_corresponding_component_files {
- my($self) = shift;
- my($ftags) = shift;
- my($tag) = shift;
- my(@all) = ();
-
- foreach my $filetag (@$ftags) {
- my($names) = $self->{$filetag};
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- push(@all, @{$$comps{$comp}});
- }
- }
- }
-
- my(@exts) = ();
- my($names) = $self->{$tag};
-
- foreach my $ext (@{$self->{'valid_components'}->{$tag}}) {
- $ext =~ s/\\//g;
- push(@exts, $ext);
- }
-
- foreach my $name (keys %$names) {
- my($comps) = $$names{$name};
- foreach my $comp (keys %$comps) {
- my($array) = $$comps{$comp};
- foreach my $sfile (@all) {
- my($found) = 0;
- my($scopy) = $sfile;
- $scopy =~ s/\.[^\.]+$//;
- foreach my $file (@$array) {
- foreach my $ext (@exts) {
- if ("$scopy$ext" eq $file) {
- $found = 1;
- last;
- }
- if ($found) {
- last;
- }
- }
- }
-
- if (!$found) {
- foreach my $ext (@exts) {
- my($built) = "$scopy$ext";
- if (-r $built) {
- push(@$array, $built);
- $found = 1;
- last;
- }
- }
-
- if (!$found) {
- foreach my $gentype (keys %{$self->{'generated_exts'}}) {
- $self->list_generated_file($gentype, $tag, $array, $scopy);
- }
- }
- }
- }
- }
- }
-}
-
-
-sub get_default_project_name {
- my($self) = shift;
- my($name) = $self->get_current_input();
-
- if ($name eq '') {
- $name = $self->transform_file_name($self->base_directory());
- }
- else {
- ## Since files on UNIX can have back slashes, we transform them
- ## into underscores.
- $name =~ s/\\/_/g;
-
- ## Convert then name to a usable name
- $name = $self->transform_file_name($name);
-
- ## Take off the extension
- $name =~ s/\.[^\.]+$//;
- }
-
- return $name;
-}
-
-
-sub generate_defaults {
- my($self) = shift;
-
- ## Generate default project name
- if (!defined $self->get_assignment('project_name')) {
- $self->process_assignment('project_name',
- $self->get_default_project_name());
- }
-
- ## 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');
-
- ## If pch files are listed in header_files or source_files more than
- ## once, we need to remove the extras
- $self->remove_extra_pch_listings();
-
- ## Generate the default generated list of source files
- ## only if we defaulted the generated file list
- foreach my $gentype (keys %{$self->{'generated_exts'}}) {
- $self->list_default_generated($gentype, ['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_corresponding_component_files(['source_files',
- 'template_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->{'defaulted'}->{'source_files'}) {
- $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 check_custom_output {
- my($self) = shift;
- my($based) = shift;
- my($pf) = shift;
- my($cinput) = shift;
- my($type) = shift;
- my($comps) = shift;
- my(@outputs) = ();
- my($gen) = $self->{'generated_exts'}->{$based};
-
- if (defined $gen->{$type}) {
- foreach my $pe (@{$gen->{'pre_extension'}}) {
- foreach my $ext (@{$gen->{$type}}) {
- my($ge) = "$pe$ext";
- $ge =~ s/\\//g;
- my($built) = "$pf$cinput$ge";
- if (@$comps == 0) {
- push(@outputs, $built);
- last;
- }
- else {
- my($base) = $built;
- if ($self->convert_slashes()) {
- $base =~ s/\\/\//g;
- }
- my($re) = $self->escape_regex_special(basename($base));
- foreach my $c (@$comps) {
- ## We only match if the built file name matches from
- ## beginning to end or from a slash to the end.
- if ($c =~ /^$re$/ || $c =~ /\/$re$/) {
- push(@outputs, $built);
- last;
- }
- }
- }
- }
- }
- }
-
- return @outputs;
-}
-
-
-sub get_custom_value {
- my($self) = shift;
- my($cmd) = shift;
- my($based) = shift;
- my($value) = undef;
-
- if ($cmd eq 'input_files') {
- my($generic) = 'generic_files'; ## Matches with generic_outputext
- my(@array) = $self->get_component_list($based);
- $value = \@array;
-
- $self->{'custom_output_files'} = {};
- my(%vcomps) = ();
- foreach my $vc (keys %{$self->{'valid_components'}}, $generic) {
- my(@comps) = $self->get_component_list($vc);
- $vcomps{$vc} = \@comps;
- }
- foreach my $input (@array) {
- my(@outputs) = ();
- my($cinput) = $input;
- $cinput =~ s/\.[^\.]+$//;
- foreach my $pf (@{$self->{'generated_exts'}->{$based}->{'pre_filename'}}) {
- foreach my $vc (keys %{$self->{'valid_components'}}, $generic) {
- push(@outputs,
- $self->check_custom_output($based, $pf,
- $cinput, $vc, $vcomps{$vc}));
- }
- }
- $self->{'custom_output_files'}->{$input} = \@outputs;
- }
- }
- elsif ($cmd eq 'output_files') {
- # Generate output files based on $based
- if (defined $self->{'custom_output_files'}) {
- $value = $self->{'custom_output_files'}->{$based};
- }
- }
- elsif ($cmd eq 'inputexts') {
- my(@array) = @{$self->{'valid_components'}->{$based}};
- foreach my $val (@array) {
- $val =~ s/\\\.//g;
- }
- $value = \@array;
- }
- elsif ($cmd eq 'command' ||
- $cmd eq 'output_option' || defined $custom{$cmd}) {
- $value = $self->get_assignment($cmd,
- $self->{'generated_exts'}->{$based});
- }
-
- return $value;
-}
-
-
-sub check_features {
- my($self) = shift;
- my($requires) = $self->get_assignment('requires');
- my($status) = 1;
-
- if (defined $requires) {
- foreach my $require (split(/\s+/, $requires)) {
- my($fval) = $self->{'feature_parser'}->get_value($require);
-
- ## By default, if the feature is not listed, then it is enabled.
- if (defined $fval && !$fval) {
- $status = 0;
- last;
- }
- }
- }
-
- ## If it passes the requires, then check the avoids
- if ($status) {
- my($avoids) = $self->get_assignment('avoids');
- if (defined $avoids) {
- foreach my $avoid (split(/\s+/, $avoids)) {
- my($fval) = $self->{'feature_parser'}->get_value($avoid);
-
- ## By default, if the feature is not listed, then it is enabled.
- if (!defined $fval || $fval) {
- $status = 0;
- last;
- }
- }
- }
- }
-
- return $status;
-}
-
-
-sub need_to_write_project {
- my($self) = shift;
-
- if ($self->check_features()) {
- foreach my $key ('source_files', keys %{$self->{'generated_exts'}}) {
- my($names) = $self->{$key};
- foreach my $name (keys %$names) {
- foreach my $key (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);
- }
-
- ## First write the output to a temporary file
- my($tmp) = "MPC$>.$$";
- my($different) = 1;
- if (open($fh, ">$tmp")) {
- my($lines) = $tp->get_lines();
- foreach my $line (@$lines) {
- print $fh $line;
- }
- close($fh);
-
- if (-r $name &&
- -s $tmp == -s $name && compare($tmp, $name) == 0) {
- $different = 0;
- }
- }
- else {
- $error = "ERROR: Unable to open $tmp for output.";
- $status = 0;
- }
-
- if ($status) {
- ## If they are different, then rename the temporary file
- if ($different) {
- unlink($name);
- if (rename($tmp, $name)) {
- $self->add_file_written($name);
- }
- else {
- $error = "ERROR: Unable to open $name for output.";
- $status = 0;
- }
- }
- else {
- ## We will pretend that we wrote the file
- unlink($tmp);
- $self->add_file_written($name);
- }
- }
- }
- }
- }
- }
- 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);
- }
- }
-
- return $status, $error;
-}
-
-
-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 reset_generating_types {
- my($self) = shift;
- my(%reset) = ('matching_assignments' => \%ma,
- 'valid_components' => \%vc,
- 'generated_exts' => \%genext,
- 'exclude_components' => \%ec,
- );
-
- foreach my $r (keys %reset) {
- $self->{$r} = {};
- foreach my $key (keys %{$reset{$r}}) {
- $self->{$r}->{$key} = $reset{$r}->{$key};
- }
- }
-
- $self->{'custom_types'} = {};
-
- ## Allow subclasses to override the default extensions
- $self->set_component_extensions();
-}
-
-
-sub get_template_input {
- my($self) = shift;
-
- ## This follows along the same logic as read_template_input() by
- ## checking for exe target and then defaulting to a lib target
- if ($self->exe_target()) {
- if ($self->{'writing_type'} == 1) {
- return $self->{'lexe_template_input'};
- }
- else {
- return $self->{'dexe_template_input'};
- }
- }
-
- if ($self->{'writing_type'} == 1) {
- return $self->{'lib_template_input'};
- }
- else {
- return $self->{'dll_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;