Commit f7274784 authored by duane's avatar duane
Browse files

Build Permutations with ftd2xx and libftdi addressed. Also added a new se of...

Build Permutations with ftd2xx and libftdi addressed. Also added a new se of regression makefiles to build openocd in multiple ways

git-svn-id: svn://svn.berlios.de/openocd/trunk@1275 b42882b7-edfa-0310-969c-e2dbd0fdcd60
parent 437a9818
......@@ -28,6 +28,133 @@ is_cygwin=no
is_mingw=no
is_win32=no
# We are not *ALWAYS* being installed in the standard place.
# We may be installed in a "tool-build" specific location.
# Normally with other packages - as part of a tool distro.
# Thus - we should search that 'libdir' also.
#
# And - if we are being installed there - the odds are
# The libraries unique to what we are are there too.
#
# what matters is the "exec-prefix"
if test $exec_prefix != $ac_default_prefix
then
# use build specific install library dir
LDFLAGS="$LDFLAGS -L$libdir"
# RPATH becomes an issue on Linux only
if test $host_os = linux-gnu
then
LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir"
fi
# The "INCDIR" is also usable
CFLAGS="$CFLAGS -I$includedir"
fi
AC_ARG_WITH(ftd2xx,
AS_HELP_STRING([--with-ftd2xx=<PATH>],[This option has been removed.]),
[
# Option Given.
cat << __EOF__
The option: --with-ftd2xx=<PATH> has been removed replaced.
On Linux, the new option is:
--with-ftd2xx-linux-tardir=/path/to/files
Where <path> is the path the the directory where the "tar.gz" file
from FTDICHIP.COM was unpacked, for example:
--with-ftd2xx-linux-tardir=/home/duane/libftd2xx-linux-tardir=/home/duane/libftd2xx0.4.16
On Cygwin/MingW32, the new option is:
--with-ftd2xx-win32-zipdir=/path/to/files
Where <path> is the path to the directory where the "zip" file from
FTDICHIP.COM was unpacked, for example:
--with-ftd2xx-win32-zipdir=/home/duane/ftd2xx.cdm.files
__EOF__
AC_MSG_ERROR([Sorry Cannot continue])
],
[
# Option not given
true
]
)
#========================================
# FTD2XXX support comes in 3 forms.
# (1) win32 - via a zip file
# (2) linux - via a tar file
# (3) linux/cygwin/mingw - via libftdi
#
# In case (1) and (2) we need to know where the package was unpacked.
AC_ARG_WITH(ftd2xx-win32-zipdir,
AS_HELP_STRING([--with-ftd2xx-win32-zipdir],[Where (CYGWIN/MINGW) the zip file from ftdichip.com was unpacked <default=search>]),
[
# option present
if test -d $with_ftd2xx_win32_zipdir
then
with_ftd2xx_win32_zipdir=`cd $with_ftd2xx_win32_zipdir && pwd`
AC_MSG_NOTICE([Using: ftdichip.com library: $with_ftd2xx_win32_zipdir])
else
AC_MSG_ERROR([Parameter to --with-ftd2xx-win32-zipdir is not a dir: $with_ftd2xx_win32_zipdir])
fi
],
[
# not given
true
]
)
AC_ARG_WITH(ftd2xx-linux-tardir,
AS_HELP_STRING([--with-ftd2xx-linux-tardir], [Where (Linux/Unix) the tar file from ftdichip.com was unpacked <default=search>]),
[
# Option present
if test $is_win32 = yes ; then
AC_MSG_ERROR([The option: --with-ftd2xx-linux-tardir is only usable on linux])
fi
if test -d $with_ftd2xx_linux_tardir
then
with_ftd2xx_linux_tardir=`cd $with_ftd2xx_linux_tardir && pwd`
AC_MSG_NOTICE([Using: ftdichip.com library: $with_ftd2xx_linux_tardir])
else
AC_MSG_ERROR([Parameter to --with-ftd2xx-linux-tardir is not a dir: $with_ftd2xx_linux_tardir])
fi
],
[
# Not given
true
]
)
AC_ARG_WITH(ftd2xx-lib,
AS_HELP_STRING([--with-ftd2xx-lib], [Use static or shared ftd2xx libs on default static]),
[
case "$withval" in
static)
with_ftd2xx_lib=$withval
;;
shared)
with_ftd2xx_lib=$withval
;;
*)
AC_MSG_ERROR([Option: --with-ftd2xx-lib=static or --with-ftd2xx-lib=shared not, $withval])
;;
esac
],
[
# Default is static - it is simpler :-(
with_ftd2xx_lib=static
]
)
AC_ARG_ENABLE(gccwarnings,
AS_HELP_STRING([--enable-gccwarnings], [Enable compiler warnings, default no]),
[gcc_warnings=$enableval], [gcc_warnings=no])
......@@ -52,11 +179,11 @@ case "${host_cpu}" in
esac
AC_ARG_ENABLE(ft2232_libftdi,
AS_HELP_STRING([--enable-ft2232_libftdi], [Enable building support for FT2232 based devices using the libftdi driver]),
AS_HELP_STRING([--enable-ft2232_libftdi], [Enable building support for FT2232 based devices using the libftdi driver, opensource alternate of FTD2XX]),
[build_ft2232_libftdi=$enableval], [build_ft2232_libftdi=no])
AC_ARG_ENABLE(ft2232_ftd2xx,
AS_HELP_STRING([--enable-ft2232_ftd2xx], [Enable building support for FT2232 based devices using the FTD2XX driver]),
AS_HELP_STRING([--enable-ft2232_ftd2xx], [Enable building support for FT2232 based devices using the FTD2XX driver from ftdichip.com]),
[build_ft2232_ftd2xx=$enableval], [build_ft2232_ftd2xx=no])
AC_ARG_ENABLE(amtjtagaccel,
......@@ -120,11 +247,6 @@ AC_ARG_ENABLE(rlink,
AS_HELP_STRING([--enable-rlink], [Enable building support for the Raisonance RLink JTAG Programmer]),
[build_rlink=$enableval], [build_rlink=no])
AC_ARG_WITH(ftd2xx,
[AS_HELP_STRING(--with-ftd2xx,
[Where libftd2xx can be found <default=search>])],
[],
with_ftd2xx=search)
case $host in
*-cygwin*)
......@@ -296,6 +418,198 @@ else
AC_DEFINE(BUILD_RLINK, 0, [0 if you don't want the RLink JTAG driver.])
fi
#-- Deal with MingW/Cygwin FTD2XX issues
if test $is_win32 = yes; then
if test "${with_ftd2xx_linux_tardir+set}" = set
then
AC_MSG_ERROR([The option: with_ftd2xx_linux_tardir is for LINUX only.])
fi
if test $build_ft2232_ftd2xx = yes ; then
AC_MSG_CHECKING([for ftd2xx.lib exists (win32)])
# if we are given a zipdir...
if test "${with_ftd2xx_win32_zipdir+set}" = set
then
# Set the CFLAGS for "ftd2xx.h"
f=$with_ftd2xx_win32_zipdir/ftd2xx.h
if test ! -f $f ; then
AC_MSG_ERROR([File: $f cannot be found])
fi
CFLAGS="$CFLAGS -I$with_ftd2xx_win32_zipdir"
# And calculate the LDFLAGS for the machine
case "$host_cpu" in
i?86|x86_*)
LDFLAGS="$LFLAGS -L$with_ftd2xx_win32_zipdir/i386"
LIBS="$LIBS -lftd2xx"
f=$with_ftd2xx_win32_zipdir/i386/ftd2xx.lib
;;
amd64)
LDFLAGS="$LFLAGS -L$with_ftd2xx_win32_zipdir/amd64"
LIBS="$LIBS -lftd2xx"
f=$with_ftd2xx_win32_zipdir/amd64/ftd2xx.lib
;;
*)
AC_MSG_ERROR([Unknown Win32 host cpu: $host_cpu])
;;
esac
if test ! -f $f ; then
AC_MSG_ERROR([Library: $f not found])
fi
else
LIBS="$LIBS -lftd2xx"
AC_MSG_WARN([ASSUMPTION: The (win32) FTDICHIP.COM files: ftd2xx.h and ftd2xx.lib are in a proper place])
fi
fi
fi
if test $is_win32 = no; then
if test "${with_ftd2xx_win32_zipdir+set}" = set
then
AC_MSG_ERROR([The option: --with-ftd2xx-win32-zipdir is for win32 only])
fi
if test $build_ft2232_ftd2xx = yes ; then
AC_MSG_CHECKING([for libftd2xx.a (linux)])
# Must be linux -
# Cause FTDICHIP does not supply a MAC-OS version
if test $host_os != linux-gnu; then
AC_MSG_ERROR([The (linux) ftd2xx library from FTDICHIP.com is linux only. Try --enable-ft2232-libftdi instead])
fi
# Are we given a TAR directory?
if test "${with_ftd2xx_linux_tardir+set}" = set
then
# The .H file is simple..
f=$with_ftd2xx_linux_tardir/ftd2xx.h
if test ! -f $f ; then
AC_MSG_ERROR([Option: --with-ftd2xx-linux-tardir appears wrong, cannot find: $f])
fi
CFLAGS="$CFLAGS -I$with_ftd2xx_linux_tardir"
if test $with_ftd2xx_lib = shared
then
LDFLAGS="$LDFLAGS -L$with_ftd2xx_linux_tardir"
LIBS="$LIBS -lftd2xx"
AC_MSG_RESULT([ Assuming: -L$with_ftd2xx_linux_tardir -lftd2xx])
else
# Test #1 - Future proof - if/when ftdichip fixes their distro.
# Try it with the simple ".a" suffix.
f=$with_ftd2xx_linux_tardir/static_lib/libftd2xx.a
if test -f $f ; then
# Yea we are done
LDFLAGS="$LDFLAGS -L$with_ftd2xx_linux_tardir/static_lib"
LIBS="$LIBS -lftd2xx"
else
# Test Number2.
# Grr.. perhaps it exists as a version number?
f="$with_ftd2xx_linux_tardir/static_lib/libftd2xx.a.*.*.*"
count=`ls $f | wc -l`
if test $count -gt 1 ; then
AC_MSG_ERROR([Multiple libftd2xx.a files found in: $with_ftd2xx_linux_tardir/static_lib sorry cannot handle this yet])
fi
if test $count -ne 1 ; then
AC_MSG_ERROR([Not found: $f, option: --with-ftd2xx-linux-tardir appears to be wrong])
fi
# Because the "-l" rules do not understand version numbers...
# we will just stuff the absolute path onto the LIBS variable
f=`ls $f`
#
LIBS="$LIBS $f -lpthread"
# No need to bother with LDFLAGS...
fi
AC_MSG_RESULT([Found: $f])
fi
else
LIBS="$LIBS -lftd2xx"
AC_MSG_RESULT([Assumed: installed])
AC_MSG_WARN([The (linux) FTDICHIP.COM files ftd2xx.h and libftd2xx.so are assumed to be in a proper place])
fi
fi
fi
if test $build_ft2232_ftd2xx = yes; then
# Before we go any further - make sure we can *BUILD* and *RUN*
# a simple app with the "ftd2xx.lib" file - in what ever form we where given
# We should be able to compile, link and run this test program now
AC_MSG_CHECKING([Test: Build & Link with ftd2xx])
#
# Save the LDFLAGS for later..
LDFLAGS_SAVE=$LDFLAGS
CFLAGS_SAVE=$CFLAGS
_LDFLAGS=`eval echo $LDFLAGS`
_CFLAGS=`eval echo $CFLAGS`
LDFLAGS=$_LDFLAGS
CFLAGS=$_CFLAGS
AC_RUN_IFELSE(
[
#include "confdefs.h"
#if IS_WIN32
#include "windows.h"
#endif
#include <stdio.h>
#include <ftd2xx.h>
int
main( int argc, char **argv )
{
DWORD x;
FT_GetLibraryVersion( &x );
return 0;
}
], [ AC_MSG_RESULT([Success!])] , [ AC_MSG_ERROR([Cannot build & run test program using ftd2xx.lib]) ] )
LDFLAGS=$LDFLAGS_SAVE
CFLAGS=$CFLAGS_SAVE
fi
if test $build_ft2232_libftdi = yes ; then
# We assume: the package is preinstalled in the proper place
# these present as 2 libraries..
LIBS="$LIBS -lftdi -lusb"
#
# Try to build a small program.
AC_MSG_CHECKING([Build & Link with libftdi...])
LDFLAGS_SAVE=$LDFLAGS
CFLAGS_SAVE=$CFLAGS
_LDFLAGS=`eval echo $LDFLAGS`
_CFLAGS=`eval echo $CFLAGS`
LDFLAGS=$_LDFLAGS
CFLAGS=$_CFLAGS
AC_RUN_IFELSE(
[
#include <stdio.h>
#include <ftdi.h>
int
main( int argc, char **argv )
{
struct ftdi_context *p;
p = ftdi_new();
if( p != NULL ){
return 0;
} else {
fprintf( stderr, "calling ftdi_new() failed\n");
return 1;
}
}
]
,
[ AC_MSG_RESULT([Success]) ]
,
[ AC_MSG_ERROR([Cannot build & run test program using libftdi]) ] )
# Restore the 'unexpanded ldflags'
LDFLAGS=$LDFLAGS_SAVE
CFLAGS=$CFLAGS_SAVE
fi
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(openocd, 1.0)
......@@ -321,7 +635,6 @@ AM_CONDITIONAL(RLINK, test $build_rlink = yes)
AM_CONDITIONAL(IS_CYGWIN, test $is_cygwin = yes)
AM_CONDITIONAL(IS_MINGW, test $is_mingw = yes)
AM_CONDITIONAL(IS_WIN32, test $is_win32 = yes)
AM_CONDITIONAL(FTD2XXDIR, test $with_ftd2xx != search)
AM_CONDITIONAL(BITQ, test $build_bitq = yes)
AC_LANG_C
......@@ -377,6 +690,6 @@ fi
AC_MSG_RESULT([$EXEEXT_FOR_BUILD])
AC_SUBST(EXEEXT_FOR_BUILD)
AC_SUBST(WITH_FTD2XX, $with_ftd2xx)
#AC_SUBST(WITH_FTD2XX, $with_ftd2xx)
AC_OUTPUT(Makefile src/Makefile src/helper/Makefile src/jtag/Makefile src/xsvf/Makefile src/target/Makefile src/server/Makefile src/flash/Makefile src/pld/Makefile doc/Makefile)
......@@ -127,11 +127,13 @@ The main OpenOCD web site is available at @uref{http://openocd.berlios.de/web/}
@chapter Building
@cindex building OpenOCD
@section Pre-Built Tools
If you are interested in getting actual work done rather than building
OpenOCD, then check if your interface supplier provides binaries for
you. Chances are that that binary is from some SVN version that is more
stable than SVN trunk where bleeding edge development takes place.
@section Building From Source
You can download the current SVN version with SVN client of your choice from the
following repositories:
......@@ -166,8 +168,7 @@ a FTDI FT2232 based interface:
homepage (@uref{www.amontec.com}), as the JTAGkey uses a non-standard VID/PID.
@end itemize
libftdi is supported under windows. Versions earlier than 0.13 will require patching.
see contrib/libftdi for more details.
libftdi is supported under windows. Do not use versions earlier then 0.14.
In general, the D2XX driver provides superior performance (several times as fast),
but has the draw-back of being binary-only - though that isn't that bad, as it isn't
......@@ -179,35 +180,37 @@ To build OpenOCD (on both Linux and Cygwin), use the following commands:
@end example
Bootstrap generates the configure script, and prepares building on your system.
@example
./configure
./configure [options, see below]
@end example
Configure generates the Makefiles used to build OpenOCD.
@example
make
make install
@end example
Make builds OpenOCD, and places the final executable in ./src/.
Make builds OpenOCD, and places the final executable in ./src/, the last step, ``make install'' is optional.
The configure script takes several options, specifying which JTAG interfaces
should be included:
@itemize @bullet
@item
@option{--enable-parport}
@option{--enable-parport} - Bit bang pc printer ports.
@item
@option{--enable-parport_ppdev}
@option{--enable-parport_ppdev} - Parallel Port [see below]
@item
@option{--enable-parport_giveio}
@option{--enable-parport_giveio} - Parallel Port [see below]
@item
@option{--enable-amtjtagaccel}
@option{--enable-amtjtagaccel} - Parallel Port [Amontec, see below]
@item
@option{--enable-ft2232_ftd2xx}
@footnote{Using the latest D2XX drivers from FTDI and following their installation
instructions, I had to use @option{--enable-ft2232_libftd2xx} for OpenOCD to
build properly.}
@option{--enable-ft2232_ftd2xx} - Numerous USB Type ARM JTAG dongles use the FT2232C chip from this FTDICHIP.COM chip (closed source).
@item
@option{--enable-ft2232_libftdi}
@option{--enable-ft2232_libftdi} - An open source (free) alternate to FTDICHIP.COM ftd2xx solution (Linux, MacOS, Cygwin)
@item
@option{--with-ftd2xx=/path/to/d2xx/}
@option{--with-ftd2xx-win32-zipdir=PATH} - If using FTDICHIP.COM ft2232c, point at the directory where the Win32 FTDICHIP.COM 'CDM' driver zip file was unpacked.
@item
@option{--with-ftd2xx-linux-tardir=PATH} - Linux only equal of @option{--with-ftd2xx-win32-zipdir}, where you unpacked the TAR.GZ file.
@item
@option{--with-ftd2xx-lib=shared|static} - Linux only. Default: static, specifies how the FTDICHIP.COM libftd2xx driver should be linked. Note 'static' only works in conjunction with @option{--with-ftd2xx-linux-tardir}. Shared is supported (12/26/2008), however you must manually install the required header files and shared libraries in an appropriate place. This uses ``libusb'' internally.
@item
@option{--enable-gw16012}
@item
......@@ -217,23 +220,72 @@ build properly.}
@item
@option{--enable-presto_ftd2xx}
@item
@option{--enable-jlink}
@option{--enable-jlink} - From SEGGER
@item
@option{--enable-rlink}
@option{--enable-rlink} - Raisonance.com dongle.
@end itemize
@section Parallel Port Dongles
If you want to access the parallel port using the PPDEV interface you have to specify
both the @option{--enable-parport} AND the @option{--enable-parport_ppdev} option since
the @option{--enable-parport_ppdev} option actually is an option to the parport driver
(see @uref{http://forum.sparkfun.com/viewtopic.php?t=3795} for more info).
Cygwin users have to specify the location of the FTDI D2XX package. This should be an
absolute path containing no spaces.
@section FT2232C Based USB Dongles
There are 2 methods of using the FTD2232, either (1) using the
FTDICHIP.COM closed source driver, or (2) the open (and free) driver
libftdi. Some claim the (closed) FTDICHIP.COM solution is faster.
The FTDICHIP drivers come as either a (win32) ZIP file, or a (linux)
TAR.GZ file. You must unpack them ``some where'' convient. As of this
writing (12/26/2008) FTDICHIP does not supply means to install these
files ``in an appropriate place'' As a result, there are two
``./configure'' options that help.
Below is an example build process:
1) Check out the latest version of ``openocd'' from SVN.
2) Download & Unpack either the Windows or Linux FTD2xx Drivers
(@uref{http://www.ftdichip.com/Drivers/D2XX.htm})
@example
/home/duane/ftd2xx.win32 => the Cygwin/Win32 ZIP file contents.
/home/duane/libftd2xx0.4.16 => the Linux TAR file contents.
@end example
3) Configure with these options:
@example
Cygwin FTCICHIP solution
./configure --prefix=/home/duane/mytools \
--enable-ft2232_ftd2xx \
--with-ftd2xx-win32-zipdir=/home/duane/ftd2xx.win32
Linux FTDICHIP solution
./configure --prefix=/home/duane/mytools \
--enable-ft2232_ftd2xx \
--with-ft2xx-linux-tardir=/home/duane/libftd2xx0.4.16
Cygwin/Linux LIBFTDI solution
Assumes:
1a) For Windows: The windows port of LIBUSB is in place.
1b) For Linux: libusb has been built and is inplace.
2) And libftdi has been built and installed
Note: libftdi - relies upon libusb.
./configure --prefix=/home/duane/mytools \
--enable-ft2232_libftdi
@end example
4) Then just type ``make'', and perhaps ``make install''.
Linux users should copy the various parts of the D2XX package to the appropriate
locations, i.e. /usr/include, /usr/lib.
Miscellaneous configure options
@section Miscellaneous configure options
@itemize @bullet
@item
......
......@@ -55,25 +55,7 @@ endif
endif
endif
if IS_WIN32
if FTD2XXDIR
FTD2XXLDADD = @WITH_FTD2XX@/FTD2XX.lib
else
FTD2XXLDADD = -lftd2xx
endif
else
FTD2XXLDADD = -lftd2xx
endif
if FT2232_FTD2XX
FTD2XXLIB = $(FTD2XXLDADD)
else
if PRESTO_FTD2XX
FTD2XXLIB = $(FTD2XXLDADD)
else
FTD2XXLIB =
endif
endif
openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \
$(top_builddir)/src/target/libtarget.a $(top_builddir)/src/jtag/libjtag.a \
......@@ -81,7 +63,7 @@ openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \
$(top_builddir)/src/server/libserver.a $(top_builddir)/src/helper/libhelper.a \
$(top_builddir)/src/flash/libflash.a $(top_builddir)/src/target/libtarget.a \
$(top_builddir)/src/pld/libpld.a \
$(FTDI2232LIB) $(FTD2XXLIB) $(MINGWLDADD) $(LIBUSB)
$(FTDI2232LIB) $(MINGWLDADD) $(LIBUSB)
if HTTPD
......
......@@ -178,7 +178,8 @@ int parse_cmdline_args(struct command_context_s *cmd_ctx, int argc, char *argv[]
if (version_flag)
{
/* Nothing to do, version gets printed automatically. */
exit(-1);
// It is not an error to request the VERSION number.
exit(0);
}
return ERROR_OK;
......
if FTD2XXDIR
if IS_MINGW
FTD2XXINC = -I@WITH_FTD2XX@
else
FTD2XXINC = -I@WITH_FTD2XX@/
endif
else
FTD2XXINC =
endif
INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/helper $(FTD2XXINC) $(all_includes) -I$(top_srcdir)/src/target
INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/helper $(all_includes) -I$(top_srcdir)/src/target
METASOURCES = AUTO
noinst_LIBRARIES = libjtag.a
......
# -*- mode: makefile -*-
#
default: _complain_
include ./local.uses
%: _complain_
_complain_:
@echo ""
@echo " Try the target: cygwin.buildtest or linux.buildtest "
@echo ""
remove.install:
rm -rf ${INSTALL_DIR}
.PHONY: remove.install
cygwin.buildtest:
${MAKE} -f Makefile.ftd2xx clean all
${MAKE} -f Makefile.openocd cygwin.easy.permutations
${MAKE} -f Makefile.openocd mingw32.easy.permutations
${MAKE} -f Makefile.libftdi all
${MAKE} -f Makefile.openocd cygwin.libftdi
linux.buildtest:
${MAKE} linux.easy.buildtest
${MAKE} linux.ftd2xx_installed
${MAKE} linux.ft2232_libftdi
@echo ""
@echo ""
@echo "========================================"
@echo " Linux Build Tests Complete "
@echo "========================================"
@echo ""
@echo ""
linux.easy.buildtest:
@test -d openocd || (echo "Where the source to openocd?" && exit 1)
${MAKE} -f Makefile.openocd bootstrap
${MAKE} -f Makefile.ftd2xx all
${MAKE} -f Makefile.openocd linux.easy.permutations
linux.ftd2xx_installed:
${MAKE} remove.install
${MAKE} linux.ftd2xx_installed.setup
${MAKE} -f Makefile.openocd $@
linux.ft2232_libftdi:
${MAKE} remove.install
${MAKE} -f Makefile.libusb all
${MAKE} -f Makefile.confuse all
${MAKE} -f Makefile.libftdi all
${MAKE} -f Makefile.openocd $@
# This target is used to "install" files from
# the FTDICHIP.COM tar.gz unpack directory
# into "a proper place" - where they should be found.
linux.ftd2xx_installed.setup:
mkdir -p ${INSTALL_DIR}/include
mkdir -p ${EXEC_PREFIX}/lib
@#
@# Sanity check - make sure the .H file is findable
@#