Skip to content

Commit

Permalink
Per discussion at the Open MPI developer meeting last week:
Browse files Browse the repository at this point in the history
 1. Restore libopen-pal.la, libopen-rte.la, and libmpi.la to be
    separate entities (i.e., don't have libopen-rte.la include
    libopen-pal.la, and don't have libmpi.la include libopen-pal.la).
    Yay!
 1. Consequently, make the wrapper compilers look for flags indicating
    that the user wants to compile statically (currently: -static,
    !--static, -Bstatic, and "-Wl," in front of all of those).  If it
    is, follow a 6-way matrix for determinining which libraries to
    list on the underlying command line.
 1. To support that, add the name of a token static and dynamic
    library to look for in each of the wrapper compiler data files.
 1. Fix a long-standing typo in the opalcc wrapper data file.

This commit was SVN r27662.
  • Loading branch information
jsquyres committed Dec 11, 2012
1 parent a454341 commit 97cc916
Show file tree
Hide file tree
Showing 12 changed files with 137 additions and 32 deletions.
28 changes: 28 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,34 @@ LTDL_CONVENIENCE
LT_INIT([dlopen win32-dll])
])

# What's the suffix of shared libraries? Inspired by generated
# Libtool code (even though we don't support several of these
# platforms, there didn't seem to be any harm in leaving in some of
# them, alhtough I did remove some that we have never/will never
# support, like OS/2).
case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
OPAL_DYN_LIB_SUFFIX=dll
;;
darwin* | rhapsody*)
OPAL_DYN_LIB_SUFFIX=dylib
;;
hpux9* | hpux10* | hpux11*)
case $host_cpu in
ia64*)
OPAL_DYN_LIB_SUFFIX=so
;;
*)
OPAL_DYN_LIB_SUFFIX=sl
;;
esac
;;
*)
OPAL_DYN_LIB_SUFFIX=so
;;
esac
AC_SUBST(OPAL_DYN_LIB_SUFFIX)

OPAL_SETUP_LIBLTDL


Expand Down
2 changes: 1 addition & 1 deletion ompi/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ libmpi_la_LIBADD = \
$(MCA_ompi_FRAMEWORK_LIBS) \
$(OMPI_MPIEXT_C_LIBS) \
$(OMPI_LIBMPI_EXTRA_LIBS) \
$(top_ompi_builddir)/orte/libopen-rte-lt.la
$(top_ompi_builddir)/orte/libopen-rte.la
libmpi_la_DEPENDENCIES = $(libmpi_la_LIBADD)
libmpi_la_LDFLAGS = \
-version-info $(libmpi_so_version) \
Expand Down
3 changes: 3 additions & 0 deletions ompi/tools/wrappers/mpic++-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ compiler_flags_prefix=@OMPI_WRAPPER_EXTRA_CXXFLAGS_PREFIX@
compiler_flags=@OMPI_WRAPPER_EXTRA_CXXFLAGS@
linker_flags=@OMPI_WRAPPER_EXTRA_LDFLAGS@
libs=@OMPI_WRAPPER_CXX_LIB@ -lmpi @OMPI_WRAPPER_EXTRA_LIBS@
libs_static=@OMPI_WRAPPER_CXX_LIB@ -lmpi @OMPI_WRAPPER_EXTRA_LIBS@ -lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@ -lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libmpi.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libmpi.a
required_file=@OMPI_WRAPPER_CXX_REQUIRED_FILE@
includedir=${includedir}
libdir=${libdir}
3 changes: 3 additions & 0 deletions ompi/tools/wrappers/mpicc-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ compiler_flags_prefix=@OMPI_WRAPPER_EXTRA_CFLAGS_PREFIX@
compiler_flags=@OMPI_WRAPPER_EXTRA_CFLAGS@
linker_flags=@OMPI_WRAPPER_EXTRA_LDFLAGS@
libs=-lmpi @OMPI_WRAPPER_EXTRA_LIBS@
libs_static=-lmpi @OMPI_WRAPPER_EXTRA_LIBS@ -lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@ -lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libmpi.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libmpi.a
required_file=
includedir=${includedir}
libdir=${libdir}
3 changes: 3 additions & 0 deletions ompi/tools/wrappers/mpifort-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ preprocessor_flags=
compiler_flags=@OMPI_WRAPPER_EXTRA_FCFLAGS@
linker_flags=@OMPI_WRAPPER_EXTRA_LDFLAGS@
libs=@OMPI_FORTRAN_USEMPIF08_LIB@ @OMPI_FORTRAN_USEMPI_LIB@ -lmpi_mpifh -lmpi -lopen-rte -lopen-pal @OMPI_WRAPPER_EXTRA_LIBS@
libs_static=@OMPI_FORTRAN_USEMPIF08_LIB@ @OMPI_FORTRAN_USEMPI_LIB@ -lmpi_mpifh -lmpi @OMPI_WRAPPER_EXTRA_LIBS@ -lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@ -lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libmpi.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libmpi.a
required_file=@OMPI_WRAPPER_FORTRAN_REQUIRED_FILE@
includedir=${includedir}
libdir=${libdir}
14 changes: 0 additions & 14 deletions opal/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -86,17 +86,3 @@ include mca/Makefile.am
include win32/Makefile.am
include tools/Makefile.am
include dss/Makefile.am

