configure.ac revision 1.1.1.6
1dnl Process this file with autoconf to produce a configure script.
2dnl
3dnl   Copyright (C) 2006-2018 Free Software Foundation, Inc.
4dnl
5dnl This file is free software; you can redistribute it and/or modify
6dnl it under the terms of the GNU General Public License as published by
7dnl the Free Software Foundation; either version 3 of the License, or
8dnl (at your option) any later version.
9dnl
10dnl This program is distributed in the hope that it will be useful,
11dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
12dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13dnl GNU General Public License for more details.
14dnl
15dnl You should have received a copy of the GNU General Public License
16dnl along with this program; see the file COPYING3.  If not see
17dnl <http://www.gnu.org/licenses/>.
18dnl
19
20AC_PREREQ(2.59)
21
22AC_INIT(gold, 0.1)
23AC_CONFIG_SRCDIR(gold.cc)
24
25AC_CANONICAL_TARGET
26
27AM_INIT_AUTOMAKE([no-dist parallel-tests])
28
29AM_CONFIG_HEADER(config.h:config.in)
30
31# PR 14072
32AH_VERBATIM([00_CONFIG_H_CHECK],
33[/* Check that config.h is #included before system headers
34   (this works only for glibc, but that should be enough).  */
35#if defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__CONFIG_H__)
36#  error config.h must be #included before system headers
37#endif
38#define __CONFIG_H__ 1])
39
40AC_ARG_WITH(sysroot,
41[  --with-sysroot[=DIR]    search for usr/lib et al within DIR],
42[sysroot=$withval], [sysroot=no])
43
44if test "$sysroot" = "yes"; then
45  sysroot='${exec_prefix}/${target_alias}/sys-root'
46elif test "$sysroot" = "no"; then
47  sysroot=
48fi
49
50sysroot_relocatable=0
51if test -n "$sysroot"; then
52  case "$sysroot" in
53    "${prefix}" | "${prefix}/"* | \
54    "${exec_prefix}" | "${exec_prefix}/"* | \
55    '${prefix}' | '${prefix}/'*| \
56    '${exec_prefix}' | '${exec_prefix}/'*)
57      sysroot_relocatable=1
58      ;;
59  esac
60fi
61
62AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT, "$sysroot",
63  [System root for target files])
64AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT_RELOCATABLE, $sysroot_relocatable,
65  [Whether the system root can be relocated])
66
67dnl "install_as_default" is true if the linker to be installed as the
68dnl default linker, ld.
69dnl "installed_linker" is the installed gold linker name.
70
71installed_linker=ld.gold
72AC_ARG_ENABLE(gold,
73[[  --enable-gold[=ARG]     build gold [ARG={default,yes,no}]]],
74[case "${enableval}" in
75 default)
76   install_as_default=yes
77   ;;
78 yes)
79   if test x${enable_ld} = xno; then
80     install_as_default=yes
81   fi
82   ;;
83 esac],
84[install_as_default=no])
85AC_SUBST(install_as_default)
86AC_SUBST(installed_linker)
87
88dnl For now threads are a configure time option.
89AC_ARG_ENABLE([threads],
90[  --enable-threads        multi-threaded linking],
91[case "${enableval}" in
92  yes | "") threads=yes ;;
93  no) threads=no ;;
94  *) threads=yes ;;
95 esac],
96[threads=no])
97if test "$threads" = "yes"; then
98  AC_DEFINE(ENABLE_THREADS, 1,
99	    [Define to do multi-threaded linking])
100fi
101AM_CONDITIONAL(THREADS, test "$threads" = "yes")
102
103AC_ARG_ENABLE([plugins],
104[  --enable-plugins        linker plugins],
105[case "${enableval}" in
106  yes | "") plugins=yes ;;
107  no) plugins=no ;;
108  *) plugins=yes ;;
109 esac],
110[plugins=no])
111if test "$plugins" = "yes"; then
112  AC_DEFINE(ENABLE_PLUGINS, 1,
113	    [Define to enable linker plugins])
114fi
115AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes")
116
117# Decide if -z relro should be enabled in ELF linker by default.
118ac_default_ld_z_relro=unset
119# Provide a configure time option to override our default.
120AC_ARG_ENABLE(relro,
121	      AS_HELP_STRING([--enable-relro],
122	      [enable -z relro in ELF linker by default]),
123[case "${enableval}" in
124  yes)  ac_default_ld_z_relro=1 ;;
125  no)  ac_default_ld_z_relro=0 ;;
126esac])dnl
127if test "${ac_default_ld_z_relro}" = unset; then
128  ac_default_ld_z_relro=1
129fi
130AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_RELRO,
131  $ac_default_ld_z_relro,
132  [Define to 1 if you want to enable -z relro in ELF linker by default.])
133
134AC_ARG_ENABLE([targets],
135[  --enable-targets        alternative target configurations],
136[case "${enableval}" in
137  yes | "")
138    AC_MSG_ERROR([--enable-targets option must specify target names or 'all'])
139    ;;
140  no)
141    enable_targets=
142    ;;
143  *)
144    enable_targets=$enableval
145    ;;
146esac],
147[# For now, enable all targets by default
148 enable_targets=all
149])
150
151# Canonicalize the enabled targets.
152if test -n "$enable_targets"; then
153  for targ in `echo $enable_targets | sed -e 's/,/ /g'`; do
154    result=`$ac_config_sub $targ 2>/dev/null`
155    if test -n "$result"; then
156      canon_targets="$canon_targets $result"
157    else
158      # Permit unrecognized target names, like "all".
159      canon_targets="$canon_targets $targ"
160    fi
161  done
162fi
163
164# Decide which "--hash-style" to use by default
165# Provide a configure time option to override our default.
166AC_ARG_ENABLE([default-hash-style],
167AS_HELP_STRING([--enable-default-hash-style={sysv,gnu,both}],
168	       [use this default hash style]),
169[case "${enable_default_hash_style}" in
170  sysv | gnu | both) ;;
171  *) AC_MSG_ERROR([bad value ${enable_default_hash_style} for enable-default-hash-style option]) ;;
172esac],
173[case "${target}" in
174  # Enable gnu hash only on GNU targets, but not mips
175  mips*-*-*) enable_default_hash_style=sysv ;;
176  *-*-gnu* | *-*-linux* | *-*-nacl*) enable_default_hash_style=both ;;
177  *) enable_default_hash_style=sysv ;;
178esac])
179
180AC_DEFINE_UNQUOTED([DEFAULT_HASH_STYLE],
181  ["${enable_default_hash_style}"],
182  [Set the default --hash-style value])
183
184# See which specific instantiations we need.
185targetobjs=
186all_targets=
187default_machine=
188default_size=
189default_big_endian=
190default_osabi=ELFOSABI_NONE
191targ_32_little=
192targ_32_big=
193targ_64_little=
194targ_64_big=
195for targ in $target $canon_targets; do
196  if test "$targ" = "all"; then
197    targ_32_little=yes
198    targ_32_big=yes
199    targ_64_little=yes
200    targ_64_big=yes
201    all_targets=yes
202  else
203    . ${srcdir}/configure.tgt
204
205    if test "$targ_obj" = "UNKNOWN"; then
206      AC_MSG_ERROR("unsupported target $targ")
207    else
208      targetobjs="$targetobjs ${targ_obj}.\$(OBJEXT)"
209      if test "$targ_extra_obj" != ""; then
210        targetobjs="$targetobjs ${targ_extra_obj}.\$(OBJEXT)"
211      fi
212      if test "$targ_size" = "32" -o "$targ_extra_size" = "32"; then
213	  if test "$targ_big_endian" = "true" \
214	      -o "$targ_extra_big_endian" = "true"; then
215	      targ_32_big=yes
216	  fi
217	  if test "$targ_big_endian" = "false" \
218	      -o "$targ_extra_big_endian" = "false"; then
219	      targ_32_little=yes
220	  fi
221      fi
222      if test "$targ_size" = "64" -o "$targ_extra_size" = "64"; then
223	  if test "$targ_big_endian" = "true" \
224	      -o "$targ_extra_big_endian" = "true"; then
225	      targ_64_big=yes
226	  fi
227	  if test "$targ_big_endian" = "false" \
228	      -o "$targ_extra_big_endian" = "false"; then
229	      targ_64_little=yes
230	  fi
231      fi
232
233      if test "$target" = "$targ"; then
234        default_machine=$targ_machine
235	default_size=$targ_size
236	default_big_endian=$targ_big_endian
237	default_osabi=$targ_osabi
238
239	AM_CONDITIONAL(DEFAULT_TARGET_AARCH64, test "$targ_obj" = "aarch64")
240	AM_CONDITIONAL(DEFAULT_TARGET_ARM, test "$targ_obj" = "arm")
241	AM_CONDITIONAL(DEFAULT_TARGET_I386, test "$targ_obj" = "i386")
242	AM_CONDITIONAL(DEFAULT_TARGET_POWERPC, test "$targ_obj" = "powerpc")
243	AM_CONDITIONAL(DEFAULT_TARGET_SPARC, test "$targ_obj" = "sparc")
244	AM_CONDITIONAL(DEFAULT_TARGET_S390, test "$targ_obj" = "s390")
245	target_x86_64=no
246	target_x32=no
247	if test "$targ_obj" = "x86_64"; then
248	  case "$target" in
249	  x86_64*-linux-gnux32)
250	    target_x32=yes
251	    default_size=32
252	    ;;
253	  *)
254	    target_x86_64=yes
255	    ;;
256	  esac
257	fi
258	AM_CONDITIONAL(DEFAULT_TARGET_X86_64, test "$target_x86_64" = "yes")
259	AM_CONDITIONAL(DEFAULT_TARGET_X32, test "$target_x32" = "yes")
260	AM_CONDITIONAL(DEFAULT_TARGET_X86_64_OR_X32,
261		       test "$target_x86_64" = "yes" -o "$target_x32" = "yes")
262	AM_CONDITIONAL(DEFAULT_TARGET_TILEGX, test "$targ_obj" = "tilegx")
263        AM_CONDITIONAL(DEFAULT_TARGET_MIPS, test "$targ_obj" = "mips")
264	DEFAULT_TARGET=${targ_obj}
265	AC_SUBST(DEFAULT_TARGET)
266      fi
267    fi
268  fi
269done
270
271# Remove any duplicates.
272to=""
273for t in $targetobjs; do
274  case " $to " in
275  *" $t "*) ;;
276  *) to="$to $t" ;;
277  esac
278done
279targetobjs=$to
280
281if test -n "$targ_32_little"; then
282  AC_DEFINE(HAVE_TARGET_32_LITTLE, 1,
283	      [Define to support 32-bit little-endian targets])
284fi
285if test -n "$targ_32_big"; then
286  AC_DEFINE(HAVE_TARGET_32_BIG, 1,
287	      [Define to support 32-bit big-endian targets])
288fi
289if test -n "$targ_64_little"; then
290  AC_DEFINE(HAVE_TARGET_64_LITTLE, 1,
291	      [Define to support 64-bit little-endian targets])
292fi
293if test -n "$targ_64_big"; then
294  AC_DEFINE(HAVE_TARGET_64_BIG, 1,
295	      [Define to support 64-bit big-endian targets])
296fi
297
298if test -n "$all_targets"; then
299  TARGETOBJS='$(ALL_TARGETOBJS)'
300else
301  TARGETOBJS="$targetobjs"
302fi
303AC_SUBST(TARGETOBJS)
304
305AC_DEFINE_UNQUOTED(GOLD_DEFAULT_MACHINE, $default_machine,
306		   [Default machine code])
307AC_DEFINE_UNQUOTED(GOLD_DEFAULT_SIZE, $default_size,
308		   [Default size (32 or 64)])
309AC_DEFINE_UNQUOTED(GOLD_DEFAULT_BIG_ENDIAN, $default_big_endian,
310		   [Default big endian (true or false)])
311AC_DEFINE_UNQUOTED(GOLD_DEFAULT_OSABI, $default_osabi,
312		   [Default OSABI code])
313
314AC_ARG_WITH(lib-path,
315[  --with-lib-path=dir1:dir2...  set default LIB_PATH],
316[case "$withval" in
317 yes) LIB_PATH='"/lib:/usr/lib"' ;;
318 no) LIB_PATH='""' ;;
319 *) LIB_PATH='"'"$withval"'"' ;;
320 esac],
321[LIB_PATH='"::DEFAULT::"'])
322AC_DEFINE_UNQUOTED(LIB_PATH, $LIB_PATH,
323		   [Default library search path])
324if test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias"; then
325  AC_DEFINE(NATIVE_LINKER, 1, [Whether configured as a native linker])
326fi
327
328AC_CHECK_TOOL(NM, nm)
329
330AC_PROG_CC
331AC_PROG_CXX
332AC_PROG_YACC
333AC_PROG_RANLIB
334AC_PROG_INSTALL
335AC_PROG_LN_S
336
337AC_GNU_SOURCE
338
339ZW_GNU_GETTEXT_SISTER_DIR
340AM_PO_SUBDIRS
341
342AC_C_BIGENDIAN
343
344AC_EXEEXT
345
346AM_CONDITIONAL(NATIVE_LINKER,
347  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias")
348AM_CONDITIONAL(GCC, test "$GCC" = yes)
349
350AM_CONDITIONAL(NATIVE_OR_CROSS_LINKER,
351  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias" -o "x$host_alias" = "x$build_alias")
352
353dnl Test for whether static linking is supported.  Some systems do not
354dnl install static libraries.  This only affects the set of tests that
355dnl we run.
356AC_CACHE_CHECK([whether static linking works], [gold_cv_lib_static],
357[LDFLAGS_hold=$LDFLAGS
358LDFLAGS="$LDFLAGS -static"
359AC_LINK_IFELSE([
360AC_LANG_PROGRAM([[void f() { }]])],
361[gold_cv_lib_static=yes], [gold_cv_lib_static=no])
362LDFLAGS=$LDFLAGS_hold])
363AM_CONDITIONAL(HAVE_STATIC, test "$gold_cv_lib_static" = "yes")
364
365dnl Some architectures do not support taking pointers of functions
366dnl defined in shared libraries except in -fPIC mode.  We need to
367dnl tell the unittest framework if we're compiling for one of those
368dnl targets, so it doesn't try to run the tests that do that.
369AM_CONDITIONAL(FN_PTRS_IN_SO_WITHOUT_PIC, [
370  case $target_cpu in
371    powerpc*) false;;
372    x86_64) false;;
373    sparc64) false;;
374    s390x) false;;
375    *) true;;
376  esac])
377
378dnl Test for gcc 4.1 or later.  Full support for -mcmodel=medium is
379dnl only available in gcc 4.1.
380AC_CACHE_CHECK([for gcc >= 4.1], [gold_cv_prog_gcc41],
381[AC_COMPILE_IFELSE([
382#if !defined __GNUC__
383error
384#elif __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
385error
386#endif
387], [gold_cv_prog_gcc41=yes], [gold_cv_prog_gcc41=no])])
388
389save_CFLAGS="$CFLAGS"
390CFLAGS="$CFLAGS -mcmodel=medium"
391AC_COMPILE_IFELSE([int i;], [have_mcmodel_medium=yes], [have_mcmodel_medium=no])
392CFLAGS="$save_CFLAGS"
393dnl Whether we can test -mcmodel=medium.
394AM_CONDITIONAL(MCMODEL_MEDIUM,
395[test "$target_cpu" = "x86_64" -a "$have_mcmodel_medium" = "yes" -a "$gold_cv_prog_gcc41" = "yes"])
396
397AC_CACHE_CHECK([whether $CC supports -fmerge-constants],
398	       [gold_cv_merge_constants], [
399save_CFLAGS="$CFLAGS"
400CFLAGS="$CFLAGS -fmerge-constants"
401AC_COMPILE_IFELSE([const char *s = "foo";],
402		  [gold_cv_merge_constants=yes],
403		  [gold_cv_merge_constants=no])
404CFLAGS="$save_CFLAGS"])
405AC_SUBST([MERGE_CONSTANTS_FLAG])
406AS_IF([test "$gold_cv_merge_constants" = yes],
407      [MERGE_CONSTANTS_FLAG=-fmerge-constants],
408      [MERGE_CONSTANTS_FLAG=])
409
410dnl Test for __thread support.
411AC_CACHE_CHECK([for thread support], [gold_cv_c_thread],
412[AC_COMPILE_IFELSE([__thread int i = 1;],
413[gold_cv_c_thread=yes], [gold_cv_c_thread=no])])
414
415AM_CONDITIONAL(TLS, test "$gold_cv_c_thread" = "yes")
416
417dnl On GNU/Linux TLS in static programs only works when using glibc
418dnl 2.4 or later.
419AC_CACHE_CHECK([for glibc >= 2.4], [gold_cv_lib_glibc24],
420[AC_COMPILE_IFELSE([
421#include <features.h>
422#if !defined __GLIBC__
423error
424#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4)
425error
426#endif
427], [gold_cv_lib_glibc24=yes], [gold_cv_lib_glibc24=no])])
428
429AM_CONDITIONAL(STATIC_TLS, test "$gold_cv_lib_glibc24" = "yes")
430
431dnl Test for #pragma omp threadprivate
432AC_CACHE_CHECK([for omp support], [gold_cv_c_threadprivate],
433[save_CFLAGS="$CFLAGS"
434CFLAGS="$CFLAGS -fopenmp"
435AC_COMPILE_IFELSE([
436#include <omp.h>
437int i;
438#pragma omp threadprivate (i)
439], [gold_cv_c_threadprivate=yes], [gold_cv_c_threadprivate=no])
440CFLAGS="$save_CFLAGS"])
441if test "$gold_cv_c_threadprivate" = "yes"; then
442  AC_DEFINE(HAVE_OMP_SUPPORT, 1,
443	    [Define if compiler supports #pragma omp threadprivate])
444fi
445AM_CONDITIONAL(OMP_SUPPORT, test "$gold_cv_c_threadprivate" = "yes")
446
447dnl Test for the -ftls-dialect=gnu2 option.
448dnl Use -Werror in case of compilers that make unknown -m options warnings.
449dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS
450dnl gets set later by default Autoconf magic to include -Werror.  (We are
451dnl assuming here that there is no compiler that groks -mtls-dialect=gnu2
452dnl but does not grok -Werror.)
453save_CFLAGS="$CFLAGS"
454CFLAGS="$CFLAGS -Werror -fpic -mtls-dialect=gnu2"
455AC_COMPILE_IFELSE([
456__thread int i;
457void foo (void)
458{
459  i = 10;
460}
461], [have_tls_gnu2=yes], [have_tls_gnu2=no])
462CFLAGS="$save_CFLAGS"
463AM_CONDITIONAL(TLS_GNU2_DIALECT, test "$have_tls_gnu2" = "yes")
464
465dnl On GNU/Linux TLS descriptors are supported by the dynamic loader
466dnl only with glibc 2.9 or later.
467AC_CACHE_CHECK([for glibc >= 2.9], [gold_cv_lib_glibc29],
468[AC_COMPILE_IFELSE([
469#include <features.h>
470#if !defined __GLIBC__
471error
472#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 9)
473error
474#endif
475], [gold_cv_lib_glibc29=yes], [gold_cv_lib_glibc29=no])])
476
477AM_CONDITIONAL(TLS_DESCRIPTORS, test "$gold_cv_lib_glibc29" = "yes")
478
479dnl Test for the -frandom-seed option.
480AC_CACHE_CHECK([for -frandom-seed support], [gold_cv_c_random_seed],
481[save_CFLAGS="$CFLAGS"
482CFLAGS="$CFLAGS -frandom-seed=foo"
483AC_COMPILE_IFELSE([int i;], [gold_cv_c_random_seed=yes],
484[gold_cv_c_random_seed=no])
485CFLAGS="$save_CFLAGS"])
486if test "$gold_cv_c_random_seed" = "yes"; then
487  # In Makefile, '$@' will be expanded to be the name of the file
488  # being built, providing a unique seed for each file.
489  RANDOM_SEED_CFLAGS=-frandom-seed=\$@
490fi
491AC_SUBST(RANDOM_SEED_CFLAGS)
492
493dnl On GNU/Linux ifunc is supported by the dynamic linker in glibc
494dnl 2.11 or later, and by binutils 2.20.1 or later.
495AC_CACHE_CHECK([for glibc ifunc support], [gold_cv_lib_glibc_ifunc],
496[save_LDFLAGS="$LDFLAGS"
497LDFLAGS="$LDFLAGS -static"
498AC_LINK_IFELSE([AC_LANG_PROGRAM([[
499#include <features.h>
500#if !defined __GLIBC__
501error
502#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 11)
503error
504#endif
505void func (void) { }
506void invoke (void);
507__asm__(".type invoke, %gnu_indirect_function");
508typedef void (*funcptr) (void);
509funcptr dispatch (void) __asm__ ("invoke");
510funcptr dispatch (void) { return &func; }]],
511[[invoke();]])
512], [
513if ${NM} conftest$EXEEXT | grep "__rela\?_iplt_start" >/dev/null 2>&1; then
514  gold_cv_lib_glibc_ifunc=both
515else
516  gold_cv_lib_glibc_ifunc=dyn
517fi], [gold_cv_lib_glibc_ifunc=no])
518LDFLAGS="$save_LDFLAGS"])
519
520AM_CONDITIONAL(IFUNC, test "$gold_cv_lib_glibc_ifunc" != "no")
521AM_CONDITIONAL(IFUNC_STATIC, test "$gold_cv_lib_glibc_ifunc" = "both")
522
523AM_BINUTILS_WARNINGS
524
525WARN_CXXFLAGS=`echo ${WARN_CFLAGS} | sed -e 's/-Wstrict-prototypes//' -e 's/-Wmissing-prototypes//' -e 's/-Wshadow//'`
526AC_SUBST(WARN_CXXFLAGS)
527
528AC_ARG_WITH(gold-ldflags,
529[  --with-gold-ldflags=FLAGS  additional link flags for gold],
530[if test "$withval" = "no" -o "$withval" = "yes"; then
531   GOLD_LDFLAGS=
532 else
533   GOLD_LDFLAGS=$withval
534 fi],
535[GOLD_LDFLAGS=])
536AC_SUBST(GOLD_LDFLAGS)
537
538AC_ARG_WITH(gold-ldadd,
539[  --with-gold-ldadd=LIBS     additional libraries for gold],
540[if test "$withval" = "no" -o "$withval" = "yes"; then
541   GOLD_LDADD=
542 else
543   GOLD_LDADD=$withval
544 fi],
545[GOLD_LDADD=])
546AC_SUBST(GOLD_LDADD)
547
548dnl Force support for large files by default.  This may need to be
549dnl host dependent.  If build == host, we can check getconf LFS_CFLAGS.
550LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
551AC_SUBST(LFS_CFLAGS)
552
553AC_CHECK_HEADERS(sys/mman.h)
554AC_CHECK_FUNCS(chsize mmap)
555AC_REPLACE_FUNCS(pread ftruncate ffsll)
556
557AC_CACHE_CHECK([mremap with MREMAP_MAYMOVE], [gold_cv_lib_mremap_maymove],
558[AC_LINK_IFELSE([
559AC_LANG_PROGRAM([[
560#include <sys/mman.h>
561void f() { mremap (0, 0, 0, MREMAP_MAYMOVE); }
562]])], [gold_cv_lib_mremap_maymove=yes], [gold_cv_lib_mremap_maymove=no])])
563if test "$gold_cv_lib_mremap_maymove" = "yes"; then
564  AC_DEFINE(HAVE_MREMAP, 1,
565    [Define to 1 if you have the mremap function with MREMAP_MAYMOVE support])
566else
567  AC_LIBOBJ(mremap)
568fi
569
570# Link in zlib if we can.  This allows us to write compressed sections.
571AM_ZLIB
572
573dnl We have to check these in C, not C++, because autoconf generates
574dnl tests which have no type information, and current glibc provides
575dnl multiple declarations of functions like basename when compiling
576dnl with C++.
577AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp])
578
579dnl Check if gcc supports the -gpubnames option.
580dnl Use -Werror in case of compilers that make unknown -g options warnings.
581dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS
582dnl gets set later by default Autoconf magic to include -Werror.  (We are
583dnl assuming here that there is no compiler that groks -gpubnames
584dnl but does not grok -Werror.)
585save_CFLAGS="$CFLAGS"
586CFLAGS="$CFLAGS -Werror -gpubnames"
587AC_COMPILE_IFELSE([int i;], [have_pubnames=yes], [have_pubnames=no])
588CFLAGS="$save_CFLAGS"
589AM_CONDITIONAL(HAVE_PUBNAMES, test "$have_pubnames" = "yes")
590
591dnl Check if gcc supports the -fno-use-linker-plugin option.
592save_CFLAGS="$CFLAGS"
593CFLAGS="$CFLAGS -Werror -fno-use-linker-plugin"
594AC_COMPILE_IFELSE([int i;], [have_no_use_linker_plugin=yes], [have_no_use_linker_plugin=no])
595CFLAGS="$save_CFLAGS"
596AM_CONDITIONAL(HAVE_NO_USE_LINKER_PLUGIN, test "$have_no_use_linker_plugin" = "yes")
597
598AC_LANG_PUSH(C++)
599
600AC_CHECK_HEADERS(unordered_set unordered_map)
601AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map)
602AC_CHECK_HEADERS(ext/hash_map ext/hash_set)
603AC_CHECK_HEADERS(byteswap.h)
604
605dnl When plugins enabled dynamic loader interface is required. Check headers
606dnl which may provide this interface. Add the necessary library to link.
607AC_CHECK_HEADERS(windows.h)
608AC_CHECK_HEADERS(dlfcn.h)
609AC_SEARCH_LIBS(dlopen, [dl dld])
610case "$ac_cv_search_dlopen" in
611  no*) DLOPEN_LIBS="";;
612  *)   DLOPEN_LIBS="$ac_cv_search_dlopen";;
613esac
614AC_SUBST(DLOPEN_LIBS)
615
616AC_CHECK_FUNCS(mallinfo posix_fallocate fallocate readv sysconf times)
617AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp, strndup, memmem])
618
619# Use of ::std::tr1::unordered_map::rehash causes undefined symbols
620# at link time with some versions of GCC.
621AC_CACHE_CHECK([whether ::std::tr1::unordered_map::rehash is usable.],
622[gold_cv_unordered_map_rehash],
623[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
624#include <tr1/unordered_map>
625void bar() { ::std::tr1::unordered_map<int, int> x; x.rehash(10); }
626]])], [gold_cv_unordered_map_rehash=yes], [gold_cv_unordered_map_rehash=no])])
627if test "$gold_cv_unordered_map_rehash" = "yes"; then
628  AC_DEFINE(HAVE_TR1_UNORDERED_MAP_REHASH, 1,
629	    [Define if ::std::tr1::unordered_map::rehash is usable])
630fi
631
632# Use of tr1/unordered_map with off_t as a key is not supported on GCC
633# 4.1.xx when compiling in 32-bit mode with a 64-bit off_t type.
634AC_CACHE_CHECK([whether std::tr1::hash<off_t> is defined],
635[gold_cv_hash_off_t],
636[CXXFLAGS_hold=$CXXFLAGS
637CXXFLAGS="$CXXFLAGS $LFS_CFLAGS"
638AC_COMPILE_IFELSE([
639#include <sys/types.h>
640#include <tr1/unordered_map>
641std::tr1::hash<off_t> h;
642],
643[gold_cv_hash_off_t=yes],
644[gold_cv_hash_off_t=no])
645CXXFLAGS=$CXXFLAGS_hold])
646if test "$gold_cv_hash_off_t" = "yes"; then
647   AC_DEFINE(HAVE_TR1_HASH_OFF_T, 1,
648	     [Define if std::tr1::hash<off_t> is usable])
649fi
650
651# gcc 4.3.0 doesn't recognize the printf attribute on a template
652# function.  Check for that.  This is gcc bug 35546.  This test can
653# probably be removed after the bug has been fixed for a while.
654AC_CACHE_CHECK([whether we can use attributes with template functions],
655[gold_cv_template_attribute],
656[AC_COMPILE_IFELSE([
657template<typename T> extern void foo(const char*, ...)
658  __attribute__ ((__format__ (__printf__, 1, 2)));
659template<typename T> void foo(const char* format, ...) {}
660void bar() { foo<int>("%s\n", "foo"); }
661], [gold_cv_template_attribute=yes], [gold_cv_template_attribute=no])])
662if test "$gold_cv_template_attribute" = "yes"; then
663  AC_DEFINE(HAVE_TEMPLATE_ATTRIBUTES, 1,
664	    [Define if attributes work on C++ templates])
665fi
666
667dnl Check if the system has struct stat::st_mtim.
668AC_CACHE_CHECK([for struct stat::st_mtim.],
669[gold_cv_stat_st_mtim],
670[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
671#include <sys/stat.h>
672long bar() { struct stat s; return (long)(s.st_mtim.tv_sec + s.st_mtim.tv_sec);}
673]])], [gold_cv_stat_st_mtim=yes], [gold_cv_stat_st_mtim=no])])
674if test "$gold_cv_stat_st_mtim" = "yes"; then
675  AC_DEFINE(HAVE_STAT_ST_MTIM, 1,
676	    [Define if struct stat has a field st_mtim with timespec for mtime])
677fi
678
679AC_LANG_POP(C++)
680
681AC_CHECK_HEADERS(locale.h)
682AC_CHECK_FUNCS(setlocale)
683AM_LC_MESSAGES
684
685AM_MAINTAINER_MODE
686
687AC_OUTPUT(Makefile testsuite/Makefile po/Makefile.in:po/Make-in)
688