package WB26WorkspaceCreator;
# ************************************************************
# Description : Workbench 2.6 / VxWorks 6.4 generator
# Author : Johnny Willemsen
# Create Date : 07/01/2008
# ************************************************************
# ************************************************************
# Pragmas
# ************************************************************
use strict;
use WB26ProjectCreator;
use WorkspaceCreator;
use vars qw(@ISA);
@ISA = qw(WorkspaceCreator);
# ************************************************************
# Subroutine Section
# ************************************************************
sub requires_make_coexistence {
#my $self = shift;
return 1;
}
sub supports_make_coexistence {
#my $self = shift;
return 1;
}
sub workspace_file_name {
#my $self = shift;
return 'org.eclipse.core.resources.prefs';
}
sub get_project_prefix {
return '';
}
sub pre_workspace {
my($self, $fh) = @_;
my $crlf = $self->crlf();
## Optionally print the workspace comment
$self->print_workspace_comment($fh,
'#----------------------------------------------------------------------------', $crlf,
'# WindRiver Workbench generator', $crlf,
'#', $crlf,
'# This file was generated by MPC. Any changes made directly to', $crlf,
'# this file will be lost the next time it is generated.', $crlf,
'# This file should be placed in the .metadata/.plugins/org.eclipse.core.runtime/.settings directory', $crlf,
'#', $crlf,
'# MPC Command:', $crlf,
"# ", $self->create_command_line_string($0, @ARGV), $crlf,
'#----------------------------------------------------------------------------', $crlf);
## Unchanging initial settings
print $fh 'version=1', $crlf,
'eclipse.preferences.version=1', $crlf,
'description.defaultbuildorder=false', $crlf;
}
sub write_comps {
my($self, $fh) = @_;
my $pjs = $self->get_project_info();
my @list = $self->sort_dependencies($self->get_projects(), 0);
my $pre = $self->get_project_prefix();
## Print out the target
print $fh 'description.buildorder=';
foreach my $project (@list) {
print $fh $pre, $$pjs{$project}->[ProjectCreator::PROJECT_NAME], '/';
}
print $fh $self->crlf();
}
sub post_workspace {
my($self, $fh, $creator) = @_;
my $crlf = $self->crlf();
## Clear out the seen dependency hash for use within the
## add_dependencies method.
$self->{'seen_deps'} = {};
## Print out the project dependencies
foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) {
print $fh "$project$crlf";
$self->add_dependencies($creator, $project);
}
}
sub get_additional_output {
## Create the accompanying list file. It always goes in the same
## directory as the first workspace output file. See
## WorkspaceCreator.pm for a description of the array elements.
return [[undef, 'wb26projects.lst', \&list_file_body]];
}
sub list_file_body {
my($self, $fh) = @_;
my $crlf = $self->crlf();
## Optionally print the workspace comment
$self->print_workspace_comment($fh,
'#----------------------------------------------------------------------------', $crlf,
'# WindRiver Workbench generator', $crlf,
'#', $crlf,
'# This file was generated by MPC. Any changes made directly to', $crlf,
'# this file will be lost the next time it is generated.', $crlf,
'# MPC Command:', $crlf,
"# ", $self->create_command_line_string($0, @ARGV), $crlf,
'#----------------------------------------------------------------------------', $crlf);
## Print out each target separately
foreach my $project ($self->sort_dependencies($self->get_projects(), 0)) {
print $fh $self->mpc_dirname($project), '/.project', $crlf;
}
}
sub add_dependencies {
my($self, $creator, $proj) = @_;
my $outdir = $self->mpc_dirname($proj);
my $into = $self->get_outdir();
$outdir = "$into/$outdir" if $into ne '.';
my $proj_pre = $self->get_project_prefix();
## These values will be changed after the first time through the for
## loop below.
my $pre = "\t\t" . '';
my $post = '';
my $outfile = $outdir . '/.project';
## Go through twice to edit both the .project and .wrproject files
for(my $i = 0; $i < 2; $i++) {
my $fh = new FileHandle();
if (open($fh, $outfile)) {
## Get the dependencies and store them based on the directory of
## the project file. We will check them later.
my $deps = $self->get_validated_ordering($proj);
my $key = $self->mpc_basename($self->mpc_dirname($proj));
$self->{'seen_deps'}->{$key} = {};
foreach my $dep (@$deps) {
$self->{'seen_deps'}->{$key}->{$dep} = 1;
}
my @read = ();
my $cwd = $self->getcwd();
while(<$fh>) {
## This is a comment found in wb26.mpd and wb26wrproject.mpd if
## the project is an executable, contains the 'after' keyword
## setting, and the 'enable_subprojects' template variable.
if (/MPC\s+ADD\s+DEPENDENCIES/) {
my $crlf = $self->crlf();
my %seen = ();
my @lines;
foreach my $dep (reverse @$deps) {
## If we've seen this dependency, we don't need to add it
## again. The build tool will handle it correctly.
if (!$seen{$dep}) {
my $relative = $self->get_relative_dep_file($creator,
"$cwd/$proj", $dep);
## Since we're looking at the dependencies in reverse order
## now, we need to unshift them into another array to keep
## the correct order.
if (defined $relative) {
unshift(@lines, "$pre$proj_pre$dep$post$crlf");
}
## We've now seen this dependency and all of the
## projects upon which this one depends.
$seen{$dep} = 1;
foreach my $key (keys %{$self->{'seen_deps'}->{$dep}}) {
$seen{$key} = 1;
}
}
}
## Add the dependency lines to the project file
push(@read, @lines);
}
else {
push(@read, $_);
}
}
close($fh);
## We will always rewrite the project file (with or without
## dependencies).
if (open($fh, ">$outfile")) {
foreach my $line (@read) {
print $fh $line;
}
close($fh);
}
}
## The dependencies need to go into the .wrproject too, so transform
## the name and the pre and post values.
$outfile = $outdir . '/.wrproject';
$pre = ' ';
}
}
1;