configure.ac revision 7e6f2b3bd1c606c731a102f5417ff0caaf393f42
1# -*- Autoconf -*-
2# This file is part of ltrace.
3# Copyright (C) 2010,2012,2013 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.90-git],[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
131
132# HAVE_LIBUNWIND
133AC_ARG_WITH(libunwind,
134  AS_HELP_STRING([--with-libunwind], [Use libunwind frame unwinding support]),
135  [case "${withval}" in
136  (yes|no) enable_libunwind=$withval;;
137  (*) enable_libunwind=yes
138    AM_CPPFLAGS="${AM_CPPFLAGS} -I${withval}/include"
139    AM_LDFLAGS="${AM_LDFLAGS} -L${withval}/lib"
140    libunwind_LD_LIBRARY_PATH="${withval}/lib"
141    ;;
142esac],[enable_libunwind=maybe])
143
144saved_CPPFLAGS="${CPPFLAGS}"
145CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
146AC_CHECK_HEADERS([libunwind.h], [have_libunwind_h=yes])
147AC_CHECK_HEADERS([libunwind-ptrace.h], [have_libunwind_ptrace_h=yes])
148CPPFLAGS="${saved_CPPFLAGS}"
149
150AC_MSG_CHECKING([whether to use libunwind support])
151case "${enable_libunwind}" in
152(yes|maybe)
153  if test x$have_libunwind_h = xyes -o x$have_libunwind_ptrace_h = xyes; then
154    enable_libunwind=yes
155  elif test $enable_libunwind = maybe; then
156    enable_libunwind=no
157  else
158    AC_MSG_RESULT([$enable_libunwind])
159    AC_MSG_ERROR([libunwind.h or libunwind-ptrace.h cannot be found])	
160  fi
161  ;;
162(*) ;;
163esac
164AC_MSG_RESULT([$enable_libunwind])
165
166if test x"$enable_libunwind" = xyes; then
167  case "${host_cpu}" in
168      arm*|sa110)         UNWIND_ARCH="arm" ;;
169      i?86)               UNWIND_ARCH="x86" ;;
170      powerpc)            UNWIND_ARCH="ppc32" ;;
171      powerpc64)          UNWIND_ARCH="ppc64" ;;
172      mips*)              UNWIND_ARCH="mips" ;;
173      *)                  UNWIND_ARCH="${host_cpu}" ;;
174  esac
175
176  saved_LDFLAGS="${LDFLAGS}"
177  LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
178  AC_CHECK_LIB([unwind], [backtrace], [libunwind_LIBS=-lunwind],
179	       [AC_MSG_ERROR([Couldn't find or use libunwind.])])
180
181  AC_CHECK_LIB([unwind-${UNWIND_ARCH}], [_U${UNWIND_ARCH}_init_remote],
182	       [libunwind_LIBS="-lunwind-${UNWIND_ARCH} $libunwind_LIBS"],
183	       [AC_MSG_ERROR([Couldn't find or use libunwind-${UNWIND_ARCH}.])],
184	       [$libunwind_LIBS])
185
186  AC_CHECK_LIB([unwind-ptrace], [_UPT_create],
187	       [libunwind_LIBS="-lunwind-ptrace $libunwind_LIBS"],
188	       [AC_MSG_ERROR([Couldn't find or use libunwind-ptrace.])],
189	       [$libunwind_LIBS])
190
191  AC_SUBST(libunwind_LIBS)
192  AC_DEFINE([HAVE_LIBUNWIND], [1], [we have libunwind])
193  LDFLAGS="${saved_LDFLAGS}"
194fi
195
196
197saved_CPPFLAGS="${CPPFLAGS}"
198saved_LDFLAGS="${LDFLAGS}"
199CPPFLAGS="${CPPFLAGS} ${AM_CPPFLAGS}"
200LDFLAGS="${LDFLAGS} ${AM_LDFLAGS}"
201# HAVE_ELF_C_READ_MMAP
202AC_MSG_CHECKING([whether elf_begin accepts ELF_C_READ_MMAP])
203AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <gelf.h>]], [[
204int main () {
205	Elf *elf = elf_begin(4, ELF_C_READ_MMAP, 0);
206	return 0;
207}
208	]])],[
209	AC_DEFINE([HAVE_ELF_C_READ_MMAP], [1], [we have read mmap support])
210	AC_MSG_RESULT([yes])],[
211	AC_MSG_RESULT([no])])
212
213saved_CFLAGS="${CFLAGS}"
214CFLAGS="${CFLAGS} -Wall -Werror"
215AC_MSG_CHECKING([whether elf_hash takes a char* argument])
216AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <libelf.h>]], [[
217	(void) elf_hash("name");
218	]])],
219	[AC_DEFINE([ELF_HASH_TAKES_CHARP], [1],
220		[elf_hash() takes char* (as opposed to unsigned char *)])
221	 AC_MSG_RESULT([yes])],
222	[AC_MSG_RESULT([no])])
223CFLAGS="${saved_CFLAGS}"
224CPPFLAGS="${saved_CPPFLAGS}"
225LDFLAGS="${saved_LDFLAGS}"
226
227AM_CPPFLAGS=" \
228	-DSYSCONFDIR="'\"$(sysconfdir)\"'" \
229	${AM_CPPFLAGS} \
230	-I\$(top_srcdir)/sysdeps/${HOST_OS}/${HOST_CPU} \
231	-I\$(top_srcdir)/sysdeps/${HOST_OS} \
232	-I\$(top_srcdir)/sysdeps \
233	-I\$(top_srcdir) \
234"
235
236# Checks for header files.
237AC_CHECK_HEADERS([ \
238	fcntl.h \
239	limits.h \
240	stddef.h \
241	stdint.h \
242	stdlib.h \
243	string.h \
244	sys/ioctl.h \
245	sys/param.h \
246	sys/time.h \
247	unistd.h \
248])
249
250# Checks for typedefs, structures, and compiler characteristics.
251AC_TYPE_UID_T
252AC_C_INLINE
253AC_TYPE_PID_T
254AC_TYPE_SIZE_T
255AC_CHECK_SIZEOF([long])
256
257
258# Checks for library functions.
259AC_FUNC_FORK
260AC_CHECK_FUNCS([ \
261	alarm \
262	atexit \
263	gettimeofday \
264	memset \
265	strchr \
266	strdup \
267	strerror \
268	strsignal \
269	strtol \
270	strtoul \
271])
272
273#
274# Define HAVE_OPEN_MEMSTREAM if open_memstream is available.  glibc
275# before 2.10, eglibc and uClibc all need _GNU_SOURCE defined for
276# open_memstream to become visible, so check for that as well.  If
277# unavailable, require that tmpfile be present.  There's no
278# HAVE_TMPFILE, as we plain require that to be present as a fallback.
279#
280AC_CHECK_FUNCS([open_memstream], [],
281	[AC_MSG_CHECKING([for open_memstream with _GNU_SOURCE])
282	 AC_LINK_IFELSE(
283		[AC_LANG_PROGRAM([[#define _GNU_SOURCE 1
284				   #include <stdio.h>]],
285				 [[char *buf; size_t sz;
286				   return open_memstream(&buf, &sz) != 0;]])],
287
288		 [AC_MSG_RESULT([yes])
289		  AC_DEFINE([HAVE_OPEN_MEMSTREAM], [1],
290			[Define if open_memstream exists.])],
291
292		 [AC_MSG_RESULT([no])
293		  AC_CHECK_FUNC([tmpfile], [],
294			[AC_MSG_ERROR(
295			    [Either open_memstream or tmpfile required.])])])])
296
297#
298# Define HAVE_GETOPT_LONG if that is available.
299#
300AC_CHECK_HEADER([getopt.h], [AC_CHECK_FUNCS([getopt_long])])
301
302#
303# Debugging
304#
305AC_MSG_CHECKING([whether to enable debugging])
306AC_ARG_ENABLE(debug,
307    AS_HELP_STRING([--enable-debug], [enable debugging @<:@default=no@:>@]),
308	[case "$enableval" in
309	y | yes) CONFIG_DEBUG=yes ;;
310        *) CONFIG_DEBUG=no ;;
311    esac],
312    [CONFIG_DEBUG=no])
313AC_MSG_RESULT([${CONFIG_DEBUG}])
314if test "${CONFIG_DEBUG}" = "yes"; then
315    AC_DEFINE(DEBUG, 1, [debugging])
316fi
317
318# Ignore the compiler's warnings at your own risk.
319AM_CFLAGS="${AM_CFLAGS} -Wall -Wsign-compare -Wfloat-equal -Wformat-security"
320AC_ARG_ENABLE([werror],
321    AS_HELP_STRING([--disable-werror], [disable use of -Werror]),
322    [enable_werror=$enableval], [enable_werror=yes])
323if test x$enable_werror = xyes; then
324    AM_CFLAGS="${AM_CFLAGS} -Werror"
325fi
326
327AC_ARG_ENABLE([valgrind],
328    AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
329    [use_valgrind=$enableval], [use_valgrind=no])
330if test x$use_valgrind = xyes; then
331    AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
332    if test x$HAVE_VALGRIND = xno; then
333        AC_MSG_ERROR([valgrind not found])
334    fi
335fi
336AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
337
338AC_SUBST(AM_CPPFLAGS)
339AC_SUBST(AM_CFLAGS)
340AC_SUBST(AM_LDFLAGS)
341AC_SUBST(libelf_LD_LIBRARY_PATH)
342AC_SUBST(libunwind_LD_LIBRARY_PATH)
343
344AC_CONFIG_FILES([
345	Makefile
346	sysdeps/Makefile
347	sysdeps/linux-gnu/Makefile
348	sysdeps/linux-gnu/alpha/Makefile
349	sysdeps/linux-gnu/arm/Makefile
350	sysdeps/linux-gnu/cris/Makefile
351	sysdeps/linux-gnu/ia64/Makefile
352	sysdeps/linux-gnu/m68k/Makefile
353	sysdeps/linux-gnu/mips/Makefile
354	sysdeps/linux-gnu/ppc/Makefile
355	sysdeps/linux-gnu/s390/Makefile
356	sysdeps/linux-gnu/sparc/Makefile
357	sysdeps/linux-gnu/x86/Makefile
358	testsuite/Makefile
359	testsuite/ltrace.main/Makefile
360	testsuite/ltrace.minor/Makefile
361	testsuite/ltrace.torture/Makefile
362])
363AC_OUTPUT
364