542330e3a7
This is a runtime interposition project that sits between the OMPI and ORTE layers in Open MPI. The project is described on the wiki: https://svn.open-mpi.org/trac/ompi/wiki/Runtime_Interposition And on this email thread: http://www.open-mpi.org/community/lists/devel/2012/06/11109.php This commit was SVN r26670.
199 строки
5.4 KiB
Perl
199 строки
5.4 KiB
Perl
#! @PERL@ -w
|
|
# -*- perl -*-
|
|
#
|
|
# Note that we use an interpreter value ("PERL") from configure
|
|
# because even "#!/usr/bin/env perl" to all systems (e.g., NetBSD).
|
|
#
|
|
# Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
|
# Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
|
|
# Copyright (c) 2012 Oak Ridge National Labs. All rights reserved.
|
|
# $COPYRIGHT$
|
|
#
|
|
# Additional copyrights may follow
|
|
#
|
|
# $HEADER$
|
|
#
|
|
|
|
use File::Basename;
|
|
use File::Spec::Functions;
|
|
|
|
my $includedir = "@OMPI_WRAPPER_INCLUDEDIR@";
|
|
my $libdir = "@OMPI_WRAPPER_LIBDIR@";
|
|
|
|
# obey the OPAL_DESTDIR environment variable
|
|
if (exists($ENV{'OPAL_DESTDIR'})
|
|
&& defined($ENV{'OPAL_DESTDIR'})
|
|
&& (length($ENV{'OPAL_DESTDIR'}) > 0)) {
|
|
my $ddir = $ENV{'OPAL_DESTDIR'};
|
|
|
|
$includedir = catdir($ddir, $includedir);
|
|
$libdir = catdir($ddir, $libdir);
|
|
}
|
|
|
|
my $CC = "@CC@";
|
|
my $CXX = "@CXX@";
|
|
my $FC = "@FC@";
|
|
my $extra_includes = "@OMPI_WRAPPER_EXTRA_INCLUDES@";
|
|
my $extra_cppflags = "@OMPI_WRAPPER_EXTRA_CPPFLAGS@";
|
|
my $extra_cflags = "@OMPI_WRAPPER_EXTRA_CFLAGS@";
|
|
my $extra_cflags_prefix = "@ORTE_WRAPPER_EXTRA_CFLAGS_PREFIX@";
|
|
my $extra_cxxflags = "@OMPI_WRAPPER_EXTRA_CXXFLAGS@";
|
|
my $extra_cxxflags_prefix = "@ORTE_WRAPPER_EXTRA_CXXFLAGS_PREFIX@";
|
|
my $extra_fcflags = "@OMPI_WRAPPER_EXTRA_FCFLAGS@";
|
|
my $extra_fcflags_prefix = "@OMPI_WRAPPER_EXTRA_FCFLAGS_PREFIX@";
|
|
my $extra_ldflags = "@OMPI_WRAPPER_EXTRA_LDFLAGS@";
|
|
my $extra_libs = "@OMPI_WRAPPER_EXTRA_LIBS@";
|
|
my $cxx_lib = "@OMPI_WRAPPER_CXX_LIB@";
|
|
my $fc_module_flag = "@OMPI_FC_MODULE_FLAG@";
|
|
|
|
# Someone might want to fix for windows
|
|
my $include_flag = "-I";
|
|
my $libdir_flag = "-L";
|
|
|
|
my $lang = "none";
|
|
my $comp = ""; # this is a sentinal from configure
|
|
my $preproc_flags = $include_flag . $includedir;
|
|
my $comp_flags = "";
|
|
my $comp_flags_prefix = "";
|
|
my $linker_flags = $libdir_flag . $libdir . " " . $extra_ldflags;
|
|
my $libs = "-lmpi -lorca -lopen-rte -lopen-pal " . $extra_libs;
|
|
|
|
|
|
sub check_env {
|
|
my $envvar = shift;
|
|
my $str = shift;
|
|
|
|
foreach my $var (("OMPI_MPI", "OMPI_")) {
|
|
my $testvar = $var . $envvar;
|
|
if (exists($ENV{$testvar})) {
|
|
$str = $ENV{$testvar};
|
|
return $str;
|
|
}
|
|
}
|
|
|
|
return $str;
|
|
}
|
|
|
|
sub add_extra_includes {
|
|
my $str = "";
|
|
my @includes = split(' ', $extra_includes);
|
|
for my $include (@includes) {
|
|
$str .= $include_flag . catdir($includedir, $include) . " ";
|
|
}
|
|
|
|
return $str;
|
|
}
|
|
|
|
|
|
if (basename($0) eq "mpicc") {
|
|
$lang = "C";
|
|
$comp = check_env("CC", $CC);
|
|
$preproc_flags .= " " . add_extra_includes();
|
|
$comp_flags = $extra_cflags;
|
|
$comp_flags_prefix = $extra_cflags_prefix;
|
|
# no special libs for C
|
|
} elsif (basename($0) eq "mpic++" || basename($0) eq "mpiCC" || basename($0) eq "mpicxx") {
|
|
$lang = "C++";
|
|
$comp = check_env("CXX", $CXX);
|
|
$preproc_flags .= " " . add_extra_includes();
|
|
$comp_flags = $extra_cxxflags;
|
|
$comp_flags_prefix = $extra_cxxflags_prefix;
|
|
$libs = $cxx_lib . " " . $libs;
|
|
}
|
|
# mpifort is now preferred; mpif77/mpif90 are legacy names
|
|
elsif (basename($0) eq "mpifort" ||
|
|
basename($0) eq "mpif77" || basename($0) eq "mpif90") {
|
|
$lang = "Fortran";
|
|
$comp = check_env("FC", $FC);
|
|
# no extra includes for Fortran.
|
|
$comp_flags = $extra_fcflags;
|
|
$comp_flags_prefix = $extra_fcflags_prefix;
|
|
$libs = "-lmpi_mpifh " . $libs;
|
|
}
|
|
|
|
if ($lang eq "none") {
|
|
print "Could not determine requested language\n";
|
|
exit 1;
|
|
}
|
|
if ($comp eq "") {
|
|
print "Unfortunately, this installation of Open MPI was not compiled with\n";
|
|
print $lang . " support. As such, the " . $lang . " compiler is non-functional.\n";
|
|
exit 1;
|
|
}
|
|
|
|
# figure out what user wants
|
|
my @args = @ARGV;
|
|
my $want_preproc = 1;
|
|
my $want_compile = 1;
|
|
my $want_link = 1;
|
|
my $want_pmpi = 0;
|
|
my $dry_run = 0;
|
|
my $disable_flags = 1;
|
|
my $real_flag = 0;
|
|
my @appargs = ();
|
|
|
|
while (scalar(@args) > 0) {
|
|
my $arg = shift(@args);
|
|
|
|
if ($arg eq "-showme") {
|
|
$dry_run = 1;
|
|
} elsif ($arg eq "-lpmpi") {
|
|
$want_pmpi = 1;
|
|
} else {
|
|
if ($arg eq "-c") {
|
|
$want_link = 0;
|
|
$real_flag = 1;
|
|
} elsif ($arg eq "-E" || $arg eq "-M") {
|
|
$want_compile = 0;
|
|
$want_link = 0;
|
|
$real_flag = 1;
|
|
} elsif ($arg eq "-S") {
|
|
$want_link = 0;
|
|
$real_flag = 1;
|
|
} elsif ($arg =~ /^-.*/) {
|
|
$real_flag = 1;
|
|
} else {
|
|
$real_flag = 1;
|
|
$disable_flags = 0;
|
|
}
|
|
push(@appargs, $arg);
|
|
}
|
|
}
|
|
|
|
if ($disable_flags == 1 && !($dry_run == 1 && $real_flag == 0)) {
|
|
$want_preproc = $want_compile = $want_link = 0;
|
|
}
|
|
|
|
my @exec_argv = ();
|
|
|
|
# assemble command
|
|
push(@exec_argv, split(' ', $comp));
|
|
# Per tickets https://svn.open-mpi.org/trac/ompi/ticket/2474, and
|
|
# https://svn.open-mpi.org/trac/ompi/ticket/2201, construct command
|
|
# with some system arguments before user arguments and some after.
|
|
if ($want_compile == 1) {
|
|
push(@exec_argv, split(' ', $comp_flags_prefix));
|
|
}
|
|
push(@exec_argv, @appargs);
|
|
if ($want_preproc == 1) {
|
|
push(@exec_argv, split(' ', $preproc_flags));
|
|
}
|
|
if ($want_compile == 1) {
|
|
push(@exec_argv, split(' ', $comp_flags));
|
|
}
|
|
if ($want_link == 1) {
|
|
push(@exec_argv, split(' ', $linker_flags));
|
|
push(@exec_argv, split(' ', $libs));
|
|
}
|
|
|
|
if ($dry_run == 1) {
|
|
print join(" ", @exec_argv) . "\n";
|
|
exit 0;
|
|
}
|
|
|
|
$cmd = shift(@exec_argv);
|
|
if ($real_flag == 0) {
|
|
@exec_argv = ();
|
|
}
|
|
exec($cmd, (@exec_argv)) || die "Could not exec " . $exec_argv[0] . ": $!\n";
|