configure.in   [plain text]


# Process this file with autoconf to produce a configure script.
# You may need to use autoconf 2.56 or newer

# $Id: configure.in 4347 2009-07-28 20:52:50Z rousseau $

# Require autoconf 2.61
AC_PREREQ(2.61)

AC_INIT(ccid, 1.3.11)
AC_CONFIG_SRCDIR(src/ifdhandler.c)
AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE(1.8 dist-bzip2 no-dist-gzip)

# Default install dir
AC_PREFIX_DEFAULT(/usr/local)

# Automake boilerplate.
AC_CANONICAL_HOST

# create a config.h file (Automake will add -DHAVE_CONFIG_H)
AM_CONFIG_HEADER(config.h)

# Options
AM_MAINTAINER_MODE

# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_LN_S
AM_PROG_LEX
PKG_PROG_PKG_CONFIG

# check pcsc-lite version
PCSC_NEEDED_VERSION="1.3.3"
PKG_CHECK_EXISTS([libpcsclite],
	[PKG_CHECK_MODULES(PCSC, libpcsclite >= $PCSC_NEEDED_VERSION, [],
	[
	if test -f /usr/local/lib/pkgconfig/libpcsclite.pc -a "x$PKG_CONFIG" != x ; then
		AC_MSG_ERROR([use PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure])
	  else
		AC_MSG_WARN([install pcsc-lite $PCSC_NEEDED_VERSION or later])
	  fi
	])],
	[AC_MSG_WARN([libpcsclite not found by pkg-config])]
)

saved_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $PCSC_CFLAGS"
AC_CHECK_HEADER(ifdhandler.h,,
	[AC_MSG_ERROR([ifdhandler.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=...])])
AC_CHECK_DECL(IFD_NO_SUCH_DEVICE,, [AC_MSG_ERROR([install pcsc-lite $PCSC_NEEDED_VERSION or later])], [#include <ifdhandler.h>])
AC_CHECK_DECLS(TAG_IFD_POLLING_THREAD,,, [#include <ifdhandler.h>])
AC_CHECK_HEADER(reader.h,,
	[AC_MSG_ERROR([reader.h not found, install pcsc-lite $PCSC_NEEDED_VERSION or later, or use ./configure PCSC_CFLAGS=...])])
CPPFLAGS="$saved_CPPFLAGS"

# Add libtool support.
AM_PROG_LIBTOOL

# Automatically update the libtool script if it becomes out-of-date.
AC_SUBST(LIBTOOL_DEPS)

# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(errno.h fcntl.h stdlib.h unistd.h termios.h string.h errno.h sys/time.h sys/types.h stdarg.h arpa/inet.h,,
	[AC_MSG_ERROR([some header files not found])])

# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_SIZE_T
AC_HEADER_TIME

# Checks for library functions.
AC_CHECK_FUNCS(select strerror strncpy memcpy strlcpy strlcat)

# Select OS specific versions of source files.
AC_SUBST(BUNDLE_HOST)
AC_SUBST(DYN_LIB_EXT)
case "$host" in
*-*-darwin*)
	BUNDLE_HOST="MacOS"
	DYN_LIB_EXT="dylib"
	;;
*-*-freebsd*)
	BUNDLE_HOST="FreeBSD"
	DYN_LIB_EXT="so"
	;;
*-*-openbsd*)
	BUNDLE_HOST="OpenBSD"
	DYN_LIB_EXT="so.0.0"
	;;
*-*-solaris*)
	BUNDLE_HOST="Solaris"
	DYN_LIB_EXT="so"
	;;
*-*-dragonfly*)
	BUNDLE_HOST="DragonFly"
	DYN_LIB_EXT="so"
	;;
*)
	BUNDLE_HOST="Linux"
	DYN_LIB_EXT="so"
esac

# --disable-libusb
AC_ARG_ENABLE(libusb,
	AC_HELP_STRING([--disable-libusb],[do not use libusb]),
	[ use_libusb="${enableval}" ], [ use_libusb=yes ] )

use_usb_interrupt=no

