Home | History | Annotate | Download | only in ltrace
      1 # -*- Autoconf -*-
      2 # This file is part of ltrace.
      3 # Copyright (C) 2010,2012,2013,2014 Petr Machata, Red Hat Inc.
      4 # Copyright (C) 2010,2011 Joe Damato
      5 # Copyright (C) 2010 Marc Kleine-Budde
      6 # Copyright (C) 2010 Zachary T Welch
      7 #
      8 # This program is free software; you can redistribute it and/or
      9 # modify it under the terms of the GNU General Public License as
     10 # published by the Free Software Foundation; either version 2 of the
     11 # License, or (at your option) any later version.
     12 #
     13 # This program is distributed in the hope that it will be useful, but
     14 # WITHOUT ANY WARRANTY; without even the implied warranty of
     15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     16 # General Public License for more details.
     17 #
     18 # You should have received a copy of the GNU General Public License
     19 # along with this program; if not, write to the Free Software
     20 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     21 # 02110-1301 USA
     22 
     23 # Process this file with autoconf to produce a configure script.
     24 AC_PREREQ([2.65])
     25 
     26 AC_INIT([ltrace],[0.7.91],[ltrace-devel (a] lists.alioth.debian.org],
     27 	[ltrace],[http://ltrace.alioth.debian.org/])
     28 AC_CONFIG_HEADERS([config.h])
     29 AC_CONFIG_SRCDIR(libltrace.c)
     30 AC_CONFIG_MACRO_DIR([config/m4])
     31 AC_CONFIG_AUX_DIR([config/autoconf])
     32 AC_CANONICAL_BUILD
     33 AC_CANONICAL_HOST
     34 
     35 case "${host_os}" in
     36     linux-gnu*) HOST_OS="linux-gnu" ;;
     37     linux-uclibc*) HOST_OS="linux-gnu" ;;
     38     *)		AC_MSG_ERROR([unkown host-os ${host_os}]) ;;
     39 esac
     40 AC_SUBST(HOST_OS)
     41 
     42 case "${host_cpu}" in
     43     arm*|sa110)		HOST_CPU="arm" ;;
     44     cris*)		HOST_CPU="cris" ;;
     45     mips*)		HOST_CPU="mips" ;;
     46     powerpc|powerpc64)	HOST_CPU="ppc" ;;
     47     sun4u|sparc64)	HOST_CPU="sparc" ;;
     48     s390x)		HOST_CPU="s390" ;;
     49     i?86|x86_64)	HOST_CPU="x86" ;;
     50     *)			HOST_CPU="${host_cpu}" ;;
     51 esac
     52 AC_SUBST(HOST_CPU)
     53 
     54 # Checks for programs.
     55 AC_PROG_CC
     56 LT_INIT
     57 # libtool-2:  LT_INIT()
     58 AM_INIT_AUTOMAKE([foreign no-exeext dist-bzip2])
     59 AM_MAINTAINER_MODE
     60 
     61 #
     62 # We use stat(2).  Even though we don't care about the file size or
     63 # inode number, stat will fail with EOVERFLOW if either of these
     64 # exceeds 32 bits.  We therefore ask for stat64 if available.  Do this
     65 # test as soon as possible, as large file support may influence
     66 # whether other headers are available.
     67 #
     68 AC_SYS_LARGEFILE
     69 
     70 AC_ARG_WITH([libelf],
     71   AS_HELP_STRING([--with-libelf], [Prefix of libelf headers/library]),
     72   [case "${withval}" in
     73   (no)
     74     AC_MSG_ERROR([*** libelf is a required dependency])
     75     ;;
     76   (yes)
     77     AC_MSG_ERROR([*** --with-libelf requires you to specify a path])
     78     ;;
     79   (*)
     80     AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
     81     AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
     82     libelf_LD_LIBRARY_PATH="${withval}/lib"
     83     ;;
     84 esac],[])
     85 
     86 # Checks for libraries.
     87 
     88 saved_CPPFLAGS="${CPPFLAGS}"
     89 saved_LDFLAGS="${LDFLAGS}"
     90 CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
     91 LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
     92 # libelf
     93 AC_CHECK_HEADERS([elf.h gelf.h],,
     94 	[AC_MSG_ERROR([*** libelf.h or gelf.h not found on your system])]
     95 )
     96 AC_CHECK_LIB([elf], [elf_begin],,
     97 	[AC_MSG_ERROR([*** libelf not found on your system])]
     98 )
     99 CPPFLAGS="${saved_CPPFLAGS}"
    100 LDFLAGS="${saved_LDFLAGS}"
    101 
    102 
    103 # HAVE_LIBIBERTY
    104 AC_CHECK_LIB([iberty], [cplus_demangle], [
    105 	AC_DEFINE([HAVE_LIBIBERTY], [1], [we have libiberty])
    106 	liberty_LIBS="-liberty"], [
    107 	liberty_LIBS=""])
    108 AC_SUBST(liberty_LIBS)
    109 
    110 
    111 # HAVE_LIBSUPC__
    112 AC_CHECK_LIB([supc++], [__cxa_demangle], [
    113 	AC_DEFINE([HAVE_LIBSUPC__], [1], [we have libsupc++])
    114 	libsupcxx_LIBS="-lsupc++"], [
    115 	libsupcxx_LIBS=""])
    116 AC_SUBST(libsupcxx_LIBS)
    117 
    118 
    119 # HAVE_LIBSTDC__
    120 AC_CHECK_LIB([stdc++], [__cxa_demangle], [
    121 	AC_DEFINE([HAVE_LIBSTDC__], [1], [we have libstdc++])
    122 	libstdcxx_LIBS="-lstdc++"], [
    123 	libstdcxx_LIBS=""])
    124 AC_SUBST(libstdcxx_LIBS)
    125 
    126 
    127 dnl Check security_get_boolean_active availability.
    128 AC_CHECK_HEADERS(selinux/selinux.h)
    129 AC_CHECK_LIB(selinux, security_get_boolean_active)
    130 
    131 dnl Whether (and which) elfutils libdw.so to use for unwinding.
    132 AC_ARG_WITH(elfutils,
    133   AS_HELP_STRING([--with-elfutils], [Use elfutils libdwfl unwinding support]),
    134   [case "${withval}" in
    135   (yes|no) enable_elfutils=$withval;;
    136   (*) enable_elfutils=yes
    137     AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
    138     AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
    139     elfutils_LD_LIBRARY_PATH="${withval}/lib:${withval}/lib/elfutils"
    140     ;;
    141 esac],[enable_elfutils=maybe])
    142 
    143 dnl Check whether we have the elfutils libdwfl.h header installed.
    144 saved_CPPFLAGS="${CPPFLAGS}"
    145 CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
    146 AC_CHECK_HEADERS([elfutils/libdwfl.h],[have_libdwfl_h=yes])
    147 CPPFLAGS="${saved_CPPFLAGS}"
    148 
    149 dnl And whether libdw.so provides the unwinding functions.
    150 saved_LDFLAGS="${LDFLAGS}"
    151 LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
    152 AC_CHECK_LIB([dw], [dwfl_getthread_frames], [have_libdw_dwfl_frames=yes])
    153 LDFLAGS="${saved_LDFLAGS}"
    154 
    155 AC_MSG_CHECKING([whether to use elfutils libdwfl unwinding support])
    156 case "${enable_elfutils}" in
    157 (yes|maybe)
    158   if test x$have_libdwfl_h = xyes -a x$have_libdw_dwfl_frames = xyes; then
    159     enable_elfutils=yes
    160   elif test $enable_elfutils = maybe; then
    161     enable_elfutils=no
    162   else
    163     AC_MSG_RESULT([$enable_elfutils])
    164     AC_MSG_ERROR([Missing elfutils/libdwfl.h or dwfl_getthread_frames not in libdw.so])
    165   fi
    166   ;;
    167 (*) ;;
    168 esac
    169 AC_MSG_RESULT([$enable_elfutils])
    170 
    171 if test x"$enable_elfutils" = xyes; then
    172   libdw_LIBS=-ldw
    173   AC_SUBST(libdw_LIBS)
    174   AC_DEFINE([HAVE_LIBDW], [1], [we have elfutils libdw])
    175 fi
    176 
    177 # HAVE_LIBUNWIND
    178 AC_ARG_WITH(libunwind,
    179   AS_HELP_STRING([--with-libunwind], [Use libunwind frame unwinding support]),
    180   [case "${withval}" in
    181   (yes|no) enable_libunwind=$withval;;
    182   (*) enable_libunwind=yes
    183     AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
    184     AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
    185     libunwind_LD_LIBRARY_PATH="${withval}/lib"
    186     ;;
    187 esac],[enable_libunwind=maybe])
    188 
    189 saved_CPPFLAGS="${CPPFLAGS}"
    190 CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
    191 AC_CHECK_HEADERS([libunwind.h], [have_libunwind_h=yes])
    192 AC_CHECK_HEADERS([libunwind-ptrace.h], [have_libunwind_ptrace_h=yes])
    193 CPPFLAGS="${saved_CPPFLAGS}"
    194 
    195 AC_MSG_CHECKING([whether to use libunwind support])
    196 case "${enable_libunwind}" in
    197 (yes|maybe)
    198   if test x$have_libunwind_h = xyes -o x$have_libunwind_ptrace_h = xyes; then
    199     enable_libunwind=yes
    200   elif test $enable_libunwind = maybe; then
    201     enable_libunwind=no
    202   else
    203     AC_MSG_RESULT([$enable_libunwind])
    204     AC_MSG_ERROR([libunwind.h or libunwind-ptrace.h cannot be found])	
    205   fi
    206   ;;
    207 (*) ;;
    208 esac
    209 AC_MSG_RESULT([$enable_libunwind])
    210 
    211 if test x"$enable_libunwind" = xyes; then
    212   case "${host_cpu}" in
    213       arm*|sa110)         UNWIND_ARCH="arm" ;;
    214       i?86)               UNWIND_ARCH="x86" ;;
    215       powerpc)            UNWIND_ARCH="ppc32" ;;
    216       powerpc64)          UNWIND_ARCH="ppc64" ;;
    217       mips*)              UNWIND_ARCH="mips" ;;
    218       *)                  UNWIND_ARCH="${host_cpu}" ;;
    219   esac
    220 
    221   saved_LDFLAGS="${LDFLAGS}"
    222   LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
    223   AC_CHECK_LIB([unwind], [backtrace], [libunwind_LIBS=-lunwind],
    224 	       [AC_MSG_ERROR([Couldn't find or use libunwind.])])
    225 
    226   AC_CHECK_LIB([unwind-${UNWIND_ARCH}], [_U${UNWIND_ARCH}_init_remote],
    227 	       [libunwind_LIBS="-lunwind-${UNWIND_ARCH} $libunwind_LIBS"],
    228 	       [AC_MSG_ERROR([Couldn't find or use libunwind-${UNWIND_ARCH}.])],
    229 	       [$libunwind_LIBS])
    230 
    231   AC_CHECK_LIB([unwind-ptrace], [_UPT_create],
    232 	       [libunwind_LIBS="-lunwind-ptrace $libunwind_LIBS"],
    233 	       [AC_MSG_ERROR([Couldn't find or use libunwind-ptrace.])],
    234 	       [$libunwind_LIBS])
    235 
    236   AC_SUBST(libunwind_LIBS)
    237   AC_DEFINE([HAVE_LIBUNWIND], [1], [we have libunwind])
    238   LDFLAGS="${saved_LDFLAGS}"
    239 fi
    240 
    241 if test x"$enable_elfutils" = xyes -a x"$enable_libunwind" = xyes; then
    242   AC_MSG_ERROR([Cannot enable both --with-libunwind and --with-elfutils])
    243 fi
    244 
    245 if test x"$enable_elfutils" = xyes -o x"$enable_libunwind" = xyes; then
    246   AC_DEFINE([HAVE_UNWINDER], [1], [we have an unwinder available])
    247 fi
    248 
    249 saved_CPPFLAGS="${CPPFLAGS}"
    250 saved_LDFLAGS="${LDFLAGS}"
    251 CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
    252 LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
    253 # HAVE_ELF_C_READ_MMAP
    254 AC_MSG_CHECKING([whether elf_begin accepts ELF_C_READ_MMAP])
    255 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gelf.h>]], [[
    256 int main () {
    257 	Elf *elf = elf_begin(4, ELF_C_READ_MMAP, 0);
    258 	return 0;
    259 }
    260 	]])],[
    261 	AC_DEFINE([HAVE_ELF_C_READ_MMAP], [1], [we have read mmap support])
    262 	AC_MSG_RESULT([yes])],[
    263 	AC_MSG_RESULT([no])])
    264 
    265 saved_CFLAGS="${CFLAGS}"
    266 CFLAGS="${CFLAGS} -Wall -Werror"
    267 AC_MSG_CHECKING([whether elf_hash takes a char* argument])
    268 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <libelf.h>]], [[
    269 	(void) elf_hash("name");
    270 	]])],
    271 	[AC_DEFINE([ELF_HASH_TAKES_CHARP], [1],
    272 		[elf_hash() takes char* (as opposed to unsigned char *)])
    273 	 AC_MSG_RESULT([yes])],
    274 	[AC_MSG_RESULT([no])])
    275 CFLAGS="${saved_CFLAGS}"
    276 CPPFLAGS="${saved_CPPFLAGS}"
    277 LDFLAGS="${saved_LDFLAGS}"
    278 
    279 AM_CPPFLAGS=" \
    280 	-DSYSCONFDIR="'\"$(sysconfdir)\"'" \
    281 	-DPKGDATADIR="'\"$(pkgdatadir)\"'" \
    282 	${AM_CPPFLAGS} \
    283 	-I\$(top_srcdir)/sysdeps/${HOST_OS}/${HOST_CPU} \
    284 	-I\$(top_srcdir)/sysdeps/${HOST_OS} \
    285 	-I\$(top_srcdir)/sysdeps \
    286 	-I\$(top_srcdir) \
    287 "
    288 
    289 # Checks for header files.
    290 AC_CHECK_HEADERS([ \
    291 	fcntl.h \
    292 	limits.h \
    293 	stddef.h \
    294 	stdint.h \
    295 	stdlib.h \
    296 	string.h \
    297 	sys/ioctl.h \
    298 	sys/param.h \
    299 	sys/time.h \
    300 	unistd.h \
    301 ])
    302 
    303 # Checks for typedefs, structures, and compiler characteristics.
    304 AC_TYPE_UID_T
    305 AC_C_INLINE
    306 AC_TYPE_PID_T
    307 AC_TYPE_SIZE_T
    308 AC_CHECK_SIZEOF([long])
    309 
    310 
    311 # Checks for library functions.
    312 AC_FUNC_FORK
    313 AC_CHECK_FUNCS([ \
    314 	alarm \
    315 	atexit \
    316 	gettimeofday \
    317 	memset \
    318 	strchr \
    319 	strdup \
    320 	strerror \
    321 	strsignal \
    322 	strtol \
    323 	strtoul \
    324 ])
    325 
    326 #
    327 # Define HAVE_OPEN_MEMSTREAM if open_memstream is available.  glibc
    328 # before 2.10, eglibc and uClibc all need _GNU_SOURCE defined for
    329 # open_memstream to become visible, so check for that as well.  If
    330 # unavailable, require that tmpfile be present.  There's no
    331 # HAVE_TMPFILE, as we plain require that to be present as a fallback.
    332 #
    333 AC_CHECK_FUNCS([open_memstream], [],
    334 	[AC_MSG_CHECKING([for open_memstream with _GNU_SOURCE])
    335 	 AC_LINK_IFELSE(
    336 		[AC_LANG_PROGRAM([[#define _GNU_SOURCE 1
    337 				   #include <stdio.h>]],
    338 				 [[char *buf; size_t sz;
    339 				   return open_memstream(&buf, &sz) != 0;]])],
    340 
    341 		 [AC_MSG_RESULT([yes])
    342 		  AC_DEFINE([HAVE_OPEN_MEMSTREAM], [1],
    343 			[Define if open_memstream exists.])],
    344 
    345 		 [AC_MSG_RESULT([no])
    346 		  AC_CHECK_FUNC([tmpfile], [],
    347 			[AC_MSG_ERROR(
    348 			    [Either open_memstream or tmpfile required.])])])])
    349 
    350 #
    351 # Define HAVE_GETOPT_LONG if that is available.
    352 #
    353 AC_CHECK_HEADER([getopt.h], [AC_CHECK_FUNCS([getopt_long])])
    354 
    355 #
    356 # Debugging
    357 #
    358 AC_MSG_CHECKING([whether to enable debugging])
    359 AC_ARG_ENABLE(debug,
    360     AS_HELP_STRING([--enable-debug], [enable debugging @<:@default=no@:>@]),
    361 	[case "$enableval" in
    362 	y | yes) CONFIG_DEBUG=yes ;;
    363         *) CONFIG_DEBUG=no ;;
    364     esac],
    365     [CONFIG_DEBUG=no])
    366 AC_MSG_RESULT([${CONFIG_DEBUG}])
    367 if test "${CONFIG_DEBUG}" = "yes"; then
    368     AC_DEFINE(DEBUG, 1, [debugging])
    369 fi
    370 
    371 # Ignore the compiler's warnings at your own risk.
    372 AM_CFLAGS="${AM_CFLAGS} -Wall -Wsign-compare -Wfloat-equal -Wformat-security"
    373 AC_ARG_ENABLE([werror],
    374     AS_HELP_STRING([--disable-werror], [disable use of -Werror]),
    375     [enable_werror=$enableval], [enable_werror=yes])
    376 if test x$enable_werror = xyes; then
    377     AM_CFLAGS="${AM_CFLAGS} -Werror"
    378 fi
    379 
    380 AC_ARG_ENABLE([valgrind],
    381     AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
    382     [use_valgrind=$enableval], [use_valgrind=no])
    383 if test x$use_valgrind = xyes; then
    384     AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
    385     if test x$HAVE_VALGRIND = xno; then
    386         AC_MSG_ERROR([valgrind not found])
    387     fi
    388 fi
    389 AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
    390 
    391 AC_SUBST(AM_CPPFLAGS)
    392 AC_SUBST(AM_CFLAGS)
    393 AC_SUBST(AM_LDFLAGS)
    394 AC_SUBST(libelf_LD_LIBRARY_PATH)
    395 AC_SUBST(elfutils_LD_LIBRARY_PATH)
    396 AC_SUBST(libunwind_LD_LIBRARY_PATH)
    397 
    398 AC_CONFIG_FILES([
    399 	Makefile
    400 	sysdeps/Makefile
    401 	sysdeps/linux-gnu/Makefile
    402 	sysdeps/linux-gnu/aarch64/Makefile
    403 	sysdeps/linux-gnu/alpha/Makefile
    404 	sysdeps/linux-gnu/arm/Makefile
    405 	sysdeps/linux-gnu/cris/Makefile
    406 	sysdeps/linux-gnu/ia64/Makefile
    407 	sysdeps/linux-gnu/m68k/Makefile
    408 	sysdeps/linux-gnu/metag/Makefile
    409 	sysdeps/linux-gnu/mips/Makefile
    410 	sysdeps/linux-gnu/ppc/Makefile
    411 	sysdeps/linux-gnu/s390/Makefile
    412 	sysdeps/linux-gnu/sparc/Makefile
    413 	sysdeps/linux-gnu/x86/Makefile
    414 	testsuite/Makefile
    415 	testsuite/ltrace.main/Makefile
    416 	testsuite/ltrace.minor/Makefile
    417 	testsuite/ltrace.torture/Makefile
    418 ])
    419 AC_OUTPUT
    420