Skip to content

Commit 8bd02b5

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 8bd02b5

File tree

2 files changed

+95
-3
lines changed

2 files changed

+95
-3
lines changed

config/orte_check_lsf.m4

Lines changed: 68 additions & 1 deletion
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,73 @@ 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 appears then we have the correct libevent.so, otherwise then we picked
143+
# up the LSF version and a conflict has been detected.
144+
# If the external libevent component used 'event_core' instead of 'event'
145+
orte_check_lsf_event_conflict=na
146+
# Split libs into an array, see if -levent is in that list
147+
orte_check_lsf_libevent_present=`echo $LIBS | awk '{split([$]0, a, " "); {for (k in a) {if (a[k] == "-levent") {print a[k]}}}}' | wc -l`
148+
AS_IF([test "$orte_check_lsf_happy" = "no"],
149+
[AS_IF([test "$opal_event_external_support" = "yes" && test "$orte_check_lsf_libevent_present" = 1],
150+
[AS_IF([test "$orte_check_lsf_libdir" = "" ],
151+
[],
152+
[LDFLAGS="$LDFLAGS -L$orte_check_lsf_libdir"])
153+
# Note that we do not want to set LIBS here to include -llsf since
154+
# the check is not for an LSF library, but for the conflict with
155+
# LDFLAGS.
156+
AC_CHECK_LIB([event], [evthread_set_condition_callbacks],
157+
[AC_MSG_CHECKING([for libevent conflict])
158+
AC_MSG_RESULT([No. The correct libevent.so was linked.])
159+
orte_check_lsf_event_conflict=no],
160+
[AC_MSG_CHECKING([for libevent conflict])
161+
AC_MSG_RESULT([Yes. A wrong libevent.so was linked.])
162+
orte_check_lsf_event_conflict=yes])
163+
],
164+
[AC_MSG_CHECKING([for libevent conflict])
165+
AC_MSG_RESULT([No. Internal Libevent or libevent_core is being used.])
166+
orte_check_lsf_event_conflict=na])],
167+
[AC_MSG_CHECKING([for libevent conflict])
168+
AC_MSG_RESULT([No. LSF checks passed.])
169+
orte_check_lsf_event_conflict=na])
170+
171+
AS_IF([test "$orte_check_lsf_event_conflict" = "yes"],
172+
[AC_MSG_WARN([===================================================================])
173+
AC_MSG_WARN([Conflicting libevent.so libraries detected on the system.])
174+
AC_MSG_WARN([])
175+
AC_MSG_WARN([A system-installed Libevent library was detected and the Open MPI])
176+
AC_MSG_WARN([build system chose to use the 'external' component expecting to])
177+
AC_MSG_WARN([link against the Libevent in the linker search path.])
178+
AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
179+
AC_MSG_WARN([library path. At this point the linker is attempting to resolve])
180+
AC_MSG_WARN([Libevent symbols using the LSF library because of the lack of])
181+
AC_MSG_WARN([an explicit linker path pointing to the system-installed Libevent.])
182+
AC_MSG_WARN([])
183+
AC_MSG_WARN([To resolve this issue either (A) explicitly pass the Libevent])
184+
AC_MSG_WARN([library path on the configure line (--with-libevent-libdir), or])
185+
AC_MSG_WARN([(B) use the internal libevent by requesting it from configure ])
186+
AC_MSG_WARN([with the --with-libevent=internal option.])
187+
AC_MSG_WARN([===================================================================])
188+
])
189+
123190
CPPFLAGS="$orte_check_lsf_$1_save_CPPFLAGS"
124191
LDFLAGS="$orte_check_lsf_$1_save_LDFLAGS"
125192
LIBS="$orte_check_lsf_$1_save_LIBS"

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 the above 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)