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