1
1
openmpi/ompi/tools/wrappers/ompi_wrapper_script.in
Brian Barrett 504a6d036f * Rather than use the extra_includes directive, add the extra includes (which is really just -I${includedir}/openmpi/ for devel headers) to CPPFLAGS, since all the other necessary -Is for devel headers (like libevent and hwloc) are added to CPPFLAGS.
* Clean up ${includedir} and ${libdir} for script wrapper compilers
* Update script wrapper compilers to work like the C wrapper compilers w.r.t static and dynamic linking
* Remove the ORTE script wrapper compilers since they didn't support the ${includedir} stuff and Ralph said they weren't used anymore.

This commit was SVN r28052.
2013-02-13 00:33:05 +00:00

237 строки
7.0 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) 2013 Sandia National Laboratories. 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 = "@WRAPPER_CC@";
my $CXX = "@CXX@";
my $FC = "@FC@";
my $extra_cppflags = "@OMPI_WRAPPER_EXTRA_CPPFLAGS@";
my $extra_cflags = "@OMPI_WRAPPER_EXTRA_CFLAGS@";
my $extra_cflags_prefix = "@OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX@";
my $extra_cxxflags = "@OMPI_WRAPPER_EXTRA_CXXFLAGS@";
my $extra_cxxflags_prefix = "@OMPI_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@";
my $dynamic_lib_suffix = "@OPAL_DYN_LIB_SUFFIX@";
my $fortran_libs = "@OMPI_FORTRAN_USEMPIF08_LIB@ @OMPI_FORTRAN_USEMPI_LIB@";
# 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;
# Note that per https://svn.open-mpi.org/trac/ompi/ticket/3422, we
# intentionally only link in the MPI libraries (ORTE, OPAL, etc. are
# pulled in implicitly) because we intend MPI applications to only use
# the MPI API.
my $libs = "-lmpi " . $extra_libs;
my $libs_static = "-lmpi -lopen-rte -lopen-pal " . $extra_libs;
my $have_dynamic = 0;
if (-e $libdir . "/libmpi." . $dynamic_lib_suffix) {
$have_dynamic = 1;
}
my $have_static = 0;
if (-e $libdir . "/libmpi.a") {
$have_static = 1;
}
# run flags through regex to fix directories...
$extra_cppflags =~ s/\$\{includedir\}/$includedir/g;
$extra_cflags =~ s/\$\{includedir\}/$includedir/g;
$extra_cflags_prefix =~ s/\$\{includedir\}/$includedir/g;
$extra_cxxflags =~ s/\$\{includedir\}/$includedir/g;
$extra_cxxflags_prefix =~ s/\$\{includedir\}/$includedir/g;
$extra_fcflags =~ s/\$\{includedir\}/$includedir/g;
$extra_fcflags_prefix =~ s/\$\{includedir\}/$includedir/g;
$extra_ldflags =~ s/\$\{libdir\}/$libdir/g;
$extra_libs =~ s/\$\{libdir\}/$libdir/g;
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;
}
if (basename($0) eq "mpicc") {
$lang = "C";
$comp = check_env("CC", $CC);
$preproc_flags .= " " . $extra_cppflags;
$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 .= " " . $extra_cppflags;
$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 = $fortran_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 = ();
my $want_static = 0;
while (scalar(@args) > 0) {
my $arg = shift(@args);
if ($arg eq "-showme" || $arg eq "--showme") {
$dry_run = 1;
} elsif ($arg eq "-lpmpi") {
$want_pmpi = 1;
} elsif ($arg eq "--openmpi:linkall") {
$libs = $libs_static;
} 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 eq "-static" ||
$arg eq "--static" ||
$arg eq "-Bstatic" ||
$arg eq "-Wl,-static" ||
$arg eq "-Wl,--static" ||
$arg eq "-Wl,-Bstatic") {
$want_static = 1;
$real_flag = 1;
} elsif ($arg eq "-dynamic" ||
$arg eq "--dynamic" ||
$arg eq "-Bdynamic" ||
$arg eq "-Wl,-dynamic" ||
$arg eq "-Wl,--dynamic" ||
$arg eq "-Wl,-Bdynamic") {
$want_static = 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;
}
if ($want_static == 1 || $have_dynamic == 0) {
$libs = $libs_static;
}
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";