Commit 9e2673b3b32b31052c3ac1c44e1a12534b6f1f5e
1 parent
d85cbf20
On Linux systems, test if libgomp.so.1 can be dlopen()ed.
The gcc 4.2.x compiler series has a feature where libgomp.so.1 cannot be dlopen()ed. In this case, the OpenMP support does not properly work in ctools. We try detecting this, but restrict the analysis so far on Linux systems.
Showing
1 changed file
with
42 additions
and
26 deletions
configure.ac
| ... | ... | @@ -719,7 +719,7 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <GObservations.hpp>]],,)], |
| 719 | 719 | # Check if openMP is available |
| 720 | 720 | m4_ifdef([AC_OPENMP],[AC_OPENMP], [AX_OPENMP([openmp_ok=yes],[openmp_ok=no])]) |
| 721 | 721 | if test "x$ac_cv_prog_cxx_openmp" != "xunsupported" && test "x$ac_cv_prog_cxx_openmp" != "x"; then |
| 722 | - openmp_ok=yes | |
| 722 | + openmp_ok=yes | |
| 723 | 723 | fi |
| 724 | 724 | |
| 725 | 725 | # Signal actual test |
| ... | ... | @@ -727,47 +727,63 @@ AC_MSG_CHECKING(whether to enable OpenMP) |
| 727 | 727 | |
| 728 | 728 | # If OpenMP is available |
| 729 | 729 | if test "x$openmp_ok" = "xyes"; then |
| 730 | - # If gammalib is compiled with OpenMP, ctools must also be compiled with | |
| 731 | - # openmp | |
| 732 | - if test "x$gammalib_with_openmp" = "xyes"; then | |
| 733 | - enable_openmp="yes" | |
| 734 | - else | |
| 735 | - # ... otherwise, we use it optionally | |
| 736 | - AC_ARG_ENABLE([openmp], | |
| 737 | - AS_HELP_STRING([--enable-openmp], | |
| 738 | - [turn on OpenMP support [default=yes]]), | |
| 739 | - [enable_openmp="$enableval"], | |
| 740 | - [enable_openmp="yes"]) | |
| 741 | - fi | |
| 730 | + | |
| 731 | + # Special Linux test to detect shared libgomp libraries that can not be loaded | |
| 732 | + # dynamically | |
| 733 | + if test "$OPENMP_CXXFLAGS" = "-fopenmp" -a "$ac_sys_system" = "Linux"; then | |
| 734 | + AC_MSG_CHECKING(whether we can dynamically load libgomp) | |
| 735 | + SAVED_LDFLAGS=$LDFLAGS | |
| 736 | + LDFLAGS="$LDFLAGS -ldl" | |
| 737 | + AC_TRY_RUN(AC_LANG_PROGRAM([#include <dlfcn.h>], | |
| 738 | + [if (dlopen("libgomp.so.1", RTLD_NOW) == 0) return 1;]), | |
| 739 | + [AC_MSG_RESULT(yes)], | |
| 740 | + [enable_openmp="no" | |
| 741 | + AC_MSG_RESULT(no) | |
| 742 | + AC_MSG_WARN([OpenMP detected but shared libgomp.so.1 library cannot be dlopen()ed.]) | |
| 743 | + AC_MSG_WARN([If you use a gcc 4.2.x compiler, this is a known feature. Try to use gcc >= 4.3.])]) | |
| 744 | + LDFLAGS=$SAVED_LDFLAGS | |
| 745 | + fi | |
| 746 | + | |
| 747 | + # If gammalib is compiled with OpenMP, ctools must also be compiled with | |
| 748 | + # openmp | |
| 749 | + if test "x$gammalib_with_openmp" = "xyes"; then | |
| 750 | + enable_openmp="yes" | |
| 751 | + else | |
| 752 | + # ... otherwise, we use it optionally | |
| 753 | + AC_ARG_ENABLE([openmp], | |
| 754 | + AS_HELP_STRING([--enable-openmp], | |
| 755 | + [turn on OpenMP support [default=yes]]), | |
| 756 | + [enable_openmp="$enableval"], | |
| 757 | + [enable_openmp="yes"]) | |
| 758 | + fi | |
| 759 | + | |
| 742 | 760 | fi |
| 743 | 761 | |
| 744 | 762 | # Set compiler flags accordingly |
| 745 | 763 | if test "x$enable_openmp" = "xyes"; then |
| 746 | - CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" | |
| 747 | - AC_DEFINE([HAVE_OPENMP], [1], [Define if OpenMP is enabled]) | |
| 748 | - AC_MSG_RESULT(yes) | |
| 764 | + CXXFLAGS="$CXXFLAGS $OPENMP_CXXFLAGS" | |
| 765 | + AC_DEFINE([HAVE_OPENMP], [1], [Define if OpenMP is enabled]) | |
| 766 | + AC_MSG_RESULT(yes) | |
| 749 | 767 | else |
| 750 | - enable_openmp=no | |
| 751 | - AC_MSG_RESULT(no) | |
| 768 | + enable_openmp=no | |
| 769 | + AC_MSG_RESULT(no) | |
| 752 | 770 | fi |
| 753 | 771 | |
| 754 | 772 | # Set system specific settings |
| 755 | 773 | OPENMP_LIB_LDFLAGS= |
| 756 | 774 | if test "x$enable_openmp" = "xyes"; then |
| 757 | - case $ac_sys_system/$ac_sys_release in | |
| 758 | - Darwin/*) | |
| 759 | - # | |
| 760 | - # | |
| 761 | - OPENMP_LIB_LDFLAGS=-lgomp | |
| 762 | - ;; | |
| 763 | - esac | |
| 775 | + case $ac_sys_system/$ac_sys_release in | |
| 776 | + Darwin/*) | |
| 777 | + OPENMP_LIB_LDFLAGS=-lgomp | |
| 778 | + ;; | |
| 779 | + esac | |
| 764 | 780 | fi |
| 765 | 781 | AC_SUBST(OPENMP_LIB_LDFLAGS) |
| 766 | 782 | |
| 767 | 783 | # Signal if ctools cannot be compiled as gammalibe requires OpenMP but ctools |
| 768 | 784 | # cannot be compiled with OpenMP |
| 769 | 785 | if test "x$enable_openmp" = "xno" && test "x$gammalib_with_openmp" = "xyes"; then |
| 770 | - AC_MSG_ERROR([The GammaLib library has been built with openMP support but OpenMP is not available on this system. Please install OpenMP or re-build GammaLib without OpenMP support.]) | |
| 786 | + AC_MSG_ERROR([The GammaLib library has been built with openMP support but OpenMP is not available on this system. Please install OpenMP or re-build GammaLib without OpenMP support.]) | |
| 771 | 787 | fi |
| 772 | 788 | AM_CONDITIONAL(OPENMP,test "x$enable_openmp" = "xyes") |
| 773 | 789 | ... | ... |