# check if libusb is used
if test "x$use_libusb" != xno ; then
	PKG_CHECK_EXISTS([libusb], [
	PKG_CHECK_MODULES(LIBUSB, libusb, [],
		[
			AC_CHECK_PROG([LIBUSBCONFIG], [libusb-config], [yes])

			if test "$LIBUSBCONFIG" = "yes" ; then
				LIBUSB_CFLAGS="$LIBUSB_CFLAGS `libusb-config --cflags`"
				LIBUSB_LIBS="$LIBUSB_LIBS `libusb-config --libs`"
			else
				AC_MSG_WARN([libusb-config not found.])
			fi
		])
	])

	saved_CPPFLAGS="$CPPFLAGS"
	saved_LIBS="$LIBS"

	CPPFLAGS="$CPPFLAGS $LIBUSB_CFLAGS"
	LIBS="$LDFLAGS $LIBUSB_LIBS"

	AC_CHECK_HEADERS(usb.h, [],
		[ AC_MSG_ERROR([usb.h not found, install libusb or use ./configure LIBUSB_CFLAGS=...]) ])

	AC_MSG_CHECKING([for usb_init])
	AC_TRY_LINK_FUNC(usb_init, [ AC_MSG_RESULT([yes]) ],
		[ AC_MSG_ERROR([libusb not found, use ./configure LIBUSB_LIBS=...]) ])

	AC_MSG_CHECKING([for usb_interrupt_read])
	AC_TRY_LINK_FUNC(usb_interrupt_read, [ AC_MSG_RESULT([yes]) ],
		[ AC_MSG_ERROR([your libusb is too old. install version 0.1.12 or above]) ])

	AC_CHECK_FUNC(usb_detach_kernel_driver_np,
		[ AC_DEFINE(HAVE_USB_DETACH_KERNEL_DRIVER_NP, 1, [Define if usb_detach_kernel_driver_np() is available]) ])

	CPPFLAGS="$saved_CPPFLAGS"
	LIBS="$saved_LIBS"

	use_libusb=yes

	AC_MSG_CHECKING([if libusb is emulated by libusb-compat])
	a=`$PKG_CONFIG --variable=emulated libusb`
	if test "x$a" = "x1";
	then
		AC_MSG_RESULT([yes])
		use_usb_interrupt=yes
	else
		AC_MSG_RESULT([no])
	fi

fi
AC_SUBST(LIBUSB_CFLAGS)
AC_SUBST(LIBUSB_LIBS)
AM_CONDITIONAL(WITH_LIBUSB, test "${use_libusb}" != "no")

# --enable-usb-interrupt
AC_ARG_ENABLE(usb-interrupt,
	AC_HELP_STRING([--enable-usb-interrupt], [force the use of USB
	interrupt even with an old libusb]),
	[ use_usb_interrupt="${enableval}" ] )

if test "x$use_usb_interrupt" = xyes; then
	AC_DEFINE(USE_USB_INTERRUPT, 1, [use libusb usb_interrupt_read()
	instead of polling])
fi

# --enable-composite-as-multislot
use_composite_as_multislot=no
AC_ARG_ENABLE(composite-as-multislot,
	AC_HELP_STRING([--enable-composite-as-multislot],
		[composite device are seen as multi-slots]),
	[ use_composite_as_multislot="${enableval}" ] )

if test "x$use_composite_as_multislot" = xyes; then
	AC_DEFINE(USE_COMPOSITE_AS_MULTISLOT, 1, [composite device are seen as multi-slots])
fi

# check if the compiler support -fvisibility=hidden (GCC >= 4)
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fvisibility=hidden"
AC_MSG_CHECKING([for -fvisibility=hidden])
AC_COMPILE_IFELSE([char foo;],
    [   AC_MSG_RESULT([yes])
        SYMBOL_VISIBILITY="-fvisibility=hidden" ],
    AC_MSG_RESULT([no]))
CFLAGS="$saved_CFLAGS"
AC_SUBST(SYMBOL_VISIBILITY)

# --disable-multi-thread
AC_ARG_ENABLE(multi-thread,
	AC_HELP_STRING([--disable-multi-thread],[disable multi threading]),
	[ multithread="${enableval}" ], [ multithread=yes ] )

if test "${multithread}" != no ; then
	ACX_PTHREAD(
		[ AC_DEFINE(HAVE_PTHREAD, 1,
			[Define if you have POSIX threads libraries and header files.])
	   	], [ AC_MSG_ERROR([POSIX thread support required]) ])

	multithread=yes
fi

# --enable-bundle=NAME
AC_ARG_ENABLE(bundle,
	AC_HELP_STRING([--enable-bundle=NAME],[bundle directory name
	(default ifd-ccid.bundle)]),
	[bundle="${enableval}"], [bundle=false])
if test "${bundle}" = false ; then
	bundle="ifd-ccid.bundle"
fi
AC_DEFINE_UNQUOTED(BUNDLE, "$bundle", [bundle directory name])

# --enable-usbdropdir=DIR
AC_ARG_ENABLE(usbdropdir,
	AC_HELP_STRING([--enable-usbdropdir=DIR],[directory containing USB
	drivers (default to pcscd config or $(prefix)/pcsc/drivers)]),
	[usbdropdir="${enableval}"], [usbdropdir=false])
if test "${usbdropdir}" = false ; then
	usbdropdir=`$PKG_CONFIG libpcsclite --variable=usbdropdir`
fi
AC_DEFINE_UNQUOTED(PCSCLITE_HP_DROPDIR, "$usbdropdir", [directory containing USB drivers])
if test "${usbdropdir}" = "" ; then
	AC_MSG_ERROR([use --enable-usbdropdir=DIR])
