summaryrefslogtreecommitdiff
path: root/ACE/bin/FOCUS/FOCUS.pl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/bin/FOCUS/FOCUS.pl')
-rwxr-xr-xACE/bin/FOCUS/FOCUS.pl186
1 files changed, 186 insertions, 0 deletions
diff --git a/ACE/bin/FOCUS/FOCUS.pl b/ACE/bin/FOCUS/FOCUS.pl
new file mode 100755
index 00000000000..b037b928b20
--- /dev/null
+++ b/ACE/bin/FOCUS/FOCUS.pl
@@ -0,0 +1,186 @@
+eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}'
+ & eval 'exec perl -S $0 $argv:q'
+ if 0;
+#########################################################################
+# FOCUS: A Feature Oriented Customization tool for ACE+TAO.
+#
+# Usage:
+# ======
+# --prefix-path - gives the prefix to the place where ACE+TAO is installed
+# --reactor-spl - provide the component that needs to be specialized
+# --protocol-spl - provide the concrete protocol to specialize
+# --output-prefix-path -
+# (Optional) if specified, copies all the files to the
+# output prefix. The directory structure is maintained.
+# That is if foo/bar.h file was specialized. Then the
+# output will be <prefix_output>/foo/bar.h
+#
+# Adding New Specializations
+# ===========================
+# (1) Add a new command line option if the specialization belongs to a
+# new family of components. For example, Concurrency strategy
+# (1.b) If not, then enhance exisiting option with a new value
+# (2) Associate a specialization file for the concrete component being
+# specialized.
+# (3) Update the specializations directory appropriately to add the
+# specializations file.
+#
+# @author Arvind S. Krishna <arvindk@dre.vanderbilt.edu>
+#
+# $Id$
+#
+########################################################################
+use Getopt::Long;
+
+# This script can be invoked from anywhere. We need to add this to the
+# path
+use lib "$ENV{ACE_ROOT}/bin";
+
+use FOCUS::Parser::FOCUSParser;
+
+sub usage
+{
+
+ # How to use FOCUS
+ # Currently FOCUS supports the specialization of reactor and protocol
+ # families
+ my $usage = "usage: \n ./FOCUS "
+ . " \n --prefix-path=<path to module root>"
+ . " [\n --reactor-spl=<select-mt, select-st, tp-reactor>"
+ . " \n --protocol-spl=<iiop>"
+ . " \n --wait-strategy-spl=<rw, lf>"
+ . " \n --output-prefix=<output path>"
+ . " \n --context-specific-optimizations=<dispatch>"
+ . " \n ]"
+ . "\n";
+ print "$usage \n";
+}
+
+# Global Table that maps the specialization name to the file
+# select => "../specializations/Reactor_Family/Select_Reactor.spl
+# For each component that one needs to specialize add an entry in
+# this simple global table to execute the specializations.
+
+# Get the ACE_ROOT ENV variable. Then the specializations
+# can be accessed via $ACE_ROOT/bin/FOCUS/.....
+my $spl_prefix_path = "";
+if (defined $ENV{"ACE_ROOT"})
+{
+ $spl_prefix_path = $ENV{"ACE_ROOT"};
+
+ # Check if the prefix path ends with a / or not
+ # if it does not then manually add the / to it
+ my $last = substr ($spl_prefix_path, -1);
+ if ($last ne "/")
+ {
+ $spl_prefix_path = $spl_prefix_path . "/";
+ }
+
+ # Add the bin/FOCUS directory to the prefix path
+ $spl_prefix_path = $spl_prefix_path . "bin/FOCUS/";
+
+}
+else
+{
+ print "FOCUS: ACE_ROOT environment variable not defined. Exiting... \n";
+ exit 1;
+}
+
+my %specialization_table = (
+ "select-mt", $spl_prefix_path . "specializations/Reactor_Family/Select_Reactor_MT.spl",
+ "select-st", $spl_prefix_path . "specializations/Reactor_Family/Select_Reactor_ST.spl",
+ "tp-reactor",$spl_prefix_path . "specializations/Reactor_Family/TP_Reactor.spl",
+ "iiop", $spl_prefix_path . "specializations/Protocol_Family/IIOP/iiop.spl",
+ "rw", $spl_prefix_path . "specializations/Wait_Strategy/Wait_On_Read.spl",
+ "lf", $spl_prefix_path . "specializations/Wait_Strategy/Wait_On_Leader_Follower.spl",
+ "dispatch", $spl_prefix_path . "specializations/Context-Specific-Optimizations/Dispatch-Resolution-Optimization.spl");
+
+# Get the command line options
+my $ret = GetOptions ("prefix-path=s" => \$prefix_path,
+ "reactor-spl=s" => \$reactor_type,
+ "protocol-spl=s" => \$protocol_type,
+ "wait-strategy-spl=s" => \$wait_strat_type,
+ "output-prefix:s" => \$output_prefix,
+ "context-specific-optimizations=s" => \$context_opt);
+
+# Check if the prefix path is specified
+if (!$prefix_path)
+{
+ usage;
+ exit 1;
+}
+
+#
+# Check if the optional outputpath is specified
+# if it not specified then the output_prefix will
+# be same as the prefix_path.
+# So if the prefix is something like:
+# /build/arvindk/ACE_wrappers, then the output_prefix
+# will be the same.
+#
+# Upshot: The source files will be directly replaced.
+#
+if (! $output_prefix)
+{
+ $output_prefix = $prefix_path;
+}
+
+# Check if the type of each component specialized is valid!
+if ($reactor_type)
+{
+ my $spl_file = $specialization_table {$reactor_type};
+ if (! length ($spl_file))
+ {
+ print "Invalid reactor type specified \n";
+ usage;
+ exit 1;
+ }
+
+ # specialize the Reactor component
+ FOCUSParser::Specialize_Components ($prefix_path, $spl_file, $output_prefix);
+}
+
+# protocol specialization
+if ($protocol_type)
+{
+ my $spl_file = $specialization_table {$protocol_type};
+ if (! spl_file)
+ {
+ print "Invalid reactor type specified \n";
+ usage;
+ exit 1;
+ }
+
+ # specialize the Protocol component
+ FOCUSParser::Specialize_Components ($prefix_path, $spl_file, $output_prefix);
+}
+
+# Wait Strategy specialization
+if ($wait_strat_type)
+{
+ my $spl_file = $specialization_table {$wait_strat_type};
+ if (! spl_file)
+ {
+ print "Invalid specialization for the Wait strategy \n";
+ usage;
+ exit 1;
+ }
+
+ # specialize the wait strategy
+ FOCUSParser::Specialize_Components ($prefix_path, $spl_file, $output_prefix);
+}
+
+# Context specific optimizations present
+if ($context_opt)
+{
+ my $spl_file = $specialization_table {$context_opt};
+ if (! spl_file)
+ {
+ print "Invalid Context specialization optimization specified\n";
+ usage;
+ exit 1;
+ }
+
+ # specialize the wait strategy
+ FOCUSParser::Specialize_Components ($prefix_path, $spl_file, $output_prefix);
+}