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>
Этот коммит содержится в:
родитель
22d8fa197b
Коммит
fc4199e3ba
@ -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
поставляемый
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
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user