fi

# --enable-twinserial
AC_ARG_ENABLE(twinserial,
	AC_HELP_STRING([--enable-twinserial],[also compile and install the serial Twin driver]),
	[twinserial="${enableval}"], [twinserial=no])
AM_CONDITIONAL(WITH_TWIN_SERIAL, test "${twinserial}" != "no")

# --enable-ccidtwindir=DIR
AC_ARG_ENABLE(ccidtwindir,
	AC_HELP_STRING([--enable-ccidtwindir=DIR],[directory to install the
	serial Twin driver (default to pcscd config or $(prefix)/pcsc/drivers/serial)]),
	[ccidtwindir="${enableval}"], [ccidtwindir=false])
if test "${ccidtwindir}" = false ; then
	ccidtwindir=`$PKG_CONFIG libpcsclite --variable=usbdropdir`/serial
fi

# --disable-pcsclite
AC_ARG_ENABLE(pcsclite,
	AC_HELP_STRING([--disable-pcsclite],[do not use pcsc-lite debug support]),
	[ pcsclite="${enableval}" ], [ pcsclite=yes ] )

if test "${pcsclite}" != no ; then
	# check that pcsc-lite is installed
	OLD_LIBS="$LIBS"
	OLD_CFLAGS="$CFLAGS"
	LIBS="$LIBS $PCSC_LIBS"
	CFLAGS="$CFLAGS $PCSC_CFLAGS"
	AC_MSG_CHECKING([for SCardEstablishContext])
	AC_TRY_LINK_FUNC(SCardEstablishContext,
	    [ AC_MSG_RESULT([yes]) ],
		[ AC_MSG_ERROR([SCardEstablishContext() not found, install pcsc-lite 1.2.9-beta9 or later,or use PCSC_LIBS=...  ./configure]) ])
	LIBS="$OLD_LIBS"
	CFLAGS="$OLD_CFLAGS"

	pcsclite=yes
fi
AM_CONDITIONAL(WITHOUT_PCSC, test "${pcsclite}" != "yes")

# --enable-udev
AC_ARG_ENABLE(udev,
	AC_HELP_STRING([--enable-udev],[udev support for pcscd hotplug]),
	[udev="${enableval}"], [udev=no])
AM_CONDITIONAL(UDEV, test "${udev}" != "no")

# --disable-class
AC_ARG_ENABLE(class,
	AC_HELP_STRING([--disable-class],[remove the CCIDCLASSDRIVER from Info.plist]),
	[class="${enableval}"], [class=yes])
if test "${class}" != yes ; then
	NOCLASS="--no-class"
fi
AC_SUBST(NOCLASS)


# Setup dist stuff
AC_SUBST(ac_aux_dir)
AC_SUBST(bundle)
AC_SUBST(usbdropdir)
AC_SUBST(ccidtwindir)

cat << EOF

libccid has been configured with following options:

Version:             ${PACKAGE_VERSION}
User binaries:       $(eval eval eval echo "${bindir}")
Configuration files: $(eval eval eval echo "${sysconfdir}")


Host:                ${host}
Compiler:            ${CC}
Preprocessor flags:  ${CPPFLAGS}
Compiler flags:      ${CFLAGS}
Preprocessor flags:  ${CPPFLAGS}
Linker flags:        ${LDFLAGS}
Libraries:           ${LIBS}

PCSC_CFLAGS:         ${PCSC_CFLAGS}
PCSC_LIBS:           ${PCSC_LIBS}
PTHREAD_CFLAGS:      ${PTHREAD_CFLAGS}
PTHREAD_LIBS:        ${PTHREAD_LIBS}
BUNDLE_HOST:         ${BUNDLE_HOST}
DYN_LIB_EXT:         ${DYN_LIB_EXT}
LIBUSB_CFLAGS:       ${LIBUSB_CFLAGS}
LIBUSB_LIBS:         ${LIBUSB_LIBS}
SYMBOL_VISIBILITY:   ${SYMBOL_VISIBILITY}
NOCLASS:             ${NOCLASS}

libusb support:          ${use_libusb}
use USB interrupt:       ${use_usb_interrupt}
composite as multislot:  ${use_composite_as_multislot}
multi threading:         ${multithread}
bundle directory name:   ${bundle}
USB drop directory:      ${usbdropdir}
serial Twin support:     ${twinserial}
serial twin install dir: ${ccidtwindir}
compiled for pcsc-lite:  ${pcsclite}
udev support:            ${udev}
class driver:            ${class}

EOF

# Write Makefiles.
AC_CONFIG_FILES(Makefile
	m4/Makefile
	src/Makefile
	readers/Makefile
	contrib/Makefile
	contrib/Kobil_mIDentity_switch/Makefile
	contrib/RSA_SecurID/Makefile
	examples/Makefile)

AC_OUTPUT