From 8c89451fbb8992d0396dc17aa7d29ebefe9c7de2 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Tue, 2 Apr 2013 06:04:20 -0600 Subject: [PATCH] configure: libffi after pthread On OpenBSD, for example, the libffi link test doesn't work until "-pthread" is in $LIBS. Also, make `configure' complain if `--enable-libffi' is specified and linking to libffi fails. --- src/configure | 218 +++++++++++++++++++++------------------- src/racket/configure.ac | 136 +++++++++++++------------ 2 files changed, 189 insertions(+), 165 deletions(-) diff --git a/src/configure b/src/configure index ccd2bf7b61..953cd24322 100755 --- a/src/configure +++ b/src/configure @@ -5389,109 +5389,6 @@ _ACEOF fi fi -if test "${enable_libffi}" = "default" ; then - case "$host_os" in - darwin*) - enable_libffi=no - ;; - *) - enable_libffi=yes - ;; - esac -fi - -if test "${enable_libffi}" = "yes" ; then - if test "${enable_foreign}" = "yes" ; then - { echo "$as_me:$LINENO: checking for libffi" >&5 -echo $ECHO_N "checking for libffi... $ECHO_C" >&6; } - - # Try to get flags form pkg-config: - libffi_config_prog="pkg-config libffi" - libffi_config_preflags=`$libffi_config_prog --cflags-only-I 2> /dev/null` - if test "$?" = 0 ; then - libffi_config_cflags=`$libffi_config_prog --cflags-only-other 2> /dev/null` - if test "$?" = 0 ; then - libffi_config_libs=`$libffi_config_prog --libs 2> /dev/null` - if test "$?" != 0 ; then - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - else - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - else - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - - OLD_CFLAGS="${CFLAGS}" - OLD_LIBS="${LIBS}" - CFLAGS="${CFLAGS} ${libffi_config_preflags} ${libffi_config_cflags}" - LIBS="${LIBS} ${libffi_config_libs}" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -ffi_cif cif; - ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, NULL); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - have_libffi=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_libffi=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { echo "$as_me:$LINENO: result: $have_libffi" >&5 -echo "${ECHO_T}$have_libffi" >&6; } - if test "${have_libffi}" = "no" ; then - CFLAGS="${OLD_CFLAGS}" - LIBS="${OLD_LIBS}" - echo "Building own libffi" - else - CFLAGS="${OLD_CFLAGS}" - PREFLAGS="${PREFLAGS} ${libffi_config_preflags}" - COMPFLAGS="${COMPFLAGS} ${libffi_config_cflags}" - echo "Using installed libffi" - OWN_LIBFFI="OFF" - fi - fi -fi - if test "${check_for_mprotect}" = "yes" ; then msg="for mmap and mprotect" { echo "$as_me:$LINENO: checking $msg" >&5 @@ -8735,10 +8632,125 @@ _ACEOF fi fi +############## libffi ################ + +# Depends on pthread on some platforms + if test "${enable_pthread}" = "" ; then enable_pthread=no fi +if test "${enable_libffi}" = "yes" ; then + complain_if_libffi_fails=yes +fi + +if test "${enable_libffi}" = "default" ; then + case "$host_os" in + darwin*) + enable_libffi=no + ;; + *) + enable_libffi=yes + ;; + esac +fi + +if test "${enable_libffi}" = "yes" ; then + if test "${enable_foreign}" = "yes" ; then + { echo "$as_me:$LINENO: checking for libffi" >&5 +echo $ECHO_N "checking for libffi... $ECHO_C" >&6; } + + # Try to get flags form pkg-config: + libffi_config_prog="pkg-config libffi" + libffi_config_preflags=`$libffi_config_prog --cflags-only-I 2> /dev/null` + if test "$?" = 0 ; then + libffi_config_cflags=`$libffi_config_prog --cflags-only-other 2> /dev/null` + if test "$?" = 0 ; then + libffi_config_libs=`$libffi_config_prog --libs 2> /dev/null` + if test "$?" != 0 ; then + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + else + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + else + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + + OLD_CFLAGS="${CFLAGS}" + OLD_LIBS="${LIBS}" + CFLAGS="${CFLAGS} ${libffi_config_preflags} ${libffi_config_cflags}" + LIBS="${LIBS} ${libffi_config_libs}" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +ffi_cif cif; + ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, NULL); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + have_libffi=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + have_libffi=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + { echo "$as_me:$LINENO: result: $have_libffi" >&5 +echo "${ECHO_T}$have_libffi" >&6; } + if test "${have_libffi}" = "no" ; then + CFLAGS="${OLD_CFLAGS}" + LIBS="${OLD_LIBS}" + echo "Building own libffi" + if test "${complain_if_libffi_fails}" = "yes" ; then + echo configure: unable to link to libffi + exit 1 + fi + else + CFLAGS="${OLD_CFLAGS}" + PREFLAGS="${PREFLAGS} ${libffi_config_preflags}" + COMPFLAGS="${COMPFLAGS} ${libffi_config_cflags}" + echo "Using installed libffi" + OWN_LIBFFI="OFF" + fi + fi +fi + ############## Solaris grunge ################ if test "$check_gcc_dash_e" = "yes" ; then diff --git a/src/racket/configure.ac b/src/racket/configure.ac index 99eeec9f0f..3dd9c6d35d 100644 --- a/src/racket/configure.ac +++ b/src/racket/configure.ac @@ -954,68 +954,6 @@ if test "${try_kqueue_syscall}" = "yes" ; then fi fi -if test "${enable_libffi}" = "default" ; then - case "$host_os" in - darwin*) - enable_libffi=no - ;; - *) - enable_libffi=yes - ;; - esac -fi - -if test "${enable_libffi}" = "yes" ; then - if test "${enable_foreign}" = "yes" ; then - AC_MSG_CHECKING([for libffi]) - - # Try to get flags form pkg-config: - libffi_config_prog="pkg-config libffi" - libffi_config_preflags=`$libffi_config_prog --cflags-only-I 2> /dev/null` - if test "$?" = 0 ; then - libffi_config_cflags=`$libffi_config_prog --cflags-only-other 2> /dev/null` - if test "$?" = 0 ; then - libffi_config_libs=`$libffi_config_prog --libs 2> /dev/null` - if test "$?" != 0 ; then - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - else - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - else - libffi_config_preflags="" - libffi_config_cflags="" - libffi_config_libs="-lffi" - fi - - OLD_CFLAGS="${CFLAGS}" - OLD_LIBS="${LIBS}" - CFLAGS="${CFLAGS} ${libffi_config_preflags} ${libffi_config_cflags}" - LIBS="${LIBS} ${libffi_config_libs}" - AC_TRY_LINK([#include ], - [ffi_cif cif; ] - [ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, NULL);], - have_libffi=yes, - have_libffi=no) - AC_MSG_RESULT($have_libffi) - if test "${have_libffi}" = "no" ; then - CFLAGS="${OLD_CFLAGS}" - LIBS="${OLD_LIBS}" - echo "Building own libffi" - else - CFLAGS="${OLD_CFLAGS}" - PREFLAGS="${PREFLAGS} ${libffi_config_preflags}" - COMPFLAGS="${COMPFLAGS} ${libffi_config_cflags}" - echo "Using installed libffi" - OWN_LIBFFI="OFF" - fi - fi -fi - if test "${check_for_mprotect}" = "yes" ; then [ msg="for mmap and mprotect" ] AC_MSG_CHECKING($msg) @@ -1202,10 +1140,84 @@ if test "${enable_pthread}" = "yes" ; then fi fi +############## libffi ################ + +# Depends on pthread on some platforms + if test "${enable_pthread}" = "" ; then enable_pthread=no fi +if test "${enable_libffi}" = "yes" ; then + complain_if_libffi_fails=yes +fi + +if test "${enable_libffi}" = "default" ; then + case "$host_os" in + darwin*) + enable_libffi=no + ;; + *) + enable_libffi=yes + ;; + esac +fi + +if test "${enable_libffi}" = "yes" ; then + if test "${enable_foreign}" = "yes" ; then + AC_MSG_CHECKING([for libffi]) + + # Try to get flags form pkg-config: + libffi_config_prog="pkg-config libffi" + libffi_config_preflags=`$libffi_config_prog --cflags-only-I 2> /dev/null` + if test "$?" = 0 ; then + libffi_config_cflags=`$libffi_config_prog --cflags-only-other 2> /dev/null` + if test "$?" = 0 ; then + libffi_config_libs=`$libffi_config_prog --libs 2> /dev/null` + if test "$?" != 0 ; then + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + else + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + else + libffi_config_preflags="" + libffi_config_cflags="" + libffi_config_libs="-lffi" + fi + + OLD_CFLAGS="${CFLAGS}" + OLD_LIBS="${LIBS}" + CFLAGS="${CFLAGS} ${libffi_config_preflags} ${libffi_config_cflags}" + LIBS="${LIBS} ${libffi_config_libs}" + AC_TRY_LINK([#include ], + [ffi_cif cif; ] + [ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void, NULL);], + have_libffi=yes, + have_libffi=no) + AC_MSG_RESULT($have_libffi) + if test "${have_libffi}" = "no" ; then + CFLAGS="${OLD_CFLAGS}" + LIBS="${OLD_LIBS}" + echo "Building own libffi" + if test "${complain_if_libffi_fails}" = "yes" ; then + echo configure: unable to link to libffi + exit 1 + fi + else + CFLAGS="${OLD_CFLAGS}" + PREFLAGS="${PREFLAGS} ${libffi_config_preflags}" + COMPFLAGS="${COMPFLAGS} ${libffi_config_cflags}" + echo "Using installed libffi" + OWN_LIBFFI="OFF" + fi + fi +fi + ############## Solaris grunge ################ if test "$check_gcc_dash_e" = "yes" ; then