# Set the convenience library to be the same as the non-convenience
# library, but a) it's marked as "noinst", so LT knows it's a
# convenience library, and b) no .so version number is assigned here.
# Note that we only need to make the convenience library if the ORTE
# project is being built (i.e., if there is an upper layer that needs
# to slurp in OPAL as a convenience library).

if PROJECT_ORTE
noinst_LTLIBRARIES += libopen-pal-lt.la
endif
libopen_pal_lt_la_SOURCES = $(libopen_pal_la_SOURCES)
libopen_pal_lt_la_LIBADD = $(libopen_pal_la_LIBADD)
libopen_pal_lt_la_DEPENDENCIES = $(libopen_pal_la_DEPENDENCIES)
86 changes: 85 additions & 1 deletion opal/tools/wrappers/opal_wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ struct options_data_t {
char **comp_flags_prefix;
char **link_flags;
char **libs;
char **libs_static;
char *dyn_lib_file;
char *static_lib_file;
char *req_file;
char *path_includedir;
char *path_libdir;
Expand All @@ -100,6 +103,7 @@ static int default_data_idx = -1;
#define COMP_WANT_COMPILE 0x010
#define COMP_WANT_LINK 0x020
#define COMP_WANT_PMPI 0x040
#define COMP_WANT_STATIC 0x080

static void
options_data_init(struct options_data_t *data)
Expand All @@ -124,6 +128,10 @@ options_data_init(struct options_data_t *data)
data->link_flags[0] = NULL;
data->libs = (char **) malloc(sizeof(char*));
data->libs[0] = NULL;
data->libs_static = (char **) malloc(sizeof(char*));
data->libs_static[0] = NULL;
data->dyn_lib_file = NULL;
data->static_lib_file = NULL;
data->req_file = NULL;
data->path_includedir = NULL;
data->path_libdir = NULL;
Expand All @@ -149,6 +157,9 @@ options_data_free(struct options_data_t *data)
opal_argv_free(data->comp_flags_prefix);
opal_argv_free(data->link_flags);
opal_argv_free(data->libs);
opal_argv_free(data->libs_static);
if (NULL != data->dyn_lib_file) free(data->dyn_lib_file);
if (NULL != data->static_lib_file) free(data->static_lib_file);
if (NULL != data->req_file) free(data->req_file);
if (NULL != data->path_includedir) free(data->path_includedir);
if (NULL != data->path_libdir) free(data->path_libdir);
Expand Down Expand Up @@ -323,6 +334,16 @@ data_callback(const char *key, const char *value)
opal_argv_count(options_data[parse_options_idx].libs),
values);
opal_argv_free(values);
} else if (0 == strcmp(key, "libs_static")) {
char **values = opal_argv_split(value, ' ');
opal_argv_insert(&options_data[parse_options_idx].libs_static,
opal_argv_count(options_data[parse_options_idx].libs_static),
values);
opal_argv_free(values);
} else if (0 == strcmp(key, "dyn_lib_file")) {
if (NULL != value) options_data[parse_options_idx].dyn_lib_file = strdup(value);
} else if (0 == strcmp(key, "static_lib_file")) {
if (NULL != value) options_data[parse_options_idx].static_lib_file = strdup(value);
} else if (0 == strcmp(key, "required_file")) {
if (NULL != value) options_data[parse_options_idx].req_file = strdup(value);
} else if (0 == strcmp(key, "project_short")) {
Expand Down Expand Up @@ -696,6 +717,13 @@ main(int argc, char *argv[])
/* remove element from user_argv */
opal_argv_delete(&user_argc, &user_argv, i, 1);
--i;
} else if (0 == strcmp(user_argv[i], "-static") ||
0 == strcmp(user_argv[i], "--static") ||
0 == strcmp(user_argv[i], "-Bstatic") ||
0 == strcmp(user_argv[i], "-Wl,-static") ||
0 == strcmp(user_argv[i], "-Wl,--static") ||
0 == strcmp(user_argv[i], "-Wl,-Bstatic")) {
flags |= COMP_WANT_STATIC;
} else if ('-' != user_argv[i][0]) {
disable_flags = false;
flags |= COMP_SHOW_ERROR;
Expand Down Expand Up @@ -793,10 +821,66 @@ main(int argc, char *argv[])

/* link flags and libs */
if (flags & COMP_WANT_LINK) {
bool have_static_lib;
bool have_dyn_lib;
bool use_static_libs;
char *filename;
struct stat buf;

opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].link_flags);
exec_argc = opal_argv_count(exec_argv);

opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs);
/* Are we linking statically? If so, decide what libraries to
list. It depends on two factors:
1. Was --static (etc.) specified?
2. Does OMPI have static, dynamic, or both libraries installed?
Here's a matrix showing what we'll do in all 6 cases:
What's installed --static no --static
---------------- ---------- -----------
ompi .so libs -lmpi -lmpi
ompi .a libs all all
ompi both libs all -lmpi
*/

