dnl Copyright 2003,2008,2009 Free Software Foundation, Inc. dnl dnl This file is part of GNU Radio dnl dnl GNU Radio is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3, or (at your option) dnl any later version. dnl dnl GNU Radio is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with GNU Radio; see the file COPYING. If not, write to 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 AC_DEFUN([USRP_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) 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 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) 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" CPPFLAGS="$save_CPPFLAGS" AC_LANG_POP(C) fi fi 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} ])