1
1

Add checks for libevent.so conflict with LSF

* LSF ships a `libevent.so` that is no related to the `libevent.so`
   shipped with Libevent.
 * Add some checks to the configure logic to detect scenarios where this
   conflict can be detected, and provide the user with a descriptive
   warning message.
   - When detected by `event/external` this is just a warning since
     the internal component may be able to be used instead.
     - This happens when the user supplies the LSF path via the
       `LDFLAGS` envar instead of via `--with-lsf-libdir`.
   - When detected by a LSF component and LSF was explicitly requested
     then this becomes an error. Otherwise it will just print the warning
     and that component will fail to build.

Signed-off-by: Joshua Hursey <jhursey@us.ibm.com>
Этот коммит содержится в:
Joshua Hursey 2020-05-05 11:51:51 -04:00
родитель 22d8fa197b
Коммит fc4199e3ba
2 изменённых файлов: 95 добавлений и 3 удалений

Просмотреть файл

@ -15,7 +15,7 @@ dnl Copyright (c) 2015 Research Organization for Information Science
dnl and Technology (RIST). All rights reserved.
dnl Copyright (c) 2016 Los Alamos National Security, LLC. All rights
dnl reserved.
dnl Copyright (c) 2017 IBM Corporation. All rights reserved.
dnl Copyright (c) 2017-2020 IBM Corporation. All rights reserved.
dnl $COPYRIGHT$
dnl
dnl Additional copyrights may follow
@ -120,6 +120,73 @@ AC_DEFUN([ORTE_CHECK_LSF],[
[orte_check_lsf_happy="yes"],
[orte_check_lsf_happy="no"])])
# Some versions of LSF ship with a libevent.so in their library path.
# This is _not_ a copy of Libevent, but something specific to their project.
# The Open MPI components should not need to link against LSF's libevent.so
# However, the presence of it in the linker search path can cause a problem
# if there is a system installed Libevent and Open MPI chooses the 'external'
# event component prior to this stage.
#
# Add a check here to see if we are in a scenario where the two are conflicting.
# In which case the earlier checks for successful compile of an LSF program will
# have failed with messages like:
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_condition_callbacks'
# lib64/libevent_pthreads.so: undefined reference to `event_mm_malloc_'
# lib64/libevent_pthreads.so: undefined reference to `event_mm_free_'
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_id_callback'
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_lock_callbacks'
# Because it picked up -levent from LSF, but -levent_pthreads from Libevent.
#
# So look for a function that libevent_pthreads is looking for from libevent.so.
# If it does appears then we have the correct libevent.so, otherwise then we picked
# up the LSF version and a conflict has been detected.
# If the external libevent component used 'event_core' instead of 'event'
orte_check_lsf_event_conflict=na
# Split libs into an array, see if -levent is in that list
orte_check_lsf_libevent_present=`echo $LIBS | awk '{split([$]0, a, " "); {for (k in a) {if (a[[k]] == "-levent") {print a[[k]]}}}}' | wc -l`
AS_IF([test "$orte_check_lsf_happy" = "no"],
[AS_IF([test "$opal_event_external_support" = "yes" && test "$orte_check_lsf_libevent_present" != 0],
[AS_IF([test "$orte_check_lsf_libdir" = "" ],
[],
[LDFLAGS="$LDFLAGS -L$orte_check_lsf_libdir"])
# Note that we do not want to set LIBS here to include -llsf since
# the check is not for an LSF library, but for the conflict with
# LDFLAGS.
AC_CHECK_LIB([event], [evthread_set_condition_callbacks],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. The correct libevent.so was linked.])
orte_check_lsf_event_conflict=no],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([Yes. A wrong libevent.so was linked.])
orte_check_lsf_event_conflict=yes])
],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. Internal Libevent or libevent_core is being used.])
orte_check_lsf_event_conflict=na])],
[AC_MSG_CHECKING([for libevent conflict])
AC_MSG_RESULT([No. LSF checks passed.])
orte_check_lsf_event_conflict=na])
AS_IF([test "$orte_check_lsf_event_conflict" = "yes"],
[AC_MSG_WARN([===================================================================])
AC_MSG_WARN([Conflicting libevent.so libraries detected on the system.])
AC_MSG_WARN([])
AC_MSG_WARN([A system-installed Libevent library was detected and the Open MPI])
AC_MSG_WARN([build system chose to use the 'external' component expecting to])
AC_MSG_WARN([link against the Libevent in the linker search path.])
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
AC_MSG_WARN([library path. At this point the linker is attempting to resolve])
AC_MSG_WARN([Libevent symbols using the LSF library because of the lack of])
AC_MSG_WARN([an explicit linker path pointing to the system-installed Libevent.])
AC_MSG_WARN([])
AC_MSG_WARN([To resolve this issue either (A) explicitly pass the Libevent])
AC_MSG_WARN([library path on the configure line (--with-libevent-libdir), or])
AC_MSG_WARN([(B) use the internal libevent by requesting it from configure ])
AC_MSG_WARN([with the --with-libevent=internal option.])
AC_MSG_WARN([===================================================================])
])
CPPFLAGS="$orte_check_lsf_$1_save_CPPFLAGS"
LDFLAGS="$orte_check_lsf_$1_save_LDFLAGS"
LIBS="$orte_check_lsf_$1_save_LIBS"

29
opal/mca/event/external/configure.m4 поставляемый
Просмотреть файл

@ -116,10 +116,35 @@ AC_DEFUN([MCA_opal_event_external_CONFIG],[
[opal_event_external_support=yes],
[opal_event_external_support=no])
# Check to see if the above check failed because it conflicted with LSF's libevent.so
# This can happen if LSF's library is in the LDFLAGS envar or default search
# path. The 'event_fini' function is only defined in LSF's libevent.so and not
# in Libevent's libevent.so
AS_IF([test "$opal_event_external_support" = "no"],
[AC_CHECK_LIB([event], [event_fini],
[AC_MSG_WARN([===================================================================])
AC_MSG_WARN([Possible conflicting libevent.so libraries detected on the system.])
AC_MSG_WARN([])
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
AC_MSG_WARN([library path. It is possible that you have installed Libevent])
AC_MSG_WARN([on the system, but the linker is picking up the wrong version.])
AC_MSG_WARN([])
AC_MSG_WARN([Configure may continue and attempt to use the 'internal' libevent])
AC_MSG_WARN([instead of the 'external' libevent if you did not explicitly request])
AC_MSG_WARN([the 'external' component.])
AC_MSG_WARN([])
AC_MSG_WARN([If your intention was to use the 'external' libevent then you need])
AC_MSG_WARN([to address this linker path ordering issue. One way to do so is])
AC_MSG_WARN([to make sure the libevent system library path occurs before the])
AC_MSG_WARN([LSF library path.])
AC_MSG_WARN([===================================================================])
opal_event_external_support=no
])
])
AS_IF([test "$opal_event_external_support" = "yes"],
[LDFLAGS="$opal_event_external_LDFLAGS $LDFLAGS"
CPPFLAGS="$opal_event_external_CPPFLAGS $CPPFLAGS"],
[])
CPPFLAGS="$opal_event_external_CPPFLAGS $CPPFLAGS"])
AS_IF([test "$opal_event_external_support" = "yes"],
[# Ensure that this libevent has the symbol