X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=config%2Fusrp_libusb.m4;h=cc3410f4190fc970f7568ef9fc12c823fb4f0d15;hb=e90e0af122570193a3daecb1a4b4ef45dae3c83c;hp=bbf94b82d4760c97b591f5aaa61a9de96f8c2ed0;hpb=df4edacd55663aecee58a9b3f95cbc08bceaab81;p=debian%2Fgnuradio diff --git a/config/usrp_libusb.m4 b/config/usrp_libusb.m4 index bbf94b82..cc3410f4 100644 --- a/config/usrp_libusb.m4 +++ b/config/usrp_libusb.m4 @@ -18,47 +18,256 @@ dnl the Free Software Foundation, Inc., 51 Franklin Street, dnl Boston, MA 02110-1301, USA. # $1 is $req_libusb1: -# yes : check libusb-1.0 -# no : check libusb-0.12 -# "" : check libusb-0.12 +# yes : check libusb-1.0 +# no : check libusb-0.12 +# "" : check libusb-0.12 AC_DEFUN([USRP_LIBUSB], [ - libusbok=yes - have_libusb1=no - if test [x]$1 = xyes; then - PKG_CHECK_MODULES(USB, libusb-1.0, [have_libusb1=yes], [ - AC_LANG_PUSH(C) - AC_CHECK_HEADERS([libusb-1.0/libusb.h], [have_libusb1=yes], - [libusbok=no; AC_MSG_RESULT([USRP requires libusb-1.0. libusb.h not found. See http://www.libusb.org])]) - AC_SEARCH_LIBS(libusb_bulk_transfer, [usb], [USB_LIBS="$LIBS"], - [libusbok=no; AC_MSG_RESULT([USRP requires libusb-1.0. libusb_bulk_transfer not found. See http://www.libusb.org])]) - AC_LANG_POP - ]) - else - PKG_CHECK_MODULES(USB, libusb, [], [ + dnl do not use LDFLAGS, except on Windows + saved_LDFLAGS=${LDFLAGS} + case "$host_os" in + cygwin* | mingw*) + ;; + *) + LDFLAGS= + ;; + esac + + dnl this variable is set in usrp/usrp.pc.in as a requirement + dnl for libusrp; it is OK to be empty. + LIBUSB_PKG_CONFIG_NAME= + + dnl for Windows (cygin, mingw), do not use PKGCONFIG since LIBUSB + dnl does not install a .pc file. For all other OSs, use + dnl PKGCONFIG to check for various package names first. + libusb_list='' + case "$host_os" in + cygwin* | mingw*) + libusb_list='libusb' + ;; + *) + dnl create the list of libusb PKGCONFIG modules to test + if test x$1 = xyes; then + dnl libusb-1.0 was requested; just test for it + libusb_list="libusb-1.0" + else + dnl test for legacy libusb only + libusb_list="libusb libusb-legacy" + fi + ;; + esac + + dnl loop over various possible 'libusb' names, and + dnl choose the first one that meets both the user's selection + dnl (via configure flags) as well as what is installed + for libusb_name in ${libusb_list}; do + dnl clear internal variables + libusbok=no + have_libusb1=no + usb_header='' + usb_lib_func='' + usb_lib_name='' + + case "$host_os" in + cygwin* | mingw*) + USB_INCLUDEDIR= + USB_INCLUDES= + USB_LIBS=-lusb + usb_header='usb.h' + usb_lib_func='usb_bulk_write' + libusbok=yes + ;; + *) + dnl start checks + AC_MSG_NOTICE([Checking for LIBUSB version '${libusb_name}']) + if test ${libusb_name} = "libusb-1.0"; then + dnl see if the pkgconfig module is available + PKG_CHECK_MODULES(USB, ${libusb_name}, [ + libusbok=yes + have_libusb1=yes + usb_header='libusb-1.0/libusb.h' + usb_lib_func='libusb_bulk_transfer' + ], [libusbok=no]) + else + dnl see if the pkgconfig module is available + PKG_CHECK_MODULES(USB, ${libusb_name}, [ + libusbok=yes + usb_header='usb.h' + usb_lib_func='usb_bulk_write' + ], [libusbok=no]) + fi + ;; + esac + if test $libusbok = yes; then + dnl PKGCONFIG found a version of LIBUSB, or the info was + dnl provided by the user, or the OS is Windows. + + dnl Check it to make sure it meets enough criteria: + dnl Verify that $usb_header is a valid header. If so, then + dnl verify that $usb_lib_func can be found in the library + dnl $usb_lib_name. if so, verify that the symbol 'usb_debug' is + dnl found in the library if not using Windows. + + dnl Check for the header. Similar to AC_CHECK_HEADERS, + dnl but doesn't append to known \#defines. + dnl If PKGCONFIG found variable USB_INCLUDEDIR, and it is + dnl not empty, use it for checking for $usb_header. + dnl Otherwise, maybe the user's shell environment is already + dnl configured to find this header. AC_LANG_PUSH(C) - AC_CHECK_HEADERS([usb.h], [], - [libusbok=no; AC_MSG_RESULT([USRP requires libusb. usb.h not found. See http://www.libusb.org])]) - save_LIBS="$LIBS" + save_CPPFLAGS="$CPPFLAGS" + if test x$USB_INCLUDEDIR != x; then + USB_INCLUDES="-I$USB_INCLUDEDIR" + CPPFLAGS="$USB_INCLUDES" + fi + AC_MSG_CHECKING([$libusb_name for header $usb_header]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include "$usb_header" + ]], [])], + [libusbok=yes],[libusbok=no]) + AC_MSG_RESULT([$libusbok]) + CPPFLAGS="$save_CPPFLAGS" + AC_LANG_POP(C) + + if test $libusbok = yes; then + dnl found the header; now make sure the library is OK + dnl On Darwin, need to include the IOKit library. + + AC_LANG_PUSH(C) + save_LIBS="$LIBS" + case "$host_os" in + darwin*) + USB_LIBS="$USB_LIBS -lIOKit" + ;; + *) ;; + esac + LIBS="$USB_LIBS" + + dnl find the library link name + usb_lib_name=`echo $USB_LIBS | sed -e "s@.*-l\(usb[[^ ]]*\).*@\1@"` + + dnl Check for the function in the library. Similar to + dnl AC_CHECK_LIB, but doesn't append to known \#defines. + AC_MSG_CHECKING([$libusb_name for function $usb_lib_func in library $usb_lib_name]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + #ifdef __cplusplus + extern "C" + #endif + char $usb_lib_func (); + ]], [[return $usb_lib_func ();]])], + [libusbok=yes],[libusbok=no]) + AC_MSG_RESULT([$libusbok]) + LIBS="$save_LIBS" + AC_LANG_POP(C) + + if test $libusbok = yes; then + if test ${libusb_name} != "libusb-1.0"; then + dnl PKGCONFIG found a legacy version of libusb; make sure the + dnl variable _usb_debug is available in the found library. + dnl Do not test on Windows, since that symbol is not defined. + case "$host_os" in + cygwin* | mingw*) + ;; + *) + AC_LANG_PUSH(C) + save_CPPFLAGS="$CPPFLAGS" + if test x$USB_INCLUDEDIR != x; then + CPPFLAGS="$USB_INCLUDES" + fi + save_LIBS="$LIBS" + LIBS="$USB_LIBS" + AC_MSG_CHECKING([$libusb_name for symbol usb_debug in library $usb_lib_name]) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + extern int usb_debug;]], + [[usb_debug = 0;]])], + [libusbok=yes],[libusbok=no]) + AC_MSG_RESULT([$libusbok]) + LIBS="$save_LIBS" + CPPFLAGS="$save_CPPFLAGS" + AC_LANG_POP(C) + ;; + esac + fi + fi + fi + fi + dnl if everything checks out OK, finish up + if test $libusbok = yes; then case "$host_os" in - darwin*) - LIBS="$LIBS -lIOKit" - ;; - *) ;; + cygwin* | mingw*) + ;; + *) + LIBUSB_PKG_CONFIG_NAME="${libusb_name}" + ;; esac + break + else + dnl something wasn't found in this LIBUSB version. + dnl HACK: clear cache variables for header and library + unset USB_INCLUDEDIR + unset USB_INCLUDES + unset USB_LIBS + unset $as_ac_Header + unset $as_ac_Lib + fi + done + + if test $libusbok = yes; then + dnl final error checking, mostly to create #define's + AC_LANG_PUSH(C) + save_CPPFLAGS="$CPPFLAGS" + if test x$USB_INCLUDEDIR != x; then + CPPFLAGS="$USB_INCLUDES" + fi + dnl Check for the header. + AC_CHECK_HEADERS([$usb_header], [], [libusbok=no]) + CPPFLAGS="$save_CPPFLAGS" + AC_LANG_POP(C) - AC_SEARCH_LIBS(usb_bulk_write, [usb], [USB_LIBS="$LIBS"], - [libusbok=no; AC_MSG_RESULT([USRP requires libusb. usb_bulk_write not found. See http://www.libusb.org])]) + if test $libusbok = no; then + AC_MSG_RESULT([USRP requires libusb header '$usb_header' which was not found or was not usable. See http://www.libusb.org]) + else + dnl check for the library (again) + AC_LANG_PUSH(C) + save_CPPFLAGS="$CPPFLAGS" + if test x$USB_INCLUDEDIR != x; then + CPPFLAGS="$USB_INCLUDES" + fi + save_LIBS="$LIBS" + LIBS="$USB_LIBS" + AC_CHECK_LIB([$usb_lib_name], [$usb_lib_func], [], [ + libusbok=no + AC_MSG_RESULT([USRP requires library '$usb_lib_name' with function '$usb_lib_func', which was either not found or was not usable. See http://www.libusb.org])]) +# case "$host_os" in +# cygwin* | mingw*) +# USB_LIBS="$LIBS" +# ;; +# *) ;; +# esac LIBS="$save_LIBS" - AC_LANG_POP - ]) + CPPFLAGS="$save_CPPFLAGS" + AC_LANG_POP(C) + fi fi - if test x$libusbok = xyes; then - AC_SUBST(USB_LIBS) + if test $libusbok = yes; then + dnl success + AC_MSG_NOTICE([Using LIBUSB version '${libusb_name}']) ifelse([$2], , :, [$2]) else + dnl not found; clear substitution variables + LIBUSB_PKG_CONFIG_NAME= + USB_INCLUDES= + USB_LIBS= ifelse([$3], , :, [$3]) fi + + dnl create substitution variables + AC_SUBST(USB_INCLUDES) + AC_SUBST(USB_LIBS) + AC_SUBST(LIBUSB_PKG_CONFIG_NAME) + + dnl restore LDFLAGS + LDFLAGS=${saved_LDFLAGS} ])