419 lines
12 KiB
Text
419 lines
12 KiB
Text
# -*- Autoconf -*-
|
|
# This file is part of ltrace.
|
|
# Copyright (C) 2010,2012,2013,2014 Petr Machata, Red Hat Inc.
|
|
# Copyright (C) 2010,2011 Joe Damato
|
|
# Copyright (C) 2010 Marc Kleine-Budde
|
|
# Copyright (C) 2010 Zachary T Welch
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation; either version 2 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
|
# 02110-1301 USA
|
|
|
|
# Process this file with autoconf to produce a configure script.
|
|
AC_PREREQ([2.65])
|
|
|
|
AC_INIT([ltrace],[0.7.91],[ltrace-devel@lists.alioth.debian.org],
|
|
[ltrace],[http://ltrace.alioth.debian.org/])
|
|
AC_CONFIG_HEADERS([config.h])
|
|
AC_CONFIG_SRCDIR(libltrace.c)
|
|
AC_CONFIG_MACRO_DIR([config/m4])
|
|
AC_CONFIG_AUX_DIR([config/autoconf])
|
|
AC_CANONICAL_BUILD
|
|
AC_CANONICAL_HOST
|
|
|
|
case "${host_os}" in
|
|
linux-gnu*) HOST_OS="linux-gnu" ;;
|
|
linux-uclibc*) HOST_OS="linux-gnu" ;;
|
|
*) AC_MSG_ERROR([unkown host-os ${host_os}]) ;;
|
|
esac
|
|
AC_SUBST(HOST_OS)
|
|
|
|
case "${host_cpu}" in
|
|
arm*|sa110) HOST_CPU="arm" ;;
|
|
cris*) HOST_CPU="cris" ;;
|
|
mips*) HOST_CPU="mips" ;;
|
|
powerpc|powerpc64) HOST_CPU="ppc" ;;
|
|
sun4u|sparc64) HOST_CPU="sparc" ;;
|
|
s390x) HOST_CPU="s390" ;;
|
|
i?86|x86_64) HOST_CPU="x86" ;;
|
|
*) HOST_CPU="${host_cpu}" ;;
|
|
esac
|
|
AC_SUBST(HOST_CPU)
|
|
|
|
# Checks for programs.
|
|
AC_PROG_CC
|
|
LT_INIT
|
|
# libtool-2: LT_INIT()
|
|
AM_INIT_AUTOMAKE([foreign no-exeext dist-bzip2])
|
|
AM_MAINTAINER_MODE
|
|
|
|
#
|
|
# We use stat(2). Even though we don't care about the file size or
|
|
# inode number, stat will fail with EOVERFLOW if either of these
|
|
# exceeds 32 bits. We therefore ask for stat64 if available. Do this
|
|
# test as soon as possible, as large file support may influence
|
|
# whether other headers are available.
|
|
#
|
|
AC_SYS_LARGEFILE
|
|
|
|
AC_ARG_WITH([libelf],
|
|
AS_HELP_STRING([--with-libelf], [Prefix of libelf headers/library]),
|
|
[case "${withval}" in
|
|
(no)
|
|
AC_MSG_ERROR([*** libelf is a required dependency])
|
|
;;
|
|
(yes)
|
|
AC_MSG_ERROR([*** --with-libelf requires you to specify a path])
|
|
;;
|
|
(*)
|
|
AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
|
|
AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
|
|
libelf_LD_LIBRARY_PATH="${withval}/lib"
|
|
;;
|
|
esac],[])
|
|
|
|
# Checks for libraries.
|
|
|
|
saved_CPPFLAGS="${CPPFLAGS}"
|
|
saved_LDFLAGS="${LDFLAGS}"
|
|
CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
|
|
LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
|
|
# libelf
|
|
AC_CHECK_HEADERS([elf.h gelf.h],,
|
|
[AC_MSG_ERROR([*** libelf.h or gelf.h not found on your system])]
|
|
)
|
|
AC_CHECK_LIB([elf], [elf_begin],,
|
|
[AC_MSG_ERROR([*** libelf not found on your system])]
|
|
)
|
|
CPPFLAGS="${saved_CPPFLAGS}"
|
|
LDFLAGS="${saved_LDFLAGS}"
|
|
|
|
|
|
# HAVE_LIBIBERTY
|
|
AC_CHECK_LIB([iberty], [cplus_demangle], [
|
|
AC_DEFINE([HAVE_LIBIBERTY], [1], [we have libiberty])
|
|
liberty_LIBS="-liberty"], [
|
|
liberty_LIBS=""])
|
|
AC_SUBST(liberty_LIBS)
|
|
|
|
|
|
# HAVE_LIBSUPC__
|
|
AC_CHECK_LIB([supc++], [__cxa_demangle], [
|
|
AC_DEFINE([HAVE_LIBSUPC__], [1], [we have libsupc++])
|
|
libsupcxx_LIBS="-lsupc++"], [
|
|
libsupcxx_LIBS=""])
|
|
AC_SUBST(libsupcxx_LIBS)
|
|
|
|
|
|
# HAVE_LIBSTDC__
|
|
AC_CHECK_LIB([stdc++], [__cxa_demangle], [
|
|
AC_DEFINE([HAVE_LIBSTDC__], [1], [we have libstdc++])
|
|
libstdcxx_LIBS="-lstdc++"], [
|
|
libstdcxx_LIBS=""])
|
|
AC_SUBST(libstdcxx_LIBS)
|
|
|
|
|
|
dnl Check security_get_boolean_active availability.
|
|
AC_CHECK_HEADERS(selinux/selinux.h)
|
|
AC_CHECK_LIB(selinux, security_get_boolean_active)
|
|
|
|
dnl Whether (and which) elfutils libdw.so to use for unwinding.
|
|
AC_ARG_WITH(elfutils,
|
|
AS_HELP_STRING([--with-elfutils], [Use elfutils libdwfl unwinding support]),
|
|
[case "${withval}" in
|
|
(yes|no) enable_elfutils=$withval;;
|
|
(*) enable_elfutils=yes
|
|
AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
|
|
AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
|
|
elfutils_LD_LIBRARY_PATH="${withval}/lib:${withval}/lib/elfutils"
|
|
;;
|
|
esac],[enable_elfutils=maybe])
|
|
|
|
dnl Check whether we have the elfutils libdwfl.h header installed.
|
|
saved_CPPFLAGS="${CPPFLAGS}"
|
|
CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
|
|
AC_CHECK_HEADERS([elfutils/libdwfl.h],[have_libdwfl_h=yes])
|
|
CPPFLAGS="${saved_CPPFLAGS}"
|
|
|
|
dnl And whether libdw.so provides the unwinding functions.
|
|
saved_LDFLAGS="${LDFLAGS}"
|
|
LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
|
|
AC_CHECK_LIB([dw], [dwfl_getthread_frames], [have_libdw_dwfl_frames=yes])
|
|
LDFLAGS="${saved_LDFLAGS}"
|
|
|
|
AC_MSG_CHECKING([whether to use elfutils libdwfl unwinding support])
|
|
case "${enable_elfutils}" in
|
|
(yes|maybe)
|
|
if test x$have_libdwfl_h = xyes -a x$have_libdw_dwfl_frames = xyes; then
|
|
enable_elfutils=yes
|
|
elif test $enable_elfutils = maybe; then
|
|
enable_elfutils=no
|
|
else
|
|
AC_MSG_RESULT([$enable_elfutils])
|
|
AC_MSG_ERROR([Missing elfutils/libdwfl.h or dwfl_getthread_frames not in libdw.so])
|
|
fi
|
|
;;
|
|
(*) ;;
|
|
esac
|
|
AC_MSG_RESULT([$enable_elfutils])
|
|
|
|
if test x"$enable_elfutils" = xyes; then
|
|
libdw_LIBS=-ldw
|
|
AC_SUBST(libdw_LIBS)
|
|
AC_DEFINE([HAVE_LIBDW], [1], [we have elfutils libdw])
|
|
fi
|
|
|
|
# HAVE_LIBUNWIND
|
|
AC_ARG_WITH(libunwind,
|
|
AS_HELP_STRING([--with-libunwind], [Use libunwind frame unwinding support]),
|
|
[case "${withval}" in
|
|
(yes|no) enable_libunwind=$withval;;
|
|
(*) enable_libunwind=yes
|
|
AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
|
|
AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
|
|
libunwind_LD_LIBRARY_PATH="${withval}/lib"
|
|
;;
|
|
esac],[enable_libunwind=maybe])
|
|
|
|
saved_CPPFLAGS="${CPPFLAGS}"
|
|
CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
|
|
AC_CHECK_HEADERS([libunwind.h], [have_libunwind_h=yes])
|
|
AC_CHECK_HEADERS([libunwind-ptrace.h], [have_libunwind_ptrace_h=yes])
|
|
CPPFLAGS="${saved_CPPFLAGS}"
|
|
|
|
AC_MSG_CHECKING([whether to use libunwind support])
|
|
case "${enable_libunwind}" in
|
|
(yes|maybe)
|
|
if test x$have_libunwind_h = xyes -o x$have_libunwind_ptrace_h = xyes; then
|
|
enable_libunwind=yes
|
|
elif test $enable_libunwind = maybe; then
|
|
enable_libunwind=no
|
|
else
|
|
AC_MSG_RESULT([$enable_libunwind])
|
|
AC_MSG_ERROR([libunwind.h or libunwind-ptrace.h cannot be found])
|
|
fi
|
|
;;
|
|
(*) ;;
|
|
esac
|
|
AC_MSG_RESULT([$enable_libunwind])
|
|
|
|
if test x"$enable_libunwind" = xyes; then
|
|
case "${host_cpu}" in
|
|
arm*|sa110) UNWIND_ARCH="arm" ;;
|
|
i?86) UNWIND_ARCH="x86" ;;
|
|
powerpc) UNWIND_ARCH="ppc32" ;;
|
|
powerpc64) UNWIND_ARCH="ppc64" ;;
|
|
mips*) UNWIND_ARCH="mips" ;;
|
|
*) UNWIND_ARCH="${host_cpu}" ;;
|
|
esac
|
|
|
|
saved_LDFLAGS="${LDFLAGS}"
|
|
LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
|
|
AC_CHECK_LIB([unwind], [backtrace], [libunwind_LIBS=-lunwind],
|
|
[AC_MSG_ERROR([Couldn't find or use libunwind.])])
|
|
|
|
AC_CHECK_LIB([unwind-${UNWIND_ARCH}], [_U${UNWIND_ARCH}_init_remote],
|
|
[libunwind_LIBS="-lunwind-${UNWIND_ARCH} $libunwind_LIBS"],
|
|
[AC_MSG_ERROR([Couldn't find or use libunwind-${UNWIND_ARCH}.])],
|
|
[$libunwind_LIBS])
|
|
|
|
AC_CHECK_LIB([unwind-ptrace], [_UPT_create],
|
|
[libunwind_LIBS="-lunwind-ptrace $libunwind_LIBS"],
|
|
[AC_MSG_ERROR([Couldn't find or use libunwind-ptrace.])],
|
|
[$libunwind_LIBS])
|
|
|
|
AC_SUBST(libunwind_LIBS)
|
|
AC_DEFINE([HAVE_LIBUNWIND], [1], [we have libunwind])
|
|
LDFLAGS="${saved_LDFLAGS}"
|
|
fi
|
|
|
|
if test x"$enable_elfutils" = xyes -a x"$enable_libunwind" = xyes; then
|
|
AC_MSG_ERROR([Cannot enable both --with-libunwind and --with-elfutils])
|
|
fi
|
|
|
|
if test x"$enable_elfutils" = xyes -o x"$enable_libunwind" = xyes; then
|
|
AC_DEFINE([HAVE_UNWINDER], [1], [we have an unwinder available])
|
|
fi
|
|
|
|
saved_CPPFLAGS="${CPPFLAGS}"
|
|
saved_LDFLAGS="${LDFLAGS}"
|
|
CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
|
|
LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
|
|
# HAVE_ELF_C_READ_MMAP
|
|
AC_MSG_CHECKING([whether elf_begin accepts ELF_C_READ_MMAP])
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gelf.h>]], [[
|
|
int main () {
|
|
Elf *elf = elf_begin(4, ELF_C_READ_MMAP, 0);
|
|
return 0;
|
|
}
|
|
]])],[
|
|
AC_DEFINE([HAVE_ELF_C_READ_MMAP], [1], [we have read mmap support])
|
|
AC_MSG_RESULT([yes])],[
|
|
AC_MSG_RESULT([no])])
|
|
|
|
saved_CFLAGS="${CFLAGS}"
|
|
CFLAGS="${CFLAGS} -Wall -Werror"
|
|
AC_MSG_CHECKING([whether elf_hash takes a char* argument])
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <libelf.h>]], [[
|
|
(void) elf_hash("name");
|
|
]])],
|
|
[AC_DEFINE([ELF_HASH_TAKES_CHARP], [1],
|
|
[elf_hash() takes char* (as opposed to unsigned char *)])
|
|
AC_MSG_RESULT([yes])],
|
|
[AC_MSG_RESULT([no])])
|
|
CFLAGS="${saved_CFLAGS}"
|
|
CPPFLAGS="${saved_CPPFLAGS}"
|
|
LDFLAGS="${saved_LDFLAGS}"
|
|
|
|
AM_CPPFLAGS=" \
|
|
-DSYSCONFDIR="'\"$(sysconfdir)\"'" \
|
|
-DPKGDATADIR="'\"$(pkgdatadir)\"'" \
|
|
${AM_CPPFLAGS} \
|
|
-I\$(top_srcdir)/sysdeps/${HOST_OS}/${HOST_CPU} \
|
|
-I\$(top_srcdir)/sysdeps/${HOST_OS} \
|
|
-I\$(top_srcdir)/sysdeps \
|
|
-I\$(top_srcdir) \
|
|
"
|
|
|
|
# Checks for header files.
|
|
AC_CHECK_HEADERS([ \
|
|
fcntl.h \
|
|
limits.h \
|
|
stddef.h \
|
|
stdint.h \
|
|
stdlib.h \
|
|
string.h \
|
|
sys/ioctl.h \
|
|
sys/param.h \
|
|
sys/time.h \
|
|
unistd.h \
|
|
])
|
|
|
|
# Checks for typedefs, structures, and compiler characteristics.
|
|
AC_TYPE_UID_T
|
|
AC_C_INLINE
|
|
AC_TYPE_PID_T
|
|
AC_TYPE_SIZE_T
|
|
AC_CHECK_SIZEOF([long])
|
|
|
|
|
|
# Checks for library functions.
|
|
AC_FUNC_FORK
|
|
AC_CHECK_FUNCS([ \
|
|
alarm \
|
|
atexit \
|
|
gettimeofday \
|
|
memset \
|
|
strchr \
|
|
strdup \
|
|
strerror \
|
|
strsignal \
|
|
strtol \
|
|
strtoul \
|
|
])
|
|
|
|
#
|
|
# Define HAVE_OPEN_MEMSTREAM if open_memstream is available. glibc
|
|
# before 2.10, eglibc and uClibc all need _GNU_SOURCE defined for
|
|
# open_memstream to become visible, so check for that as well. If
|
|
# unavailable, require that tmpfile be present. There's no
|
|
# HAVE_TMPFILE, as we plain require that to be present as a fallback.
|
|
#
|
|
AC_CHECK_FUNCS([open_memstream], [],
|
|
[AC_MSG_CHECKING([for open_memstream with _GNU_SOURCE])
|
|
AC_LINK_IFELSE(
|
|
[AC_LANG_PROGRAM([[#define _GNU_SOURCE 1
|
|
#include <stdio.h>]],
|
|
[[char *buf; size_t sz;
|
|
return open_memstream(&buf, &sz) != 0;]])],
|
|
|
|
[AC_MSG_RESULT([yes])
|
|
AC_DEFINE([HAVE_OPEN_MEMSTREAM], [1],
|
|
[Define if open_memstream exists.])],
|
|
|
|
[AC_MSG_RESULT([no])
|
|
AC_CHECK_FUNC([tmpfile], [],
|
|
[AC_MSG_ERROR(
|
|
[Either open_memstream or tmpfile required.])])])])
|
|
|
|
#
|
|
# Define HAVE_GETOPT_LONG if that is available.
|
|
#
|
|
AC_CHECK_HEADER([getopt.h], [AC_CHECK_FUNCS([getopt_long])])
|
|
|
|
#
|
|
# Debugging
|
|
#
|
|
AC_MSG_CHECKING([whether to enable debugging])
|
|
AC_ARG_ENABLE(debug,
|
|
AS_HELP_STRING([--enable-debug], [enable debugging @<:@default=no@:>@]),
|
|
[case "$enableval" in
|
|
y | yes) CONFIG_DEBUG=yes ;;
|
|
*) CONFIG_DEBUG=no ;;
|
|
esac],
|
|
[CONFIG_DEBUG=no])
|
|
AC_MSG_RESULT([${CONFIG_DEBUG}])
|
|
if test "${CONFIG_DEBUG}" = "yes"; then
|
|
AC_DEFINE(DEBUG, 1, [debugging])
|
|
fi
|
|
|
|
# Ignore the compiler's warnings at your own risk.
|
|
AM_CFLAGS="${AM_CFLAGS} -Wall -Wsign-compare -Wfloat-equal -Wformat-security"
|
|
AC_ARG_ENABLE([werror],
|
|
AS_HELP_STRING([--disable-werror], [disable use of -Werror]),
|
|
[enable_werror=$enableval], [enable_werror=yes])
|
|
if test x$enable_werror = xyes; then
|
|
AM_CFLAGS="${AM_CFLAGS} -Werror"
|
|
fi
|
|
|
|
AC_ARG_ENABLE([valgrind],
|
|
AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
|
|
[use_valgrind=$enableval], [use_valgrind=no])
|
|
if test x$use_valgrind = xyes; then
|
|
AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
|
|
if test x$HAVE_VALGRIND = xno; then
|
|
AC_MSG_ERROR([valgrind not found])
|
|
fi
|
|
fi
|
|
AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
|
|
|
|
AC_SUBST(AM_CPPFLAGS)
|
|
AC_SUBST(AM_CFLAGS)
|
|
AC_SUBST(AM_LDFLAGS)
|
|
AC_SUBST(libelf_LD_LIBRARY_PATH)
|
|
AC_SUBST(elfutils_LD_LIBRARY_PATH)
|
|
AC_SUBST(libunwind_LD_LIBRARY_PATH)
|
|
|
|
AC_CONFIG_FILES([
|
|
Makefile
|
|
sysdeps/Makefile
|
|
sysdeps/linux-gnu/Makefile
|
|
sysdeps/linux-gnu/aarch64/Makefile
|
|
sysdeps/linux-gnu/alpha/Makefile
|
|
sysdeps/linux-gnu/arm/Makefile
|
|
sysdeps/linux-gnu/cris/Makefile
|
|
sysdeps/linux-gnu/ia64/Makefile
|
|
sysdeps/linux-gnu/m68k/Makefile
|
|
sysdeps/linux-gnu/metag/Makefile
|
|
sysdeps/linux-gnu/mips/Makefile
|
|
sysdeps/linux-gnu/ppc/Makefile
|
|
sysdeps/linux-gnu/s390/Makefile
|
|
sysdeps/linux-gnu/sparc/Makefile
|
|
sysdeps/linux-gnu/x86/Makefile
|
|
testsuite/Makefile
|
|
testsuite/ltrace.main/Makefile
|
|
testsuite/ltrace.minor/Makefile
|
|
testsuite/ltrace.torture/Makefile
|
|
])
|
|
AC_OUTPUT
|