d33801c0fa
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.
394 строки
13 KiB
Perl
Исполняемый файл
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);
|