Skip to content

Commit edcb3b3

Browse files
committed
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 <[email protected]>
1 parent 22d8fa1 commit edcb3b3

File tree

2 files changed

+93
-4
lines changed

2 files changed

+93
-4
lines changed

config/orte_check_lsf.m4

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ dnl Copyright (c) 2015 Research Organization for Information Science
1515
dnl and Technology (RIST). All rights reserved.
1616
dnl Copyright (c) 2016 Los Alamos National Security, LLC. All rights
1717
dnl reserved.
18-
dnl Copyright (c) 2017 IBM Corporation. All rights reserved.
18+
dnl Copyright (c) 2017-2020 IBM Corporation. All rights reserved.
1919
dnl $COPYRIGHT$
2020
dnl
2121
dnl Additional copyrights may follow
@@ -120,6 +120,70 @@ AC_DEFUN([ORTE_CHECK_LSF],[
120120
[orte_check_lsf_happy="yes"],
121121
[orte_check_lsf_happy="no"])])
122122

123+
124+
# Some versions of LSF ship with a libevent.so in their library path.
125+
# This is _not_ a copy of Libevent, but something specific to their project.
126+
# The Open MPI components should not need to link against LSF's libevent.so
127+
# However, the presence of it in the linker search path can cause a problem
128+
# if there is a system installed Libevent and Open MPI chooses the 'external'
129+
# event component prior to this stage.
130+
#
131+
# Add a check here to see if we are in a scenario where the two are conflicting.
132+
# In which case the earlier checks for successful compile of an LSF program will
133+
# have failed with messages like:
134+
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_condition_callbacks'
135+
# lib64/libevent_pthreads.so: undefined reference to `event_mm_malloc_'
136+
# lib64/libevent_pthreads.so: undefined reference to `event_mm_free_'
137+
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_id_callback'
138+
# lib64/libevent_pthreads.so: undefined reference to `evthread_set_lock_callbacks'
139+
# Because it picked up -levent from LSF, but -levent_pthreads from Libevent.
140+
#
141+
# So look for a function that libevent_pthreads is looking for from libevent.so
142+
# If it does not appear here when adding the same option then we have
143+
# a conflict.
144+
orte_check_lsf_event_conflict=na
145+
AS_IF([test "$orte_check_lsf_happy" = "no"],
146+
[AS_IF([test "$opal_event_external_support" = "yes"],
147+
[AS_IF([test "$orte_check_lsf_libdir" = "" ],
148+
[],
149+
[LDFLAGS="$LDFLAGS -L$orte_check_lsf_libdir"])
150+
# Note that we do not want to set LIBS here to include -llsf since
151+
# the check is not for an LSF library, but for the conflict with
152+
# LDFLAGS.
153+
AC_CHECK_LIB([event], [evthread_set_condition_callbacks],
154+
[AC_MSG_CHECKING([for libevent conflict])
155+
AC_MSG_RESULT([No. The correct libevent.so was linked.])
156+
orte_check_lsf_event_conflict=no],
157+
[AC_MSG_CHECKING([for libevent conflict])
158+
AC_MSG_RESULT([Yes. A wrong libevent.so was linked.])
159+
orte_check_lsf_event_conflict=yes])
160+
],
161+
[AC_MSG_CHECKING([for libevent conflict])
162+
AC_MSG_RESULT([No. Internal Libevent is being used.])
163+
orte_check_lsf_event_conflict=na])],
164+
[AC_MSG_CHECKING([for libevent conflict])
165+
AC_MSG_RESULT([No. LSF checks passed.])
166+
orte_check_lsf_event_conflict=na])
167+
168+
AS_IF([test "$orte_check_lsf_event_conflict" = "yes"],
169+
[AC_MSG_WARN([===================================================================])
170+
AC_MSG_WARN([Conflicting libevent.so libraries detected on the system.])
171+
AC_MSG_WARN([])
172+
AC_MSG_WARN([A system-installed Libevent library was detected and the Open MPI])
173+
AC_MSG_WARN([build system chose to use the 'external' component expecting to])
174+
AC_MSG_WARN([link against the Libevent in the linker search path.])
175+
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
176+
AC_MSG_WARN([library path. At this point the linker is attempting to resolve])
177+
AC_MSG_WARN([Libevent symbols using the LSF library because of the lack of])
178+
AC_MSG_WARN([an explicit linker path pointing to the system-installed Libevent.])
179+
AC_MSG_WARN([])
180+
AC_MSG_WARN([To resolve this issue either (A) explicitly pass the Libevent])
181+
AC_MSG_WARN([library path on the configure line (--with-libevent-libdir), or])
182+
AC_MSG_WARN([(B) use the internal libevent by requesting it from configure ])
183+
AC_MSG_WARN([with the --with-libevent=internal option.])
184+
AC_MSG_WARN([===================================================================])
185+
])
186+
123187
CPPFLAGS="$orte_check_lsf_$1_save_CPPFLAGS"
124188
LDFLAGS="$orte_check_lsf_$1_save_LDFLAGS"
125189
LIBS="$orte_check_lsf_$1_save_LIBS"
@@ -137,7 +201,7 @@ AC_DEFUN([ORTE_CHECK_LSF],[
137201
$1_WRAPPER_EXTRA_LDFLAGS=[$]$1_LDFLAGS
138202
$1_WRAPPER_EXTRA_LIBS=[$]$1_LIBS
139203
$2],
140-
[AS_IF([test ! -z "$with_lsf" && test "$with_lsf" != "no"],
204+
[AS_IF([test ! -z "$with_lsf" && test "$with_lsf" != "no" && test "$orte_check_lsf_event_conflict" = "yes"],
141205
[AC_MSG_WARN([LSF support requested (via --with-lsf) but not found.])
142206
AC_MSG_ERROR([Aborting.])])
143207
$3])

opal/mca/event/external/configure.m4

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,35 @@ AC_DEFUN([MCA_opal_event_external_CONFIG],[
116116
[opal_event_external_support=yes],
117117
[opal_event_external_support=no])
118118

119+
# Check to see if this check failed because it conflicted with LSF's libevent.so
120+
# This can happen if LSF's library is in the LDFLAGS envar or default search
121+
# path. The 'event_fini' function is only defined in LSF's libevent.so and not
122+
# in Libevent's libevent.so
123+
AS_IF([test "$opal_event_external_support" = "no"],
124+
[AC_CHECK_LIB([event], [event_fini],
125+
[AC_MSG_WARN([===================================================================])
126+
AC_MSG_WARN([Possible conflicting libevent.so libraries detected on the system.])
127+
AC_MSG_WARN([])
128+
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
129+
AC_MSG_WARN([library path. It is possible that you have installed Libevent])
130+
AC_MSG_WARN([on the system, but the linker is picking up the wrong version.])
131+
AC_MSG_WARN([])
132+
AC_MSG_WARN([Configure may continue and attempt to use the 'internal' libevent])
133+
AC_MSG_WARN([instead of the 'external' libevent if you did not explicitly request])
134+
AC_MSG_WARN([the 'external' component.])
135+
AC_MSG_WARN([])
136+
AC_MSG_WARN([If your intention was to use the 'external' libevent then you need])
137+
AC_MSG_WARN([to address this linker path ordering issue. One way to do so is])
138+
AC_MSG_WARN([to make sure the libevent system library path occurs before the])
139+
AC_MSG_WARN([LSF library path.])
140+
AC_MSG_WARN([===================================================================])
141+
opal_event_external_support=no
142+
])
143+
])
144+
119145
AS_IF([test "$opal_event_external_support" = "yes"],
120146
[LDFLAGS="$opal_event_external_LDFLAGS $LDFLAGS"
121-
CPPFLAGS="$opal_event_external_CPPFLAGS $CPPFLAGS"],
122-
[])
147+
CPPFLAGS="$opal_event_external_CPPFLAGS $CPPFLAGS"])
123148

124149
AS_IF([test "$opal_event_external_support" = "yes"],
125150
[# Ensure that this libevent has the symbol

0 commit comments

Comments
 (0)