filename = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].static_lib_file, NULL );
if (0 == stat(filename, &buf)) {
have_static_lib = true;
} else {
have_static_lib = false;
}

filename = opal_os_path( false, options_data[user_data_idx].path_libdir, options_data[user_data_idx].dyn_lib_file, NULL );
if (0 == stat(filename, &buf)) {
have_dyn_lib = true;
} else {
have_dyn_lib = false;
}

/* Determine which set of libs to use: dynamic or static. Be
pedantic to make the code easy to read. */
if (flags & COMP_WANT_STATIC) {
if (have_static_lib) {
use_static_libs = true;
} else {
use_static_libs = false;
}
} else {
if (have_dyn_lib) {
use_static_libs = false;
} else {
use_static_libs = true;
}
}

if (use_static_libs) {
opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs_static);
} else {
opal_argv_insert(&exec_argv, exec_argc, options_data[user_data_idx].libs);
}
exec_argc = opal_argv_count(exec_argv);
}

Expand Down
3 changes: 3 additions & 0 deletions opal/tools/wrappers/opalc++-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ compiler_flags_prefix=@OPAL_WRAPPER_EXTRA_CXXFLAGS_PREFIX@
compiler_flags=@OPAL_WRAPPER_EXTRA_CXXFLAGS@
linker_flags=@OPAL_WRAPPER_EXTRA_LDFLAGS@
libs=-lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
libs_static=-lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libopen-pal.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libopen-pal.a
required_file=
includedir=${includedir}
libdir=${libdir}
5 changes: 4 additions & 1 deletion opal/tools/wrappers/opalcc-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@ version=@OPAL_VERSION@
language=C
compiler_env=CC
compiler_flags_env=CFLAGS
compiler=@OPAL_WRAPPER_CC@
compiler=@WRAPPER_CC@
extra_includes=@OPAL_WRAPPER_EXTRA_INCLUDES@
preprocessor_flags=@OPAL_WRAPPER_EXTRA_CPPFLAGS@
compiler_flags_prefix=@OPAL_WRAPPER_EXTRA_CFLAGS_PREFIX@
compiler_flags=@OPAL_WRAPPER_EXTRA_CFLAGS@
linker_flags=@OPAL_WRAPPER_EXTRA_LDFLAGS@
libs=-lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
libs_static=-lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libopen-pal.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libopen-pal.a
required_file=
includedir=${includedir}
libdir=${libdir}
16 changes: 1 addition & 15 deletions orte/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ lib_LTLIBRARIES = libopen-rte.la
libopen_rte_la_SOURCES =
libopen_rte_la_LIBADD = \
$(MCA_orte_FRAMEWORK_LIBS) \
$(top_ompi_builddir)/opal/libopen-pal-lt.la
$(top_ompi_builddir)/opal/libopen-pal.la
libopen_rte_la_DEPENDENCIES = $(libopen_rte_la_LIBADD)
libopen_rte_la_LDFLAGS = -version-info $(libopen_rte_so_version)

Expand All @@ -63,17 +63,3 @@ include tools/Makefile.am
include orted/Makefile.am
include test/mpi/Makefile.include
include test/system/Makefile.include

# Set the convenience library to be the same as the non-convenience
# library, but a) it's marked as "noinst", so LT knows it's a
# convenience library, and b) no .so version number is assigned here.
# Note that we only need to make the convenience library if the OMPI
# project is being built (i.e., if there is an upper layer that needs
# to slurp in ORTE as a convenience library).

if PROJECT_ORTE
noinst_LTLIBRARIES += libopen-rte-lt.la
endif
libopen_rte_lt_la_SOURCES = $(libopen_rte_la_SOURCES)
libopen_rte_lt_la_LIBADD = $(libopen_rte_la_LIBADD)
libopen_rte_lt_la_DEPENDENCIES = $(libopen_rte_la_DEPENDENCIES)
3 changes: 3 additions & 0 deletions orte/tools/wrappers/ortec++-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ compiler_flags_prefix=@ORTE_WRAPPER_EXTRA_CXXFLAGS_PREFIX@
compiler_flags=@ORTE_WRAPPER_EXTRA_CXXFLAGS@
linker_flags=@ORTE_WRAPPER_EXTRA_LDFLAGS@
libs=-lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@
libs_static=-lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@ -lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libopen-rte.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libopen-rte.a
required_file=
includedir=${includedir}
libdir=${libdir}
3 changes: 3 additions & 0 deletions orte/tools/wrappers/ortecc-wrapper-data.txt.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@ compiler_flags_prefix=@ORTE_WRAPPER_EXTRA_CFLAGS_PREFIX@
compiler_flags=@ORTE_WRAPPER_EXTRA_CFLAGS@
linker_flags=@ORTE_WRAPPER_EXTRA_LDFLAGS@
libs=-lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@
libs_static=-lopen-rte @ORTE_WRAPPER_EXTRA_LIBS@ -lopen-pal @OPAL_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libopen-rte.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libopen-rte.a
required_file=
includedir=${includedir}
libdir=${libdir}

0 comments on commit 97cc916

Please sign in to comment.