@@ -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,79 @@ 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 | tr -d ' [[:space:]]' `
148+ # (1) LSF check must have failed above. We need to know why...
149+ AS_IF([test " $orte_check_lsf_happy " = " no" ],
150+ [# (2) If there is a -levent in the $LIBS then that might be the problem
151+ AS_IF([test " $opal_event_external_support " = " yes" && test " $orte_check_lsf_libevent_present " != " 0" ],
152+ [AS_IF([test " $orte_check_lsf_libdir " = " " ],
153+ [],
154+ [LDFLAGS= " $LDFLAGS -L$orte_check_lsf_libdir " ])
155+ # Note that we do not want to set LIBS here to include -llsf since
156+ # the check is not for an LSF library, but for the conflict with
157+ # LDFLAGS.
158+ # (3) Check to see if the -levent is from Libevent (check for a symbol it has)
159+ AC_CHECK_LIB([event], [evthread_set_condition_callbacks],
160+ [AC_MSG_CHECKING([for libevent conflict])
161+ AC_MSG_RESULT([No. The correct libevent.so was linked.])
162+ orte_check_lsf_event_conflict= no],
163+ [# (4) The libevent.so is not from Libevent. Warn the user.
164+ AC_MSG_CHECKING([for libevent conflict])
165+ AC_MSG_RESULT([Yes. Detected a libevent.so that is not from Libevent.])
166+ orte_check_lsf_event_conflict= yes])
167+ ],
168+ [AC_MSG_CHECKING([for libevent conflict])
169+ AC_MSG_RESULT([No. Internal Libevent or libevent_core is being used.])
170+ orte_check_lsf_event_conflict= na])],
171+ [AC_MSG_CHECKING([for libevent conflict])
172+ AC_MSG_RESULT([No. LSF checks passed.])
173+ orte_check_lsf_event_conflict= na])
174+
175+ AS_IF([test " $orte_check_lsf_event_conflict " = " yes" ],
176+ [AC_MSG_WARN([=================================================================== ])
177+ AC_MSG_WARN([Conflicting libevent.so libraries detected on the system.])
178+ AC_MSG_WARN([])
179+ AC_MSG_WARN([A system-installed Libevent library was detected and the Open MPI])
180+ AC_MSG_WARN([build system chose to use the ' external' component expecting to])
181+ AC_MSG_WARN([link against the Libevent in the linker search path.])
182+ AC_MSG_WARN([If LSF is present on the system and in the default search path then])
183+ AC_MSG_WARN([it _may be_ the source of the conflict.])
184+ AC_MSG_WARN([LSF provides a libevent.so that is not from Libevent in its])
185+ AC_MSG_WARN([library path. At this point the linker is attempting to resolve])
186+ AC_MSG_WARN([Libevent symbols using the LSF library because of the lack of])
187+ AC_MSG_WARN([an explicit linker path pointing to the system-installed Libevent.])
188+ AC_MSG_WARN([])
189+ AC_MSG_WARN([To resolve this issue either (A) explicitly pass the Libevent])
190+ AC_MSG_WARN([library path on the configure line (--with-libevent-libdir), or])
191+ AC_MSG_WARN([(B) use the internal libevent by requesting it from configure ])
192+ AC_MSG_WARN([with the --with-libevent= internal option.])
193+ AC_MSG_WARN([=================================================================== ])
194+ ])
195+
123196 CPPFLAGS= " $orte_check_lsf_ $1 _save_CPPFLAGS"
124197 LDFLAGS= " $orte_check_lsf_ $1 _save_LDFLAGS"
125198 LIBS= " $orte_check_lsf_ $1 _save_LIBS"
0 commit comments