configure: Add --enable-sanitize-undefined.
[platform/upstream/elfutils.git] / configure.ac
1 dnl Process this file with autoconf to produce a configure script.
2 dnl Configure input file for elfutils.                     -*-autoconf-*-
3 dnl
4 dnl Copyright (C) 1996-2015 Red Hat, Inc.
5 dnl
6 dnl This file is part of elfutils.
7 dnl
8 dnl  This file is free software; you can redistribute it and/or modify
9 dnl  it under the terms of the GNU General Public License as published by
10 dnl  the Free Software Foundation; either version 3 of the License, or
11 dnl  (at your option) any later version.
12 dnl
13 dnl  elfutils is distributed in the hope that it will be useful, but
14 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of
15 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 dnl  GNU General Public License for more details.
17 dnl
18 dnl  You should have received a copy of the GNU General Public License
19 dnl  along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 AC_INIT([elfutils],[0.161],[https://bugzilla.redhat.com/],[elfutils])
21
22 AC_CONFIG_AUX_DIR([config])
23 AC_CONFIG_FILES([config/Makefile])
24
25 AC_COPYRIGHT([Copyright (C) 1996-2015 Red Hat, Inc.])
26 AC_PREREQ(2.63)                 dnl Minimum Autoconf version required.
27
28 dnl We use GNU make extensions; automake 1.10 defaults to -Wportability.
29 AM_INIT_AUTOMAKE([gnits 1.11 -Wno-portability dist-bzip2 no-dist-gzip parallel-tests])
30 AM_MAINTAINER_MODE
31
32 dnl Unique ID for this build.
33 MODVERSION="Build on $(hostname) $(date +%FT%R:%S%z)"
34 AC_SUBST([MODVERSION])
35 AC_DEFINE_UNQUOTED(MODVERSION, "$MODVERSION")
36 AH_TEMPLATE([MODVERSION], [Identifier for modules in the build.])
37
38 AC_CONFIG_SRCDIR([libelf/libelf.h])
39 AC_CONFIG_FILES([Makefile])
40 AC_CONFIG_HEADERS([config.h])
41
42 AC_CONFIG_MACRO_DIR([m4])
43 AC_CONFIG_FILES([m4/Makefile])
44
45 dnl The RPM spec file.  We substitute a few values in the file.
46 AC_CONFIG_FILES([elfutils.spec:config/elfutils.spec.in])
47
48
49 AC_CANONICAL_HOST
50
51 AC_ARG_ENABLE(deterministic-archives,
52 [AS_HELP_STRING([--enable-deterministic-archives],
53                 [ar and ranlib default to -D behavior])], [
54 if test "${enableval}" = no; then
55   default_ar_deterministic=false
56 else
57   default_ar_deterministic=true
58 fi], [default_ar_deterministic=false])
59 AC_DEFINE_UNQUOTED(DEFAULT_AR_DETERMINISTIC, $default_ar_deterministic,
60                    [Should ar and ranlib use -D behavior by default?])
61
62 AC_ARG_ENABLE([thread-safety],
63 AS_HELP_STRING([--enable-thread-safety],
64                [enable thread safety of libraries EXPERIMENTAL]),
65                use_locks=$enableval, use_locks=no)
66 AM_CONDITIONAL(USE_LOCKS, test "$use_locks" = yes)
67 AS_IF([test "$use_locks" = yes], [AC_DEFINE(USE_LOCKS)])
68 AS_IF([test "$use_locks" = yes],
69       [AC_MSG_WARN([thread-safety is EXPERIMENTAL tests might fail.])])
70
71 AH_TEMPLATE([USE_LOCKS], [Defined if libraries should be thread-safe.])
72
73 AC_PROG_CC
74 AC_PROG_RANLIB
75 AC_PROG_YACC
76 AM_PROG_LEX
77 # Only available since automake 1.12
78 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
79 AC_CHECK_TOOL([READELF], [readelf])
80 AC_CHECK_TOOL([NM], [nm])
81
82 # We use -std=gnu99 but have explicit checks for some language constructs
83 # and GNU extensions since some compilers claim GNU99 support, but don't
84 # really support all language extensions. In particular we need
85 # Mixed Declarations and Code
86 # https://gcc.gnu.org/onlinedocs/gcc/Mixed-Declarations.html
87 # Nested Functions
88 # https://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
89 # Arrays of Variable Length
90 # https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
91 AC_CACHE_CHECK([for gcc with GNU99 support], ac_cv_c99, [dnl
92 old_CFLAGS="$CFLAGS"
93 CFLAGS="$CFLAGS -std=gnu99"
94 AC_COMPILE_IFELSE([AC_LANG_SOURCE([dnl
95 int foo (int a)
96 {
97   for (int i = 0; i < a; ++i) if (i % 4) break; int s = a; return s;
98 }
99
100 double bar (double a, double b)
101 {
102   double square (double z) { return z * z; }
103   return square (a) + square (b);
104 }
105
106 void baz (int n)
107 {
108   struct S { int x[[n]]; };
109 }])],
110                   ac_cv_c99=yes, ac_cv_c99=no)
111 CFLAGS="$old_CFLAGS"])
112 AS_IF([test "x$ac_cv_c99" != xyes],
113       AC_MSG_ERROR([gcc with GNU99 support required]))
114
115 AC_CACHE_CHECK([for __thread support], ac_cv_tls, [dnl
116 # Use the same flags that we use for our DSOs, so the test is representative.
117 # Some old compiler/linker/libc combinations fail some ways and not others.
118 save_CFLAGS="$CFLAGS"
119 save_LDFLAGS="$LDFLAGS"
120 CFLAGS="-fpic $CFLAGS"
121 LDFLAGS="-shared -Wl,-z,defs,-z,relro $LDFLAGS"
122 AC_LINK_IFELSE([dnl
123 AC_LANG_PROGRAM([[#include <stdlib.h>
124 #undef __thread
125 static __thread int a; int foo (int b) { return a + b; }]],
126                 [[exit (foo (0));]])],
127                ac_cv_tls=yes, ac_cv_tls=no)
128 CFLAGS="$save_CFLAGS"
129 LDFLAGS="$save_LDFLAGS"])
130 AS_IF([test "x$ac_cv_tls" != xyes],
131       AC_MSG_ERROR([__thread support required]))
132
133 dnl This test must come as early as possible after the compiler configuration
134 dnl tests, because the choice of the file model can (in principle) affect
135 dnl whether functions and headers are available, whether they work, etc.
136 AC_SYS_LARGEFILE
137
138 dnl Enable the linker to be build as a native-only linker.  By default it
139 dnl can handle all architectures but this comes at a cost.  A native
140 dnl will be slightly faster, small, and has fewer dependencies.
141 native_ld=no
142 AC_ARG_ENABLE([generic],
143 AS_HELP_STRING([--disable-generic], [do not build generic linker]), [dnl
144 if test "$enable_generic" = no; then
145   case "$host_cpu" in
146    i?86)
147     AC_DEFINE(NATIVE_ELF, 32)
148     native_ld=yes
149     base_cpu=i386
150     ;;
151    *)
152     AC_MSG_ERROR([no machine-specific linker for this configuration available])
153     ;;
154   esac
155 fi])
156 AH_TEMPLATE([NATIVE_ELF],
157 [Define to 32 or 64 if a specific implementation is wanted.])
158 AM_CONDITIONAL(NATIVE_LD, test "$native_ld" = yes)
159 dnl The automake generated Makefile cannot deal with macros in the name
160 dnl of files if at any time there is no such file, even if the filename
161 dnl would not be used.
162 AS_IF([test -z "$base_cpu"], [base_cpu=none])
163 AC_SUBST(base_cpu)
164 dnl Support to work around automake's inflexible dependency generation.
165 dnl See src/Makefile.am for more information.
166 AM_CONDITIONAL(NEVER, false)
167
168 dnl enable debugging of branch prediction.
169 AC_ARG_ENABLE([debugpred],
170 AS_HELP_STRING([--enable-debugpred],[build binaries with support to debug branch prediction]),
171 [use_debugpred=$enableval], [use_debugpred=no])
172 case $use_debugpred in
173  yes) use_debugpred_val=1 ;;
174  *)   use_debugpred_val=0 ;;
175 esac
176 AC_SUBST([DEBUGPRED], $use_debugpred_val)
177
178 dnl Enable gprof suport.
179 AC_ARG_ENABLE([gprof],
180 AS_HELP_STRING([--enable-gprof],[build binaries with gprof support]), [use_gprof=$enableval], [use_gprof=no])
181 if test "$use_gprof" = yes; then
182   CFLAGS="$CFLAGS -pg"
183   LDFLAGS="$LDFLAGS -pg"
184 fi
185 AM_CONDITIONAL(GPROF, test "$use_gprof" = yes)
186
187 # Enable gcov suport.
188 AC_ARG_ENABLE([gcov],
189 AS_HELP_STRING([--enable-gcov],[build binaries with gcov support]), [use_gcov=$enableval], [use_gcov=no])
190 if test "$use_gcov" = yes; then
191   CFLAGS="$CFLAGS -fprofile-arcs -ftest-coverage"
192   LDFLAGS="$LDFLAGS -fprofile-arcs"
193 fi
194 AM_CONDITIONAL(GCOV, test "$use_gcov" = yes)
195
196 AC_ARG_ENABLE([sanitize-undefined],
197               AS_HELP_STRING([--enable-sanitize-undefined],
198                              [Use gcc undefined behaviour sanitizer]),
199                              [use_undefined=$enableval], [use_undefined=no])
200 if test "$use_undefined" = yes; then
201   old_CFLAGS="$CFLAGS"
202   old_CXXFLAGS="$CXXFLAGS"
203   # We explicitly use unaligned access when possible (see ALLOW_UNALIGNED)
204   # We want to fail immediately on first error, don't try to recover.
205   CFLAGS="$CFLAGS -fsanitize=undefined -fno-sanitize=alignment -fno-sanitize-recover"
206   CXXFLAGS="$CXXFLAGS -fsanitize=undefined -fno-sanitize=alignment -fno-sanitize-recover"
207   AC_COMPILE_IFELSE([AC_LANG_SOURCE([])], use_undefined=yes, use_undefined=no)
208   AS_IF([test "x$use_undefined" != xyes],
209         AC_MSG_WARN([gcc undefined behaviour sanitizer not available])
210         CFLAGS="$old_CFLAGS" CXXFLAGS="$old_CXXFLAGS")
211 fi
212
213 AC_ARG_ENABLE([valgrind],
214 AS_HELP_STRING([--enable-valgrind],[run all tests under valgrind]),
215 [use_valgrind=$enableval], [use_valgrind=no])
216 if test "$use_valgrind" = yes; then
217   AC_CHECK_PROG(HAVE_VALGRIND, valgrind, yes, no)
218   if test "$HAVE_VALGRIND" = "no"; then
219     AC_MSG_ERROR([valgrind not found])
220   fi
221 fi
222 AM_CONDITIONAL(USE_VALGRIND, test "$use_valgrind" = yes)
223
224 AM_CONDITIONAL(BUILD_STATIC, [dnl
225 test "$use_gprof" = yes -o "$use_gcov" = yes])
226
227 AC_ARG_ENABLE([tests-rpath],
228 AS_HELP_STRING([--enable-tests-rpath],[build $ORIGIN-using rpath into tests]),
229                [tests_use_rpath=$enableval], [tests_use_rpath=no])
230 AM_CONDITIONAL(TESTS_RPATH, test "$tests_use_rpath" = yes)
231
232 LIBEBL_SUBDIR="$PACKAGE"
233 AC_ARG_ENABLE([libebl-subdir],
234 AS_HELP_STRING([--enable-libebl-subdir=DIR],
235 [install libebl_CPU modules in $(libdir)/DIR]), [dnl
236 LIBEBL_SUBDIR="$enable_libebl_subdir"])
237 AC_SUBST([LIBEBL_SUBDIR])
238 AC_DEFINE_UNQUOTED(LIBEBL_SUBDIR, "$LIBEBL_SUBDIR")
239 AH_TEMPLATE([LIBEBL_SUBDIR], [$libdir subdirectory containing libebl modules.])
240
241 dnl Test for zlib and bzlib, gives ZLIB/BZLIB .am
242 dnl conditional and config.h USE_ZLIB/USE_BZLIB #define.
243 save_LIBS="$LIBS"
244 LIBS=
245 eu_ZIPLIB(zlib,ZLIB,z,gzdirect,gzip)
246 eu_ZIPLIB(bzlib,BZLIB,bz2,BZ2_bzdopen,bzip2)
247 eu_ZIPLIB(lzma,LZMA,lzma,lzma_auto_decoder,[LZMA (xz)])
248 zip_LIBS="$LIBS"
249 LIBS="$save_LIBS"
250 AC_SUBST([zip_LIBS])
251
252 AC_CHECK_LIB([stdc++], [__cxa_demangle], [dnl
253 AC_DEFINE([USE_DEMANGLE], [1], [Defined if demangling is enabled])])
254 AM_CONDITIONAL(DEMANGLE, test "x$ac_cv_lib_stdcpp___cxa_demangle" = "xyes")
255 AS_IF([test "x$ac_cv_lib_stdcpp___cxa_demangle" = "xyes"],
256       [enable_demangler=yes],[enable_demangler=no])
257
258 AC_ARG_ENABLE([textrelcheck],
259 AS_HELP_STRING([--disable-textrelcheck],
260                [Disable textrelcheck being a fatal error]))
261 AM_CONDITIONAL(FATAL_TEXTREL, [test "x$enable_textrelcheck" != "xno"])
262 AS_IF([test "x$enable_textrelcheck" != "xno"],
263       [enable_textrelcheck=yes],[enable_textrelcheck=no])
264
265 AC_ARG_ENABLE([symbol-versioning],
266 AS_HELP_STRING([--disable-symbol-versioning],
267                [Disable symbol versioning in shared objects]))
268 AM_CONDITIONAL(SYMBOL_VERSIONING, [test "x$enable_symbol_versioning" != "xno"])
269 AS_IF([test "x$enable_symbol_versioning" = "xno"],
270       [AC_MSG_WARN([Disabling symbol versioning breaks ABI compatibility.])
271        enable_symbol_versioning=no],[enable_symbol_versioning=yes])
272
273 dnl Check if we have argp available from our libc
274 AC_LINK_IFELSE(
275         [AC_LANG_PROGRAM(
276                 [#include <argp.h>],
277                 [int argc=1; char *argv[]={"test"}; argp_parse(0,argc,argv,0,0,0); return 0;]
278                 )],
279         [libc_has_argp="true"],
280         [libc_has_argp="false"]
281 )
282
283 dnl If our libc doesn't provide argp, then test for libargp
284 if test "$libc_has_argp" = "false" ; then
285         AC_MSG_WARN("libc does not have argp")
286         AC_CHECK_LIB([argp], [argp_parse], [have_argp="true"], [have_argp="false"])
287
288         if test "$have_argp" = "false"; then
289                 AC_MSG_ERROR("no libargp found")
290         else
291                 argp_LDADD="-largp"
292         fi
293 else
294         argp_LDADD=""
295 fi
296 AC_SUBST([argp_LDADD])
297
298 dnl The directories with content.
299
300 dnl Documentation.
301 dnl Commented out for now.
302 dnl AC_CONFIG_FILES([doc/Makefile])
303
304 dnl Support library.
305 AC_CONFIG_FILES([lib/Makefile])
306
307 dnl ELF library.
308 AC_CONFIG_FILES([libelf/Makefile])
309
310 dnl Higher-level ELF support library.
311 AC_CONFIG_FILES([libebl/Makefile])
312
313 dnl DWARF-ELF Lower-level Functions support library.
314 AC_CONFIG_FILES([libdwelf/Makefile])
315
316 dnl DWARF library.
317 AC_CONFIG_FILES([libdw/Makefile])
318
319 dnl Higher-level DWARF support library.
320 AC_CONFIG_FILES([libdwfl/Makefile])
321
322 dnl CPU handling library.
323 AC_CONFIG_FILES([libcpu/Makefile])
324
325 dnl Assembler library.
326 AM_CONDITIONAL(HAVE_LIBASM, true)dnl Used in tests/Makefile.am, which see.
327 AC_CONFIG_FILES([libasm/Makefile])
328
329 dnl CPU-specific backend libraries.
330 AC_CONFIG_FILES([backends/Makefile])
331
332 dnl Tools.
333 AC_CONFIG_FILES([src/Makefile po/Makefile.in])
334
335 dnl Test suite.
336 AM_CONDITIONAL(STANDALONE, false)dnl Used in tests/Makefile.am, which see.
337 AC_CONFIG_FILES([tests/Makefile])
338
339 # Get the definitions necessary to create the Makefiles in the po
340 # subdirectories.  This is a small subset of the gettext rules.
341 AC_SUBST(USE_NLS, yes)
342 AM_PO_SUBDIRS
343
344 dnl Appended to the config.h file.
345 dnl We hide all kinds of configuration magic in lib/eu-config.h.
346 AH_BOTTOM([#include <eu-config.h>])
347
348 dnl Version compatibility header.
349 AC_CONFIG_FILES([version.h:config/version.h.in])
350 AC_SUBST([eu_version])
351
352 # 1.234<whatever> -> 1234<whatever>
353 case "$PACKAGE_VERSION" in
354 [[0-9]].*) eu_version=`echo "$PACKAGE_VERSION" | sed 's@\.@@'` ;;
355 *)         AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
356 esac
357 case "$eu_version" in
358 *.*)
359   # 1234.567 -> "1234", "567"
360   eu_extra_version="${eu_version#*.}"
361   eu_version="${eu_version%%.*}"
362   case "$eu_extra_version" in
363   [[0-9]][[0-9]][[0-9]]) ;;
364   [[0-9]][[0-9]])       eu_extra_version="${eu_extra_version}0" ;;
365   [[0-9]])              eu_extra_version="${eu_extra_version}00" ;;
366   *) AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
367   esac
368   ;;
369 *)
370   eu_extra_version=000
371   ;;
372 esac
373
374 case "$eu_version" in
375       0[[0-9]][[0-9]][[0-9]]) eu_version="${eu_version#0}$eu_extra_version" ;;
376 [[0-9]][[0-9]][[0-9]][[0-9]]) eu_version="${eu_version}$eu_extra_version" ;;
377 [[0-9]][[0-9]][[0-9]])        eu_version="${eu_version}0$eu_extra_version" ;;
378 [[0-9]][[0-9]])               eu_version="${eu_version}00$eu_extra_version";;
379 *) AC_MSG_ERROR([confused by version number '$PACKAGE_VERSION']) ;;
380 esac
381
382 # Round up to the next release API (x.y) version.
383 eu_version=$(( (eu_version + 999) / 1000 ))
384
385 AC_CHECK_SIZEOF(long)
386
387 # On aarch64 before glibc 2.20 we would get the kernel user_pt_regs instead
388 # of the user_regs_struct from sys/user.h. They are structurally the same
389 # but we get either one or the other.
390 AC_CHECK_TYPE([struct user_regs_struct],
391               [sys_user_has_user_regs=yes], [sys_user_has_user_regs=no],
392               [[#include <sys/ptrace.h>]
393                [#include <sys/time.h>]
394                [#include <sys/user.h>]])
395 if test "$sys_user_has_user_regs" = "yes"; then
396   AC_DEFINE(HAVE_SYS_USER_REGS, 1,
397             [Define to 1 if <sys/user.h> defines struct user_regs_struct])
398 fi
399
400 # On a 64-bit host where can can use $CC -m32, we'll run two sets of tests.
401 # Likewise in a 32-bit build on a host where $CC -m64 works.
402 utrace_BIARCH
403 # `$utrace_biarch' will be `-m64' even on an uniarch i386 machine.
404 CC_BIARCH="$CC $utrace_biarch"
405 AC_SUBST([CC_BIARCH])
406
407 AC_OUTPUT
408
409 AC_MSG_NOTICE([
410 =====================================================================
411         elfutils: ${PACKAGE_VERSION} (eu_version: ${eu_version})
412 =====================================================================
413
414     Prefix                             : ${prefix}
415     Program prefix ("eu-" recommended) : ${program_prefix}
416     Source code location               : ${srcdir}
417     Maintainer mode                    : ${enable_maintainer_mode}
418     libebl modules subdirectory        : ${LIBEBL_SUBDIR}
419     build arch                         : ${ac_cv_build}
420
421   RECOMMENDED FEATURES (should all be yes)
422     gzip support                       : ${with_zlib}
423     bzip2 support                      : ${with_bzlib}
424     lzma/xz support                    : ${with_lzma}
425     libstdc++ demangle support         : ${enable_demangler}
426     File textrel check                 : ${enable_textrelcheck}
427     Symbol versioning                  : ${enable_symbol_versioning}
428
429   NOT RECOMMENDED FEATURES (should all be no)
430     Experimental thread safety         : ${use_locks}
431
432   OTHER FEATURES
433     Deterministic archives by default  : ${default_ar_deterministic}
434     Native language support            : ${USE_NLS}
435
436   EXTRA TEST FEATURES (used with make check)
437     debug branch prediction            : ${use_debugpred}
438     gprof support                      : ${use_gprof}
439     gcov support                       : ${use_gcov}
440     run all tests under valgrind       : ${use_valgrind}
441     gcc undefined behaviour sanitizer  : ${use_undefined}
442     use rpath in tests                 : ${tests_use_rpath}
443     test biarch                        : ${utrace_cv_cc_biarch}
444 ])