summaryrefslogtreecommitdiff
path: root/ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm')
-rw-r--r--ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm265
1 files changed, 265 insertions, 0 deletions
diff --git a/ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm b/ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm
new file mode 100644
index 00000000000..4d645b2411d
--- /dev/null
+++ b/ACE/bin/MakeProjectCreator/modules/GNUACEWorkspaceCreator.pm
@@ -0,0 +1,265 @@
+package GNUACEWorkspaceCreator;
+
+# ************************************************************
+# Description : A GNU Workspace (GNUmakefile) creator for ACE
+# Author : Chad Elliott
+# Create Date : 5/13/2002
+# ************************************************************
+
+# ************************************************************
+# Pragmas
+# ************************************************************
+
+use strict;
+
+use GNUACEProjectCreator;
+use WorkspaceCreator;
+
+use vars qw(@ISA);
+@ISA = qw(WorkspaceCreator);
+
+# ************************************************************
+# Data Section
+# ************************************************************
+
+my($base) = 'GNUmakefile';
+
+# ************************************************************
+# Subroutine Section
+# ************************************************************
+
+sub generate_implicit_project_dependencies {
+ #my($self) = shift;
+ return 1;
+}
+
+
+sub workspace_file_name {
+ my($self) = shift;
+ return $self->get_modified_workspace_name($base, '');
+}
+
+
+sub workspace_per_project {
+ #my($self) = shift;
+ return 1;
+}
+
+
+sub pre_workspace {
+ my($self) = shift;
+ my($fh) = shift;
+ my($crlf) = $self->crlf();
+
+ print $fh '# -*- makefile -*-', $crlf,
+ '#-------------------------------------------------------------------------', $crlf,
+ '# GNU ACE Workspace', $crlf,
+ '#', $crlf,
+ '# $Id$', $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,
+ '#', $crlf,
+ '# MPC Command:', $crlf,
+ "# $0 @ARGV", $crlf,
+ '#', $crlf,
+ '#-------------------------------------------------------------------------', $crlf,
+ 'MAKEFILE = ', $self->get_modified_workspace_name($base, '', 1),
+ $crlf;
+}
+
+
+sub write_comps {
+ my($self) = shift;
+ my($fh) = shift;
+ my($crlf) = $self->crlf();
+ my(%targnum) = ();
+ my($pjs) = $self->get_project_info();
+ my($named) = !defined $ENV{MPC_GNUACE_DIRECTORY_DEPS};
+ my(@list) = $self->number_target_deps($self->get_projects(),
+ $pjs, \%targnum,
+ $named ? 0 : 1);
+
+ ## Print out some preliminary information
+ print $fh $crlf,
+ "ifeq (\$(findstring k,\$(MAKEFLAGS)),k)$crlf",
+ " KEEP_GOING = -$crlf",
+ "endif$crlf$crlf",
+ "include \$(ACE_ROOT)/include/makeinclude/macros.GNU$crlf",
+ $crlf;
+
+ if ($named) {
+ $self->write_named_targets($fh, $crlf, \%targnum, \@list);
+ }
+ else {
+ ## Determine the ordering of the sub-directories
+ my(@dirs) = ();
+ my(%found) = ();
+ foreach my $file (reverse @list) {
+ my($dir) = $self->get_first_level_directory($file);
+ if ($dir ne '.') {
+ if (!defined $found{$dir}) {
+ $found{$dir} = 1;
+ unshift(@dirs, $dir);
+ }
+ }
+ }
+ my($need_dirs) = ($#dirs > -1);
+
+ ## Store the local projects in a separate list
+ my(@lprj) = ();
+ my(%dirprj) = ();
+ foreach my $project (@list) {
+ if ($project !~ /\//) {
+ push(@lprj, $project);
+ if ($need_dirs && defined $targnum{$project}) {
+ foreach my $number (@{$targnum{$project}}) {
+ if ($list[$number] =~ /\//) {
+ ## If any local project depends on a project that is not
+ ## in this directory, we can not rely on the directory
+ ## recursion to get the correct dependencies. We will do
+ ## all projects as local targets.
+ @lprj = ();
+ foreach my $prj (@list) {
+ push(@lprj, $prj);
+ if ($prj =~ /\//) {
+ $dirprj{$prj} = 1;
+ }
+ }
+ $need_dirs = 0;
+ last;
+ }
+ }
+ if (!$need_dirs) {
+ last;
+ }
+ }
+ }
+ }
+
+ if ($#lprj >= 0) {
+ ## Print out the all target first. This will allow multiple projects
+ ## within the same directory to build in parallel.
+ print $fh 'all:';
+ foreach my $project (@lprj) {
+ print $fh ' ', $$pjs{$project}->[0];
+ }
+ print $fh $crlf;
+ if ($need_dirs) {
+ foreach my $dir (@dirs) {
+ print $fh "\t\$(KEEP_GOING)\@cd $dir && ",
+ "\$(MAKE) -f \$(MAKEFILE) \$(\@)$crlf";
+ }
+ }
+
+ ## Print out each target separately. Make can decide on which
+ ## targets can be built in parallel because we add the local
+ ## dependencies.
+ foreach my $project (@lprj) {
+ print $fh $crlf, '.PHONY: ', $$pjs{$project}->[0],
+ $crlf, $$pjs{$project}->[0], ':';
+ if (defined $targnum{$project}) {
+ foreach my $number (@{$targnum{$project}}) {
+ print $fh ' ', $$pjs{$list[$number]}->[0];
+ }
+ }
+ print $fh $crlf,
+ "\t\$(KEEP_GOING)\@";
+ if (defined $dirprj{$project}) {
+ print $fh "cd ", $self->mpc_dirname($project),
+ " && \$(MAKE) -f ", $self->mpc_basename($project),
+ $crlf;
+ }
+ else {
+ print $fh "\$(MAKE) -f $project$crlf";
+ }
+ }
+ print $fh $crlf,
+ 'REMAINING_TARGETS := ',
+ '$(subst all, , $(TARGETS_NESTED:.nested=)) $(CUSTOM_TARGETS)',
+ $crlf;
+ }
+ else {
+ print $fh 'REMAINING_TARGETS := $(TARGETS_NESTED:.nested=) ',
+ '$(CUSTOM_TARGETS)', $crlf;
+ }
+
+ ## Print out the remaing targets.
+ ## They will be handled serially by make.
+ print $fh "\$(REMAINING_TARGETS):$crlf";
+ foreach my $project (@lprj) {
+ print $fh "\t\$(KEEP_GOING)\@";
+ if (defined $dirprj{$project}) {
+ print $fh "cd ", $self->mpc_dirname($project),
+ " && \$(MAKE) -f ", $self->mpc_basename($project),
+ " \$(\@)", $crlf;
+ }
+ else {
+ print $fh "\$(MAKE) -f $project \$(\@)$crlf";
+ }
+ }
+ if ($need_dirs) {
+ foreach my $dir (@dirs) {
+ print $fh "\t\$(KEEP_GOING)\@cd $dir && ",
+ "\$(MAKE) -f \$(MAKEFILE) \$(\@)$crlf";
+ }
+ }
+ print $fh $crlf;
+ }
+}
+
+sub write_named_targets {
+ my($self) = shift;
+ my($fh) = shift;
+ my($crlf) = shift;
+ my($targnum) = shift;
+ my($list) = shift;
+ my($trans) = $self->project_target_translation(1);
+
+ ## Print out the "all" target
+ print $fh 'all:';
+ foreach my $project (@$list) {
+ print $fh " $$trans{$project}";
+ }
+
+ ## Print out all other targets here
+ print $fh $crlf,
+ 'REMAINING_TARGETS := ',
+ '$(subst all, , $(TARGETS_NESTED:.nested=)) $(CUSTOM_TARGETS)',
+ "$crlf$crlf\$(REMAINING_TARGETS):$crlf";
+ foreach my $project (@$list) {
+ my($dname) = $self->mpc_dirname($project);
+ print $fh "\t\@",
+ ($dname ne '.' ? "cd $dname && " : ''),
+ "\$(MAKE) -f ",
+ ($dname eq '.' ? $project : $self->mpc_basename($project)),
+ " \$(\@)$crlf";
+ }
+
+ ## Print out each target separately
+ foreach my $project (@$list) {
+ my($dname) = $self->mpc_dirname($project);
+ print $fh $crlf, '.PHONY: ', $$trans{$project},
+ $crlf, $$trans{$project}, ':';
+ if (defined $$targnum{$project}) {
+ foreach my $number (@{$$targnum{$project}}) {
+ print $fh " $$trans{$$list[$number]}";
+ }
+ }
+
+ print $fh $crlf,
+ "\t\@",
+ ($dname ne '.' ? "cd $dname && " : ''),
+ "\$(MAKE) -f ",
+ ($dname eq '.' ? $project : $self->mpc_basename($project)),
+ ' all', $crlf;
+ }
+
+ ## Print out the project_name_list target
+ print $fh $crlf, "project_name_list:$crlf";
+ foreach my $project (sort @$list) {
+ print $fh "\t\@echo $$trans{$project}$crlf";
+ }
+}
+
+1;