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. 24AC_PREREQ([2.65]) 25 26AC_INIT([ltrace],[0.7.91],[ltrace-devel@lists.alioth.debian.org], 27 [ltrace],[http://ltrace.alioth.debian.org/]) 28AC_CONFIG_HEADERS([config.h]) 29AC_CONFIG_SRCDIR(libltrace.c) 30AC_CONFIG_MACRO_DIR([config/m4]) 31AC_CONFIG_AUX_DIR([config/autoconf]) 32AC_CANONICAL_BUILD 33AC_CANONICAL_HOST 34 35case "${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}]) ;; 39esac 40AC_SUBST(HOST_OS) 41 42case "${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}" ;; 51esac 52AC_SUBST(HOST_CPU) 53 54# Checks for programs. 55AC_PROG_CC 56LT_INIT 57# libtool-2: LT_INIT() 58AM_INIT_AUTOMAKE([foreign no-exeext dist-bzip2]) 59AM_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# 68AC_SYS_LARGEFILE 69 70AC_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 ;; 84esac],[]) 85 86# Checks for libraries. 87 88saved_CPPFLAGS="${CPPFLAGS}" 89saved_LDFLAGS="${LDFLAGS}" 90CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}" 91LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}" 92# libelf 93AC_CHECK_HEADERS([elf.h gelf.h],, 94 [AC_MSG_ERROR([*** libelf.h or gelf.h not found on your system])] 95) 96AC_CHECK_LIB([elf], [elf_begin],, 97 [AC_MSG_ERROR([*** libelf not found on your system])] 98) 99CPPFLAGS="${saved_CPPFLAGS}" 100LDFLAGS="${saved_LDFLAGS}" 101 102 103# HAVE_LIBIBERTY 104AC_CHECK_LIB([iberty], [cplus_demangle], [ 105 AC_DEFINE([HAVE_LIBIBERTY], [1], [we have libiberty]) 106 liberty_LIBS="-liberty"], [ 107 liberty_LIBS=""]) 108AC_SUBST(liberty_LIBS) 109 110 111# HAVE_LIBSUPC__ 112AC_CHECK_LIB([supc++], [__cxa_demangle], [ 113 AC_DEFINE([HAVE_LIBSUPC__], [1], [we have libsupc++]) 114 libsupcxx_LIBS="-lsupc++"], [ 115 libsupcxx_LIBS=""]) 116AC_SUBST(libsupcxx_LIBS) 117 118 119# HAVE_LIBSTDC__ 120AC_CHECK_LIB([stdc++], [__cxa_demangle], [ 121 AC_DEFINE([HAVE_LIBSTDC__], [1], [we have libstdc++]) 122 libstdcxx_LIBS="-lstdc++"], [ 123 libstdcxx_LIBS=""]) 124AC_SUBST(libstdcxx_LIBS) 125 126 127dnl Check security_get_boolean_active availability. 128AC_CHECK_HEADERS(selinux/selinux.h) 129AC_CHECK_LIB(selinux, security_get_boolean_active) 130 131dnl Whether (and which) elfutils libdw.so to use for unwinding. 132AC_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 ;; 141esac],[enable_elfutils=maybe]) 142 143dnl Check whether we have the elfutils libdwfl.h header installed. 144saved_CPPFLAGS="${CPPFLAGS}" 145CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}" 146AC_CHECK_HEADERS([elfutils/libdwfl.h],[have_libdwfl_h=yes]) 147CPPFLAGS="${saved_CPPFLAGS}" 148 149dnl And whether libdw.so provides the unwinding functions. 150saved_LDFLAGS="${LDFLAGS}" 151LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}" 152AC_CHECK_LIB([dw], [dwfl_getthread_frames], [have_libdw_dwfl_frames=yes]) 153LDFLAGS="${saved_LDFLAGS}" 154 155AC_MSG_CHECKING([whether to use elfutils libdwfl unwinding support]) 156case "${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(*) ;; 168esac 169AC_MSG_RESULT([$enable_elfutils]) 170 171if 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]) 175fi 176 177# HAVE_LIBUNWIND 178AC_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 ;; 187esac],[enable_libunwind=maybe]) 188 189saved_CPPFLAGS="${CPPFLAGS}" 190CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}" 191AC_CHECK_HEADERS([libunwind.h], [have_libunwind_h=yes]) 192AC_CHECK_HEADERS([libunwind-ptrace.h], [have_libunwind_ptrace_h=yes]) 193CPPFLAGS="${saved_CPPFLAGS}" 194 195AC_MSG_CHECKING([whether to use libunwind support]) 196case "${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(*) ;; 208esac 209AC_MSG_RESULT([$enable_libunwind]) 210 211if 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}" 239fi 240 241if test x"$enable_elfutils" = xyes -a x"$enable_libunwind" = xyes; then 242 AC_MSG_ERROR([Cannot enable both --with-libunwind and --with-elfutils]) 243fi 244 245if test x"$enable_elfutils" = xyes -o x"$enable_libunwind" = xyes; then 246 AC_DEFINE([HAVE_UNWINDER], [1], [we have an unwinder available]) 247fi 248 249saved_CPPFLAGS="${CPPFLAGS}" 250saved_LDFLAGS="${LDFLAGS}" 251CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}" 252LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}" 253# HAVE_ELF_C_READ_MMAP 254AC_MSG_CHECKING([whether elf_begin accepts ELF_C_READ_MMAP]) 255AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gelf.h>]], [[ 256int 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 265saved_CFLAGS="${CFLAGS}" 266CFLAGS="${CFLAGS} -Wall -Werror" 267AC_MSG_CHECKING([whether elf_hash takes a char* argument]) 268AC_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])]) 275CFLAGS="${saved_CFLAGS}" 276CPPFLAGS="${saved_CPPFLAGS}" 277LDFLAGS="${saved_LDFLAGS}" 278 279AM_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. 290AC_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. 304AC_TYPE_UID_T 305AC_C_INLINE 306AC_TYPE_PID_T 307AC_TYPE_SIZE_T 308AC_CHECK_SIZEOF([long]) 309 310 311# Checks for library functions. 312AC_FUNC_FORK 313AC_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# 333AC_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# 353AC_CHECK_HEADER([getopt.h], [AC_CHECK_FUNCS([getopt_long])]) 354 355# 356# Debugging 357# 358AC_MSG_CHECKING([whether to enable debugging]) 359AC_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]) 366AC_MSG_RESULT([${CONFIG_DEBUG}]) 367if test "${CONFIG_DEBUG}" = "yes"; then 368 AC_DEFINE(DEBUG, 1, [debugging]) 369fi 370 371# Ignore the compiler's warnings at your own risk. 372AM_CFLAGS="${AM_CFLAGS} -Wall -Wsign-compare -Wfloat-equal -Wformat-security" 373AC_ARG_ENABLE([werror], 374 AS_HELP_STRING([--disable-werror], [disable use of -Werror]), 375 [enable_werror=$enableval], [enable_werror=yes]) 376if test x$enable_werror = xyes; then 377 AM_CFLAGS="${AM_CFLAGS} -Werror" 378fi 379 380AC_ARG_ENABLE([valgrind], 381 AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]), 382 [use_valgrind=$enableval], [use_valgrind=no]) 383if 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 388fi 389AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes) 390 391AC_SUBST(AM_CPPFLAGS) 392AC_SUBST(AM_CFLAGS) 393AC_SUBST(AM_LDFLAGS) 394AC_SUBST(libelf_LD_LIBRARY_PATH) 395AC_SUBST(elfutils_LD_LIBRARY_PATH) 396AC_SUBST(libunwind_LD_LIBRARY_PATH) 397 398AC_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]) 419AC_OUTPUT 420