From 191a5736c202dfb784e86a8190edc64e80dc62e5 Mon Sep 17 00:00:00 2001
From: Paul Fertser <fercerpav@gmail.com>
Date: Wed, 11 Sep 2013 23:07:59 +0200
Subject: [PATCH] libusb: require pkg-config support

An alternative approach to show how much cleaner the pure pkg-config
way is.

This changes the discovery procedures for libusb-1.0 and libusb-0.1,
making them depend on pkg-config being properly installed and
configured, including the necessary build host configuration for the
cross-builds (see
http://www.flameeyes.eu/autotools-mythbuster/pkgconfig/cross-compiling.html)

It should make it possible to compile OpenOCD without changes and
extra effort on GNU/Linux, FreeBSD users would need to supply a .pc
file for their libusb implementation or add LIBUSB1_LIBS and
LIBUSB1_CFLAGS to the configure environment.

Change-Id: I826e378dd1e0d101a549a573b2c63212a7e00b64
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Reviewed-on: http://openocd.zylin.com/1467
Reviewed-by: Xiaofan <xiaofanc@gmail.com>
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
Tested-by: Spencer Oliver <spen@spen-soft.co.uk>
---
 README                            | 14 +++++++++++++-
 README.OSX                        |  6 +++---
 README.Windows                    | 12 ++++++++++++
 configure.ac                      | 15 +++++++--------
 src/Makefile.am                   |  4 ++--
 src/helper/Makefile.am            |  2 ++
 src/helper/replacements.c         |  2 +-
 src/jtag/aice/Makefile.am         |  2 +-
 src/jtag/drivers/Makefile.am      |  2 ++
 src/jtag/drivers/libusb1_common.h |  2 +-
 src/jtag/drivers/mpsse.c          |  2 +-
 src/jtag/drivers/ti_icdi_usb.c    |  2 +-
 12 files changed, 46 insertions(+), 19 deletions(-)

diff --git a/README b/README
index 0781dfc42..c5c1e6287 100644
--- a/README
+++ b/README
@@ -210,6 +210,7 @@ You'll also need:
 
 - make
 - libtool
+- pkg-config >= 0.23 (or compatible)
 
 Additionally, for building from git:
 
@@ -218,7 +219,8 @@ Additionally, for building from git:
 - texinfo
 
 USB-based adapters depend on libusb-1.0 and some older drivers require
-libusb-0.1 or libusb-compat-0.1.
+libusb-0.1 or libusb-compat-0.1. A compatible implementation, such as
+FreeBSD's, additionally needs the corresponding .pc files.
 
 USB-Blaster, ASIX Presto, OpenJTAG and ft2232 interface adapter
 drivers need either one of:
@@ -272,6 +274,16 @@ e.g. for cross-building for Windows 32-bit with MinGW on Debian:
 
   ./configure --host=i686-w64-mingw32 [options]
 
+To make pkg-config work nicely for cross-compiling, you might need an
+additional wrapper script as described at
+
+  http://www.flameeyes.eu/autotools-mythbuster/pkgconfig/cross-compiling.html
+
+This is needed to tell pkg-config where to look for the target
+libraries that OpenOCD depends on. Alternatively, you can specify
+*_CFLAGS and *_LIBS environment variables directly, see "./configure
+--help" for the details.
+
 Parallel Port Dongles
 ---------------------
 
diff --git a/README.OSX b/README.OSX
index 5fec44f20..2a023f16f 100644
--- a/README.OSX
+++ b/README.OSX
@@ -9,9 +9,9 @@ There are a few prerequisites you will need first:
   or
 - Homebrew (http://mxcl.github.io/homebrew/)
 
-libtool, automake, autoconf and libusb can be easily installed via
-MacPorts:
-  sudo port install libtool automake autoconf libusb [libusb-compat]
+libtool, automake, autoconf, pkg-config and libusb can be easily
+installed via MacPorts:
+  sudo port install libtool automake autoconf pkgconfig libusb [libusb-compat]
 or with Homebrew:
   brew install libtool automake libusb [libusb-compat]
 
diff --git a/README.Windows b/README.Windows
index 1e9c49631..f923228af 100644
--- a/README.Windows
+++ b/README.Windows
@@ -5,6 +5,18 @@ You can build OpenOCD for Windows natively with either MinGW/MSYS or
 Cygwin. Alternatively, one can cross-compile it using MinGW on a *nix
 host. See README for the generic instructions.
 
+Native MinGW/MSYS compilation
+-----------------------------
+
+As MSYS doesn't come with pkg-config pre-installed, you need to add it
+manually. The easiest way to do that is to download pkg-config-lite
+from:
+
+  http://sourceforge.net/projects/pkgconfiglite/
+
+Then simply unzip the archive to the root directory of your MSYS
+installation.
+
 USB adapters
 ------------
 
diff --git a/configure.ac b/configure.ac
index c7700dc31..7f49ba05a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -19,6 +19,7 @@ AC_PROG_CC
 AC_PROG_CC_C99
 AM_PROG_CC_C_O
 AC_PROG_RANLIB
+PKG_PROG_PKG_CONFIG([0.23])
 
 dnl disable checks for C++, Fortran and GNU Java Compiler
 m4_defun([_LT_AC_LANG_CXX_CONFIG], [:])
@@ -1175,10 +1176,10 @@ fi
 # check for libusb library if necessary
 use_libusb1=no
 if test $need_usb = yes -o $need_usb_ng = yes; then
-  AC_CHECK_HEADER([libusb-1.0/libusb.h], [
-	AC_DEFINE([HAVE_LIBUSB1], [1], [Define if you have libusb-1.x])
+  PKG_CHECK_MODULES([LIBUSB1], [libusb-1.0], [
 	use_libusb1=yes
-	AC_SEARCH_LIBS([libusb_error_name], [usb-1.0],
+	AC_DEFINE([HAVE_LIBUSB1], [1], [Define if you have libusb-1.x])
+	PKG_CHECK_EXISTS([libusb-1.0 >= 1.0.9],
 		[AC_DEFINE([HAVE_LIBUSB_ERROR_NAME], [1], [Define if your libusb has libusb_error_name()])],
 		[AC_MSG_WARN([libusb-1.x older than 1.0.9 detected, consider updating])])
   ], [
@@ -1193,11 +1194,9 @@ fi
 
 use_libusb0=no
 if test $need_usb0 = yes; then
-	AC_CHECK_HEADERS([usb.h], [
-			use_libusb0=yes
-		], [
-			AC_MSG_ERROR([libusb-0.1 is required to build some OpenOCD driver(s)])
-		])
+	PKG_CHECK_MODULES([LIBUSB0], [libusb], [use_libusb0=yes], [
+		AC_MSG_ERROR([libusb-0.1 is required to build some OpenOCD driver(s)])
+	])
 fi
 
 AM_CONDITIONAL([RELEASE], [test $build_release = yes])
diff --git a/src/Makefile.am b/src/Makefile.am
index 5c2081a48..3413ba953 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -75,11 +75,11 @@ endif
 
 LIBUSB =
 if USE_LIBUSB1
-LIBUSB += -lusb-1.0
+LIBUSB += $(LIBUSB1_LIBS)
 endif
 
 if USE_LIBUSB0
-LIBUSB += -lusb
+LIBUSB += $(LIBUSB0_LIBS)
 endif
 
 libopenocd_la_LIBADD = \
diff --git a/src/helper/Makefile.am b/src/helper/Makefile.am
index 9e27d051e..215bbaed5 100644
--- a/src/helper/Makefile.am
+++ b/src/helper/Makefile.am
@@ -5,6 +5,8 @@ noinst_LTLIBRARIES = libhelper.la
 
 CONFIGFILES = options.c time_support_common.c
 
+libhelper_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBUSB1_CFLAGS)
+
 libhelper_la_SOURCES = \
 	binarybuffer.c \
 	$(CONFIGFILES) \
diff --git a/src/helper/replacements.c b/src/helper/replacements.c
index d8d8fd0bf..b083096f8 100644
--- a/src/helper/replacements.c
+++ b/src/helper/replacements.c
@@ -278,7 +278,7 @@ int win_select(int max_fd, fd_set *rfds, fd_set *wfds, fd_set *efds, struct time
 #endif
 
 #if defined HAVE_LIBUSB1 && !defined HAVE_LIBUSB_ERROR_NAME
-#include <libusb-1.0/libusb.h>
+#include <libusb.h>
 /* Verbatim from git://git.libusb.org/libusb.git tag 1.0.9
  * The libusb_error enum is compatible down to v0.9.1
  */
diff --git a/src/jtag/aice/Makefile.am b/src/jtag/aice/Makefile.am
index 38c441e12..7b9469d86 100644
--- a/src/jtag/aice/Makefile.am
+++ b/src/jtag/aice/Makefile.am
@@ -1,6 +1,6 @@
 include $(top_srcdir)/common.mk
 
-AM_CPPFLAGS += -I$(top_srcdir)/src/jtag/drivers
+AM_CPPFLAGS += -I$(top_srcdir)/src/jtag/drivers $(LIBUSB1_CFLAGS) $(LIBUSB0_CFLAGS)
 
 noinst_LTLIBRARIES = libocdaice.la
 
diff --git a/src/jtag/drivers/Makefile.am b/src/jtag/drivers/Makefile.am
index e3ed2199a..e8f1efbc0 100644
--- a/src/jtag/drivers/Makefile.am
+++ b/src/jtag/drivers/Makefile.am
@@ -6,6 +6,8 @@ libocdjtagdrivers_la_LIBADD =
 libocdjtagdrivers_la_SOURCES = \
 	$(DRIVERFILES)
 
+libocdjtagdrivers_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBUSB1_CFLAGS) $(LIBUSB0_CFLAGS)
+
 ULINK_FIRMWARE = $(srcdir)/OpenULINK
 
 EXTRA_DIST = $(ULINK_FIRMWARE)
diff --git a/src/jtag/drivers/libusb1_common.h b/src/jtag/drivers/libusb1_common.h
index cd1f7f10f..0e653d845 100644
--- a/src/jtag/drivers/libusb1_common.h
+++ b/src/jtag/drivers/libusb1_common.h
@@ -22,7 +22,7 @@
 #ifndef JTAG_LIBUSB_COMMON_H
 #define JTAG_LIBUSB_COMMON_H
 
-#include <libusb-1.0/libusb.h>
+#include <libusb.h>
 
 #define jtag_libusb_device			libusb_device
 #define jtag_libusb_device_handle		libusb_device_handle
diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c
index c5fd6d7fa..c5e0b61c1 100644
--- a/src/jtag/drivers/mpsse.c
+++ b/src/jtag/drivers/mpsse.c
@@ -24,7 +24,7 @@
 
 #include "mpsse.h"
 #include "helper/log.h"
-#include <libusb-1.0/libusb.h>
+#include <libusb.h>
 
 /* Compatibility define for older libusb-1.0 */
 #ifndef LIBUSB_CALL
diff --git a/src/jtag/drivers/ti_icdi_usb.c b/src/jtag/drivers/ti_icdi_usb.c
index c0c071879..f10d12073 100644
--- a/src/jtag/drivers/ti_icdi_usb.c
+++ b/src/jtag/drivers/ti_icdi_usb.c
@@ -33,7 +33,7 @@
 
 #include <target/cortex_m.h>
 
-#include <libusb-1.0/libusb.h>
+#include <libusb.h>
 
 #define ICDI_WRITE_ENDPOINT 0x02
 #define ICDI_READ_ENDPOINT 0x83
-- 
GitLab