summaryrefslogtreecommitdiff
path: root/ACE/MPC/modules/GHSWorkspaceCreator.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/MPC/modules/GHSWorkspaceCreator.pm')
-rw-r--r--ACE/MPC/modules/GHSWorkspaceCreator.pm199
1 files changed, 199 insertions, 0 deletions
diff --git a/ACE/MPC/modules/GHSWorkspaceCreator.pm b/ACE/MPC/modules/GHSWorkspaceCreator.pm
new file mode 100644
index 00000000000..9236b1cb5d7
--- /dev/null
+++ b/ACE/MPC/modules/GHSWorkspaceCreator.pm
@@ -0,0 +1,199 @@
+package GHSWorkspaceCreator;
+
+# ************************************************************
+# Description : A GHS Workspace creator for version 4.x
+# Author : Chad Elliott
+# Create Date : 7/3/2002
+# ************************************************************
+
+# ************************************************************
+# Pragmas
+# ************************************************************
+
+use strict;
+
+use GHSProjectCreator;
+use WorkspaceCreator;
+
+use vars qw(@ISA);
+@ISA = qw(WorkspaceCreator);
+
+# ************************************************************
+# Data Section
+# ************************************************************
+
+my %directives = ('I' => 1,
+ 'L' => 1,
+ 'D' => 1,
+ 'l' => 1,
+ 'G' => 1,
+ 'non_shared' => 1,
+ 'bsp' => 1,
+ 'os_dir' => 1,
+ );
+my $tgt;
+my $integrity = '[INTEGRITY Application]';
+my @integ_bsps;
+
+# ************************************************************
+# Subroutine Section
+# ************************************************************
+
+sub compare_output {
+ #my $self = shift;
+ return 1;
+}
+
+
+sub workspace_file_name {
+ return $_[0]->get_modified_workspace_name('default', '.gpj');
+}
+
+
+sub pre_workspace {
+ my($self, $fh) = @_;
+ my $crlf = $self->crlf();
+ my $prjs = $self->get_projects();
+
+ ## Take the primaryTarget from the first project in the list
+ if (defined $$prjs[0]) {
+ my $fh = new FileHandle();
+ my $outdir = $self->get_outdir();
+ if (open($fh, "$outdir/$$prjs[0]")) {
+ while(<$fh>) {
+ if (/^#primaryTarget=(.+)$/) {
+ $tgt = $1;
+ last;
+ }
+ }
+ close($fh);
+ }
+ }
+
+ ## Print out the preliminary information
+ print $fh "#!gbuild$crlf",
+ "primaryTarget=$tgt$crlf",
+ "[Project]$crlf",
+ "\t--one_instantiation_per_object$crlf",
+ "\t:sourceDir=.$crlf",
+ "\t--std$crlf",
+ "\t-language=cxx$crlf",
+ "\t--long_long$crlf",
+ "\t--new_style_casts$crlf";
+}
+
+
+sub create_integrity_project {
+ my($self, $int_proj, $project, $type, $target) = @_;
+ my $outdir = $self->get_outdir();
+ my $crlf = $self->crlf();
+ my $fh = new FileHandle();
+ my $int_file = $int_proj;
+ $int_file =~ s/\.gpj$/.int/;
+
+ if (open($fh, ">$outdir/$int_proj")) {
+ ## First print out the project file
+ print $fh "#!gbuild$crlf",
+ "\t$integrity$crlf",
+ "$project\t\t$type$crlf",
+ "$int_file$crlf";
+ foreach my $bsp (@integ_bsps) {
+ print $fh "$bsp$crlf";
+ }
+ close($fh);
+
+ ## Next create the integration file
+ if (open($fh, ">$outdir/$int_file")) {
+ print $fh "Kernel$crlf",
+ "\tFilename\t\t\tDynamicDownload$crlf",
+ "EndKernel$crlf$crlf",
+ "AddressSpace$crlf",
+ "\tFilename\t\t\t$target$crlf",
+ "\tLanguage\t\t\tC++$crlf",
+ "\tLibrary\t\t\t\tlibINTEGRITY.so$crlf",
+ "\tLibrary\t\t\t\tlibc.so$crlf",
+ "\tLibrary\t\t\t\tlibscxx_e.so$crlf",
+ "\tTask Initial$crlf",
+ "\t\tStackLength\t\t0x8000$crlf",
+ "\tEndTask$crlf",
+ "EndAddressSpace$crlf";
+ close($fh);
+ }
+ }
+}
+
+
+sub mix_settings {
+ my($self, $project) = @_;
+ my $rh = new FileHandle();
+ my $mix = $project;
+ my $outdir = $self->get_outdir();
+
+ ## Things that seem like they should be set in the project
+ ## actually have to be set in the controlling project file.
+ if (open($rh, "$outdir/$project")) {
+ my $crlf = $self->crlf();
+ my $integrity_project = (index($tgt, 'integrity') >= 0);
+ my($int_proj, $int_type, $target);
+
+ while(<$rh>) {
+ if (/^\s*(\[(Program|Library|Subproject)\])\s*$/) {
+ my $type = $1;
+ if ($integrity_project && $type eq '[Program]') {
+ $int_proj = $project;
+ $int_proj =~ s/(\.gpj)$/_int$1/;
+ $int_type = $type;
+ $mix =~ s/(\.gpj)$/_int$1/;
+ $type = $integrity;
+ }
+ $mix .= "\t\t$type$crlf" .
+ "\t-object_dir=" . $self->mpc_dirname($project) .
+ '/.obj' . $crlf;
+ }
+ elsif (/^\s*(\[Shared Object\])\s*$/) {
+ $mix .= "\t\t$1$crlf" .
+ "\t-pic$crlf" .
+ "\t-object_dir=" . $self->mpc_dirname($project) .
+ '/.shobj' . $crlf;
+ }
+ elsif ($integrity_project && /^(.*\.bsp)\s/) {
+ push(@integ_bsps, $1);
+ }
+ else {
+ if (/^\s*\-((\w)\w*)/) {
+ ## Save the required options into the mixed project string
+ if (defined $directives{$2} || defined $directives{$1}) {
+ $mix .= $_;
+ }
+
+ ## If this is an integrity project, we need to find out
+ ## what the output file will be for the integrate file.
+ if (defined $int_proj && /^\s*\-o\s+(.*)\s$/) {
+ $target = $1;
+ }
+ }
+ }
+ }
+ if (defined $int_proj) {
+ $self->create_integrity_project($int_proj, $project,
+ $int_type, $target);
+ }
+ close($rh);
+ }
+
+ return $mix;
+}
+
+
+sub write_comps {
+ my($self, $fh) = @_;
+
+ ## Print out each projet
+ foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) {
+ print $fh $self->mix_settings($project);
+ }
+}
+
+
+
+1;