1
1
openmpi/config/mca_make_configure.pl
George Bosilca d33801c0fa Rollback the last two commits.
svn merge -r 19823:19821 https://svn.open-mpi.org/svn/ompi/trunk ./

I copied the config directory in another location, and the original
.svn directory was replaced by the Open MPI one ... As a result my
first commit, applied the changes on the Open MPI trunk instead of
the other project.

This commit was SVN r19824.
2008-10-28 17:22:29 +00:00

394 строки
13 KiB
Perl
Исполняемый файл

#!/usr/bin/env perl
#
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
# University Research and Technology
# Corporation. All rights reserved.
# Copyright (c) 2004-2005 The University of Tennessee and The University
# of Tennessee Research Foundation. All rights
# reserved.
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
# University of Stuttgart. All rights reserved.
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
#
# $HEADER$
#
use strict;
use Carp;
use Cwd;
use Getopt::Long;
use File::Basename;
############################################################################
# Local variables
############################################################################
my $ompi_topdir;
my $component_topdir;
my %config_values;
my %config_params;
my $initial_cwd = cwd();
my $announce_str = "Open MPI MCA component configure generator";
my %config_param_names = (PIFILE => "PARAM_INIT_FILE",
PCFGAUXDIR => "PARAM_CONFIG_AUX_DIR",
PC => "PARAM_WANT_C",
PCXX => "PARAM_WANT_CXX",
PVARPREFIX => "PARAM_VAR_PREFIX",
PAMNAME => "PARAM_AM_NAME",
PCFGHDRFILE => "PARAM_CONFIG_HEADER_FILE",
PCFGFILES => "PARAM_CONFIG_FILES",
PCOMPILEEXT => "PARAM_WANT_COMPILE_EXTERNAL",
);
############################################################################
# Command line arg procemcang
############################################################################
Getopt::Long::Configure("bundling", "require_order");
my $ok = Getopt::Long::GetOptions("ompidir|l=s" => \$ompi_topdir,
"componentdir|m=s" => \$component_topdir);
if (!$ok) {
print "Usage: $0 [--ompidir=DIR] [--componentdir=DIR]\n";
exit(1);
}
############################################################################
# Try to figure out the ompi and component topdirs
############################################################################
print "$announce_str starting\n";
if (!$ompi_topdir) {
$ompi_topdir = dirname($0);
}
chdir($ompi_topdir);
$ompi_topdir = cwd();
chdir($initial_cwd);
if (!$ompi_topdir || ! -f "$ompi_topdir/autogen.sh") {
croak("Unable to find OMPI base directory (try using --ompidir)");
}
if (!$component_topdir) {
$component_topdir = $initial_cwd;
if ($component_topdir eq $ompi_topdir) {
croak("Unable to determine which component to operate on");
}
}
chdir($component_topdir);
$component_topdir = cwd();
chdir($initial_cwd);
if (!$ompi_topdir || ! -d $component_topdir) {
croak("Unable to find component directory (try using --componentdir)");
}
# Print them out
print "--> Found OMPI top dir: $ompi_topdir\n";
print "--> Found component top dir: $component_topdir\n";
# If we have a configure.params file in the component topdir, we're good to
# go.
if (! -f "$component_topdir/configure.params") {
die("No configure.params in component topdir; nothing to do");
}
# Make a backup
if (-f "$component_topdir/acinclude.m4") {
printf(" *** WARNING: Replacing old acinclude.m4\n");
unlink("$component_topdir/acinclude.m4.bak");
rename("$component_topdir/acinclude.m4", "$component_topdir/acinclude.m4.bak");
}
if (-f "$component_topdir/configure.ac") {
printf(" *** WARNING: Replacing old configure.ac\n");
unlink("$component_topdir/configure.ac.bak");
rename("$component_topdir/configure.ac", "$component_topdir/configure.ac.bak");
}
############################################################################
# Set and calculate sensible default parameter values
############################################################################
# Unchangeable values
# MCA_TYPE: calculate
$config_values{"MCA_TYPE"} = dirname($component_topdir);
$config_values{"MCA_TYPE"} = basename($config_values{"MCA_TYPE"});
# PROCESSED_MCA_TYPE: For "special" MCA types, like "crompi" and
# "crmpi".
$config_values{"PROCESSED_MCA_TYPE"} = $config_values{"MCA_TYPE"};
if ($config_values{"PROCESSED_MCA_TYPE"} eq "crompi" ||
$config_values{"PROCESSED_MCA_TYPE"} eq "crmpi") {
$config_values{"PROCESSED_MCA_TYPE"} = "cr";
}
# MCA_NAME: calculate
$config_values{"MCA_COMPONENT_NAME"} = basename($component_topdir);
# Parameter (changeable) values
# PARAM_COMPILE_EXTERNAL: set
$config_params{$config_param_names{PCOMPILEEXT}} = 0;
# PARAM_CONFIG_AUX_DIR: set
if (-d "$component_topdir/config") {
$config_params{$config_param_names{PCFGAUXDIR}} = "config";
} else {
$config_params{$config_param_names{PCFGAUXDIR}} = ".";
}
$config_params{$config_param_names{PC}} = 1;
$config_params{$config_param_names{PCXX}} = 0;
# PARAM_VAR_PREFIX: calculate
$config_params{$config_param_names{PVARPREFIX}} =
"MCA_" . $config_values{"MCA_TYPE"} .
"_" . $config_values{"MCA_COMPONENT_NAME"};
# PARAM_AM_NAME: calculate
$config_params{$config_param_names{PAMNAME}} =
lc($config_values{"MCA_TYPE"}) .
"-" . lc($config_values{"MCA_COMPONENT_NAME"});
# PARAM_CONFIG_HEADER_FILE: calculate
$config_params{$config_param_names{PCFGHDRFILE}} =
"src/" . lc($config_values{"MCA_TYPE"}) .
"_" . lc($config_values{"MCA_COMPONENT_NAME"}) . "_config.h";
# Is there a config.stub file in the component topdir?
if (-f "$component_topdir/configure.stub") {
$config_values{CONFIGURE_STUB_SINCLUDE} = "#
# Component-specific tests
#
sinclude(configure.stub)\n";
$config_values{CONFIGURE_STUB_MACRO} =
"ompi_show_subtitle \"MCA " . $config_values{"MCA_TYPE"} . " " .
$config_values{"MCA_COMPONENT_NAME"} . "-specific setup\"
MCA_CONFIGURE_STUB";
# See if there's a CONFIGURE_DIST_STUB in configure.stub
open(STUB, "$component_topdir/configure.stub");
my $found = 0;
while (<STUB>) {
$found = 1
if ($_ =~ /MCA_CONFIGURE_DIST_STUB/);
}
close(STUB);
if ($found == 1) {
$config_values{CONFIGURE_DIST_STUB_MACRO} =
"ompi_show_subtitle \"MCA " . $config_values{"MCA_TYPE"} . " " .
$config_values{"MCA_COMPONENT_NAME"} .
"-specific setup (dist specific!)\"
MCA_CONFIGURE_DIST_STUB";
} else {
$config_values{CONFIGURE_DIST_STUB_MACRO} = "true";
}
} else {
$config_values{CONFIGURE_STUB_SINCLUDE} = "";
$config_values{CONFIGURE_STUB_MACRO} = "true";
$config_values{CONFIGURE_DIST_STUB_MACRO} = "true";
}
############################################################################
# Read in the configure.params file (possibly overriding the defaults
# set above)
############################################################################
my $found = 0;
my @names = values %config_param_names;
open(PARAMS, "$component_topdir/configure.params") ||
die("Could not open configure.params in $component_topdir");
while (<PARAMS>) {
chomp;
# Ignore comments and blank lines
my $line = $_;
$line =~ s/^[ \t]+(.*)[ \t]+$/\1/;
$line =~ s/(.*)[\#]+.*/\1/;
next if (length($line) == 0);
# So we have a key=value line
# Split into componenty, and remove quotes
my ($key, $value) = split(/=/, $line);
$key =~ s/^[ \t]+(.*)[ \t]+$/\1/;
$value =~ s/^[ \t]+(.*)[ \t]+$/\1/;
$value =~ s/^[\"](.*)[\"]$/\1/;
$value =~ s/^[\'](.*)[\']$/\1/;
for (my $i = 0; $i <= $#names; ++$i) {
if ($key eq $names[$i]) {
if (!$found) {
printf("--> Found parameter override(s):\n");
$found = 1;
}
printf(" $key = $value\n");
$config_params{$key} = $value;
last;
}
}
}
# Print out the values
print "--> Final configuration values:\n";
foreach my $key (sort keys(%config_param_names)) {
print " $config_param_names{$key} = " .
$config_params{$config_param_names{$key}} . "\n";
}
# Do some error checking on the values that we've determined
if (! -f $config_params{PARAM_INIT_FILE}) {
print "*** WARNING: PARAM_INIT_FILE does not exist:\n";
print "*** WARNING: $config_params{PARAM_INIT_FILE}\n";
print "*** WARNING: resulting configure script will not run properly!\n";
exit(1);
}
my @files = split(/ /, $config_params{PARAM_CONFIG_FILES});
foreach my $file (@files) {
if (! -f "$file.in" && ! -f "$file.am") {
print "*** WARNING: PARAM_CONFIG_FILES file does not exist:\n";
print "*** WARNING: $file.[in|am]\n";
print "*** WARNING: resulting configure script may not run correctly!!\n";
exit(1);
}
}
if (! -d $config_params{PARAM_CONFIG_AUX_DIR}) {
print "*** WARNING: PARAM_CONFIG_AUX_DIR does not exit:\n";
print "*** WARNING: $config_params{PARAM_CONFIG_AUX_DIR}\n";
print "*** WARNING: Taking the liberty of trying to make it...\n";
if (!mkdir($config_params{PARAM_CONFIG_AUX_DIR})) {
print "*** ERROR: Failed to make AUX_DIR: $config_params{PARAM_CONFIG_AUX_DIR}\n";
print "*** ERROR: Cannot continue\n";
exit(1);
}
}
# If we want to be able to compile outside the Open MPI tree, we need
# to copy some files to the auxdir
if ($config_params{PARAM_WANT_COMPILE_EXTERNAL} != 0) {
my $auxdir = $config_params{PARAM_CONFIG_AUX_DIR};
open (ACINCLUDE, "$ompi_topdir/config/mca_acinclude.m4");
{
while (<ACINCLUDE>) {
chomp;
my $filename = $_;
if ($filename =~ /^.*sinclude\(\@M4DIR\@\/(.+)\).*$/) {
$filename =~ s/^.*sinclude\(\@M4DIR\@\/(.+)\).*$/\1/;
unlink("$auxdir/$filename")
if (-f "$auxdir/$filename");
print "--> Copying m4 file: $filename ==> $auxdir\n";
system("cp -f $ompi_topdir/config/$filename $config_params{PARAM_CONFIG_AUX_DIR}");
}
}
close(ACINCLUDE);
}
}
############################################################################
# Read in the configure.ac template
############################################################################
sub make_template {
my ($src, $dest, $mode) = @_;
my $template;
my $search;
my $replace;
# Read in the template file
print "--> Reading template file: $src\n";
open(TEMPLATE, $src) ||
die("Cannot open template file: $src");
while (<TEMPLATE>) {
$template .= $_;
}
close(TEMPLATE);
# Transform the template
# If we want C or C++, substitute in the right setup macros
$search = "\@C_COMPILER_SETUP\@";
$replace = $config_params{$config_param_names{"PC"}} ?
"OMPI_SETUP_CC" : "";
$template =~ s/$search/$replace/;
$search = "\@CXX_COMPILER_SETUP\@";
$replace = $config_params{$config_param_names{"PCXX"}} ?
"OMPI_SETUP_CXX" : "";
$template =~ s/$search/$replace/;
# If we want to be able to compile outside the Open MPI tree, set
# the right include path for the M4 files
$search = "\@M4DIR\@";
$replace = ($config_params{PARAM_WANT_COMPILE_EXTERNAL} == 1) ?
$config_params{PARAM_CONFIG_AUX_DIR} : "../../../../config";
$template =~ s/$search/$replace/g;
# Do all the parameters. This is done last so that any of the
# above can use paramter values in their values, and expect to
# have their respective values substituted in (i.e., a [semi]
# recursive substitution).
print "--> Filling in the template...\n";
foreach my $key (sort keys(%config_values)) {
$search = "@" . $key . "@";
$template =~ s/$search/$config_values{$key}/g;
}
foreach my $key (sort keys(%config_param_names)) {
next if ($key eq "PC" || $key eq "PCXX");
$search = "@" . $config_param_names{$key} . "@";
$template =~
s/$search/$config_params{$config_param_names{$key}}/g;
}
# Write it out
print "--> Writing output file: $dest\n";
open(OUTPUT, ">$dest") ||
die("Cannot open output flie: $dest");
print OUTPUT $template;
close(OUTPUT);
chmod($dest, $mode);
}
# Read and fill in the templates
make_template("$ompi_topdir/config/mca_configure.ac",
"$component_topdir/configure.ac", 0644);
make_template("$ompi_topdir/config/mca_acinclude.m4",
"$component_topdir/acinclude.m4", 0644);
############################################################################
# All done
############################################################################
print "\n$announce_str finished\n";
exit(0);