Replace readdir_r with readdir
[platform/upstream/ltrace.git] / configure.ac
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@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|powerpc64le)      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|powerpc64le)    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 AM_CONDITIONAL(HAVE_LIBDW, test x"$enable_elfutils" = xyes)
391
392 AC_SUBST(AM_CPPFLAGS)
393 AC_SUBST(AM_CFLAGS)
394 AC_SUBST(AM_LDFLAGS)
395 AC_SUBST(libelf_LD_LIBRARY_PATH)
396 AC_SUBST(elfutils_LD_LIBRARY_PATH)
397 AC_SUBST(libunwind_LD_LIBRARY_PATH)
398
399 AC_CONFIG_FILES([
400         Makefile
401         sysdeps/Makefile
402         sysdeps/linux-gnu/Makefile
403         sysdeps/linux-gnu/aarch64/Makefile
404         sysdeps/linux-gnu/alpha/Makefile
405         sysdeps/linux-gnu/arm/Makefile
406         sysdeps/linux-gnu/cris/Makefile
407         sysdeps/linux-gnu/ia64/Makefile
408         sysdeps/linux-gnu/m68k/Makefile
409         sysdeps/linux-gnu/metag/Makefile
410         sysdeps/linux-gnu/mips/Makefile
411         sysdeps/linux-gnu/ppc/Makefile
412         sysdeps/linux-gnu/s390/Makefile
413         sysdeps/linux-gnu/sparc/Makefile
414         sysdeps/linux-gnu/x86/Makefile
415         testsuite/Makefile
416         testsuite/ltrace.main/Makefile
417         testsuite/ltrace.minor/Makefile
418         testsuite/ltrace.torture/Makefile
419 ])
420 AC_OUTPUT