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