@@ -15,7 +15,7 @@ dnl Copyright (c) 2015 Research Organization for Information Science
1515dnl and Technology (RIST). All rights reserved.
1616dnl Copyright (c) 2016 Los Alamos National Security, LLC. All rights
1717dnl reserved.
18- dnl Copyright (c) 2017 IBM Corporation. All rights reserved.
18+ dnl Copyright (c) 2017-2020 IBM Corporation. All rights reserved.
1919dnl $COPYRIGHT $
2020dnl
2121dnl 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"
0 commit comments