configure.ac revision 1.1.1.8
1dnl Process this file with autoconf to produce a configure script.
2dnl
3dnl   Copyright (C) 2006-2020 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_INIT(gold, 0.1)
21AC_CONFIG_SRCDIR(gold.cc)
22
23AC_CANONICAL_TARGET
24
25AM_INIT_AUTOMAKE([no-dist parallel-tests])
26
27AM_CONFIG_HEADER(config.h:config.in)
28
29AC_USE_SYSTEM_EXTENSIONS
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
88AC_PLUGINS
89if test "$plugins" = "yes"; then
90  AC_DEFINE(ENABLE_PLUGINS, 1,
91	    [Define to enable linker plugins])
92fi
93AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes")
94
95# Decide if -z relro should be enabled in ELF linker by default.
96ac_default_ld_z_relro=unset
97# Provide a configure time option to override our default.
98AC_ARG_ENABLE(relro,
99	      AS_HELP_STRING([--enable-relro],
100	      [enable -z relro in ELF linker by default]),
101[case "${enableval}" in
102  yes)  ac_default_ld_z_relro=1 ;;
103  no)  ac_default_ld_z_relro=0 ;;
104esac])dnl
105if test "${ac_default_ld_z_relro}" = unset; then
106  ac_default_ld_z_relro=1
107fi
108AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_RELRO,
109  $ac_default_ld_z_relro,
110  [Define to 1 if you want to enable -z relro in ELF linker by default.])
111
112AC_ARG_ENABLE([targets],
113[  --enable-targets        alternative target configurations],
114[case "${enableval}" in
115  yes | "")
116    AC_MSG_ERROR([--enable-targets option must specify target names or 'all'])
117    ;;
118  no)
119    enable_targets=
120    ;;
121  *)
122    enable_targets=$enableval
123    ;;
124esac],
125[# For now, enable all targets by default
126 enable_targets=all
127])
128
129# Canonicalize the enabled targets.
130if test -n "$enable_targets"; then
131  for targ in `echo $enable_targets | sed -e 's/,/ /g'`; do
132    result=`$ac_config_sub $targ 2>/dev/null`
133    if test -n "$result"; then
134      canon_targets="$canon_targets $result"
135    else
136      # Permit unrecognized target names, like "all".
137      canon_targets="$canon_targets $targ"
138    fi
139  done
140fi
141
142# Decide which "--hash-style" to use by default
143# Provide a configure time option to override our default.
144AC_ARG_ENABLE([default-hash-style],
145AS_HELP_STRING([--enable-default-hash-style={sysv,gnu,both}],
146	       [use this default hash style]),
147[case "${enable_default_hash_style}" in
148  sysv | gnu | both) ;;
149  *) AC_MSG_ERROR([bad value ${enable_default_hash_style} for enable-default-hash-style option]) ;;
150esac],
151[case "${target}" in
152  # Enable gnu hash only on GNU targets, but not mips
153  mips*-*-*) enable_default_hash_style=sysv ;;
154  *-*-gnu* | *-*-linux* | *-*-nacl*) enable_default_hash_style=both ;;
155  *) enable_default_hash_style=sysv ;;
156esac])
157
158AC_DEFINE_UNQUOTED([DEFAULT_HASH_STYLE],
159  ["${enable_default_hash_style}"],
160  [Set the default --hash-style value])
161
162# See which specific instantiations we need.
163targetobjs=
164all_targets=
165default_machine=
166default_size=
167default_big_endian=
168default_osabi=ELFOSABI_NONE
169targ_32_little=
170targ_32_big=
171targ_64_little=
172targ_64_big=
173for targ in $target $canon_targets; do
174  if test "$targ" = "all"; then
175    targ_32_little=yes
176    targ_32_big=yes
177    targ_64_little=yes
178    targ_64_big=yes
179    all_targets=yes
180  else
181    . ${srcdir}/configure.tgt
182
183    if test "$targ_obj" = "UNKNOWN"; then
184      AC_MSG_ERROR("unsupported target $targ")
185    else
186      targetobjs="$targetobjs ${targ_obj}.\$(OBJEXT)"
187      if test "$targ_extra_obj" != ""; then
188        targetobjs="$targetobjs ${targ_extra_obj}.\$(OBJEXT)"
189      fi
190      if test "$targ_size" = "32" -o "$targ_extra_size" = "32"; then
191	  if test "$targ_big_endian" = "true" \
192	      -o "$targ_extra_big_endian" = "true"; then
193	      targ_32_big=yes
194	  fi
195	  if test "$targ_big_endian" = "false" \
196	      -o "$targ_extra_big_endian" = "false"; then
197	      targ_32_little=yes
198	  fi
199      fi
200      if test "$targ_size" = "64" -o "$targ_extra_size" = "64"; then
201	  if test "$targ_big_endian" = "true" \
202	      -o "$targ_extra_big_endian" = "true"; then
203	      targ_64_big=yes
204	  fi
205	  if test "$targ_big_endian" = "false" \
206	      -o "$targ_extra_big_endian" = "false"; then
207	      targ_64_little=yes
208	  fi
209      fi
210
211      if test "$target" = "$targ"; then
212        default_machine=$targ_machine
213	default_size=$targ_size
214	default_big_endian=$targ_big_endian
215	default_osabi=$targ_osabi
216
217	AM_CONDITIONAL(DEFAULT_TARGET_AARCH64, test "$targ_obj" = "aarch64")
218	AM_CONDITIONAL(DEFAULT_TARGET_ARM, test "$targ_obj" = "arm")
219	AM_CONDITIONAL(DEFAULT_TARGET_I386, test "$targ_obj" = "i386")
220	AM_CONDITIONAL(DEFAULT_TARGET_POWERPC, test "$targ_obj" = "powerpc")
221	AM_CONDITIONAL(DEFAULT_TARGET_SPARC, test "$targ_obj" = "sparc")
222	AM_CONDITIONAL(DEFAULT_TARGET_S390, test "$targ_obj" = "s390")
223	target_x86_64=no
224	target_x32=no
225	if test "$targ_obj" = "x86_64"; then
226	  case "$target" in
227	  x86_64*-linux-gnux32)
228	    target_x32=yes
229	    default_size=32
230	    ;;
231	  *)
232	    target_x86_64=yes
233	    ;;
234	  esac
235	fi
236	AM_CONDITIONAL(DEFAULT_TARGET_X86_64, test "$target_x86_64" = "yes")
237	AM_CONDITIONAL(DEFAULT_TARGET_X32, test "$target_x32" = "yes")
238	AM_CONDITIONAL(DEFAULT_TARGET_X86_64_OR_X32,
239		       test "$target_x86_64" = "yes" -o "$target_x32" = "yes")
240	AM_CONDITIONAL(DEFAULT_TARGET_TILEGX, test "$targ_obj" = "tilegx")
241        AM_CONDITIONAL(DEFAULT_TARGET_MIPS, test "$targ_obj" = "mips")
242	DEFAULT_TARGET=${targ_obj}
243	AC_SUBST(DEFAULT_TARGET)
244      fi
245    fi
246  fi
247done
248
249# Remove any duplicates.
250to=""
251for t in $targetobjs; do
252  case " $to " in
253  *" $t "*) ;;
254  *) to="$to $t" ;;
255  esac
256done
257targetobjs=$to
258
259if test -n "$targ_32_little"; then
260  AC_DEFINE(HAVE_TARGET_32_LITTLE, 1,
261	      [Define to support 32-bit little-endian targets])
262fi
263if test -n "$targ_32_big"; then
264  AC_DEFINE(HAVE_TARGET_32_BIG, 1,
265	      [Define to support 32-bit big-endian targets])
266fi
267if test -n "$targ_64_little"; then
268  AC_DEFINE(HAVE_TARGET_64_LITTLE, 1,
269	      [Define to support 64-bit little-endian targets])
270fi
271if test -n "$targ_64_big"; then
272  AC_DEFINE(HAVE_TARGET_64_BIG, 1,
273	      [Define to support 64-bit big-endian targets])
274fi
275
276if test -n "$all_targets"; then
277  TARGETOBJS='$(ALL_TARGETOBJS)'
278else
279  TARGETOBJS="$targetobjs"
280fi
281AC_SUBST(TARGETOBJS)
282
283AC_DEFINE_UNQUOTED(GOLD_DEFAULT_MACHINE, $default_machine,
284		   [Default machine code])
285AC_DEFINE_UNQUOTED(GOLD_DEFAULT_SIZE, $default_size,
286		   [Default size (32 or 64)])
287AC_DEFINE_UNQUOTED(GOLD_DEFAULT_BIG_ENDIAN, $default_big_endian,
288		   [Default big endian (true or false)])
289AC_DEFINE_UNQUOTED(GOLD_DEFAULT_OSABI, $default_osabi,
290		   [Default OSABI code])
291
292AC_ARG_WITH(lib-path,
293[  --with-lib-path=dir1:dir2...  set default LIB_PATH],
294[case "$withval" in
295 yes) LIB_PATH='"/lib:/usr/lib"' ;;
296 no) LIB_PATH='""' ;;
297 *) LIB_PATH='"'"$withval"'"' ;;
298 esac],
299[LIB_PATH='"::DEFAULT::"'])
300AC_DEFINE_UNQUOTED(LIB_PATH, $LIB_PATH,
301		   [Default library search path])
302if test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias"; then
303  AC_DEFINE(NATIVE_LINKER, 1, [Whether configured as a native linker])
304fi
305
306AC_CHECK_TOOL(NM, nm)
307
308AC_PROG_CC
309AC_PROG_CXX
310AC_PROG_YACC
311AC_PROG_RANLIB
312AC_PROG_INSTALL
313AC_PROG_LN_S
314
315AC_GNU_SOURCE
316
317ZW_GNU_GETTEXT_SISTER_DIR
318AM_PO_SUBDIRS
319
320AC_C_BIGENDIAN
321
322AC_EXEEXT
323
324AM_CONDITIONAL(NATIVE_LINKER,
325  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias")
326AM_CONDITIONAL(GCC, test "$GCC" = yes)
327
328AM_CONDITIONAL(NATIVE_OR_CROSS_LINKER,
329  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias" -o "x$host_alias" = "x$build_alias")
330
331dnl Test for whether static linking is supported.  Some systems do not
332dnl install static libraries.  This only affects the set of tests that
333dnl we run.
334AC_CACHE_CHECK([whether static linking works], [gold_cv_lib_static],
335[LDFLAGS_hold=$LDFLAGS
336LDFLAGS="$LDFLAGS -static"
337AC_LINK_IFELSE([
338AC_LANG_PROGRAM([[void f() { }]])],
339[gold_cv_lib_static=yes], [gold_cv_lib_static=no])
340LDFLAGS=$LDFLAGS_hold])
341AM_CONDITIONAL(HAVE_STATIC, test "$gold_cv_lib_static" = "yes")
342
343dnl Some architectures do not support taking pointers of functions
344dnl defined in shared libraries except in -fPIC mode.  We need to
345dnl tell the unittest framework if we're compiling for one of those
346dnl targets, so it doesn't try to run the tests that do that.
347AM_CONDITIONAL(FN_PTRS_IN_SO_WITHOUT_PIC, [
348  case $target_cpu in
349    powerpc*) false;;
350    x86_64) false;;
351    sparc64) false;;
352    s390x) false;;
353    *) true;;
354  esac])
355
356dnl Test for gcc 4.1 or later.  Full support for -mcmodel=medium is
357dnl only available in gcc 4.1.
358AC_CACHE_CHECK([for gcc >= 4.1], [gold_cv_prog_gcc41],
359[AC_COMPILE_IFELSE([AC_LANG_SOURCE([
360#if !defined __GNUC__
361error
362#elif __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
363error
364#endif
365])], [gold_cv_prog_gcc41=yes], [gold_cv_prog_gcc41=no])])
366
367save_CFLAGS="$CFLAGS"
368CFLAGS="$CFLAGS -mcmodel=medium"
369AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [have_mcmodel_medium=yes], [have_mcmodel_medium=no])
370CFLAGS="$save_CFLAGS"
371dnl Whether we can test -mcmodel=medium.
372AM_CONDITIONAL(MCMODEL_MEDIUM,
373[test "$target_cpu" = "x86_64" -a "$have_mcmodel_medium" = "yes" -a "$gold_cv_prog_gcc41" = "yes"])
374
375AC_CACHE_CHECK([whether $CC supports -fmerge-constants],
376	       [gold_cv_merge_constants], [
377save_CFLAGS="$CFLAGS"
378CFLAGS="$CFLAGS -fmerge-constants"
379AC_COMPILE_IFELSE([AC_LANG_SOURCE([const char *s = "foo";])],
380		  [gold_cv_merge_constants=yes],
381		  [gold_cv_merge_constants=no])
382CFLAGS="$save_CFLAGS"])
383AC_SUBST([MERGE_CONSTANTS_FLAG])
384AS_IF([test "$gold_cv_merge_constants" = yes],
385      [MERGE_CONSTANTS_FLAG=-fmerge-constants],
386      [MERGE_CONSTANTS_FLAG=])
387
388dnl Test for __thread support.
389AC_CACHE_CHECK([for thread support], [gold_cv_c_thread],
390[AC_COMPILE_IFELSE([AC_LANG_SOURCE([__thread int i = 1;])],
391[gold_cv_c_thread=yes], [gold_cv_c_thread=no])])
392
393AM_CONDITIONAL(TLS, test "$gold_cv_c_thread" = "yes")
394
395dnl On GNU/Linux TLS in static programs only works when using glibc
396dnl 2.4 or later.
397AC_CACHE_CHECK([for glibc >= 2.4], [gold_cv_lib_glibc24],
398[AC_COMPILE_IFELSE([AC_LANG_SOURCE([
399#include <features.h>
400#if !defined __GLIBC__
401error
402#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4)
403error
404#endif
405])], [gold_cv_lib_glibc24=yes], [gold_cv_lib_glibc24=no])])
406
407AM_CONDITIONAL(STATIC_TLS, test "$gold_cv_lib_glibc24" = "yes")
408
409dnl Test for #pragma omp threadprivate
410AC_CACHE_CHECK([for omp support], [gold_cv_c_threadprivate],
411[save_CFLAGS="$CFLAGS"
412CFLAGS="$CFLAGS -fopenmp"
413AC_COMPILE_IFELSE([AC_LANG_SOURCE([
414#include <omp.h>
415int i;
416#pragma omp threadprivate (i)
417])], [gold_cv_c_threadprivate=yes], [gold_cv_c_threadprivate=no])
418CFLAGS="$save_CFLAGS"])
419if test "$gold_cv_c_threadprivate" = "yes"; then
420  AC_DEFINE(HAVE_OMP_SUPPORT, 1,
421	    [Define if compiler supports #pragma omp threadprivate])
422fi
423AM_CONDITIONAL(OMP_SUPPORT, test "$gold_cv_c_threadprivate" = "yes")
424
425dnl Test for the -ftls-dialect=gnu2 option.
426dnl Use -Werror in case of compilers that make unknown -m options warnings.
427dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS
428dnl gets set later by default Autoconf magic to include -Werror.  (We are
429dnl assuming here that there is no compiler that groks -mtls-dialect=gnu2
430dnl but does not grok -Werror.)
431save_CFLAGS="$CFLAGS"
432CFLAGS="$CFLAGS -Werror -fpic -mtls-dialect=gnu2"
433AC_COMPILE_IFELSE([AC_LANG_SOURCE([
434__thread int i;
435void foo (void)
436{
437  i = 10;
438}
439])], [have_tls_gnu2=yes], [have_tls_gnu2=no])
440CFLAGS="$save_CFLAGS"
441AM_CONDITIONAL(TLS_GNU2_DIALECT, test "$have_tls_gnu2" = "yes")
442
443dnl On GNU/Linux TLS descriptors are supported by the dynamic loader
444dnl only with glibc 2.9 or later.
445AC_CACHE_CHECK([for glibc >= 2.9], [gold_cv_lib_glibc29],
446[AC_COMPILE_IFELSE([AC_LANG_SOURCE([
447#include <features.h>
448#if !defined __GLIBC__
449error
450#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 9)
451error
452#endif
453])], [gold_cv_lib_glibc29=yes], [gold_cv_lib_glibc29=no])])
454
455AM_CONDITIONAL(TLS_DESCRIPTORS, test "$gold_cv_lib_glibc29" = "yes")
456
457dnl Test for the -frandom-seed option.
458AC_CACHE_CHECK([for -frandom-seed support], [gold_cv_c_random_seed],
459[save_CFLAGS="$CFLAGS"
460CFLAGS="$CFLAGS -frandom-seed=foo"
461AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [gold_cv_c_random_seed=yes],
462[gold_cv_c_random_seed=no])
463CFLAGS="$save_CFLAGS"])
464if test "$gold_cv_c_random_seed" = "yes"; then
465  # In Makefile, '$@' will be expanded to be the name of the file
466  # being built, providing a unique seed for each file.
467  RANDOM_SEED_CFLAGS=-frandom-seed=\$@
468fi
469AC_SUBST(RANDOM_SEED_CFLAGS)
470
471dnl On GNU/Linux ifunc is supported by the dynamic linker in glibc
472dnl 2.11 or later, and by binutils 2.20.1 or later.
473AC_CACHE_CHECK([for glibc ifunc support], [gold_cv_lib_glibc_ifunc],
474[save_LDFLAGS="$LDFLAGS"
475LDFLAGS="$LDFLAGS -static"
476AC_LINK_IFELSE([AC_LANG_PROGRAM([[
477#include <features.h>
478#if !defined __GLIBC__
479error
480#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 11)
481error
482#endif
483void func (void) { }
484void invoke (void);
485__asm__(".type invoke, %gnu_indirect_function");
486typedef void (*funcptr) (void);
487funcptr dispatch (void) __asm__ ("invoke");
488funcptr dispatch (void) { return &func; }]],
489[[invoke();]])
490], [
491if ${NM} conftest$EXEEXT | grep "__rela\?_iplt_start" >/dev/null 2>&1; then
492  gold_cv_lib_glibc_ifunc=both
493else
494  gold_cv_lib_glibc_ifunc=dyn
495fi], [gold_cv_lib_glibc_ifunc=no])
496LDFLAGS="$save_LDFLAGS"])
497
498AM_CONDITIONAL(IFUNC, test "$gold_cv_lib_glibc_ifunc" != "no")
499AM_CONDITIONAL(IFUNC_STATIC, test "$gold_cv_lib_glibc_ifunc" = "both")
500
501AM_BINUTILS_WARNINGS
502
503WARN_CXXFLAGS=`echo ${WARN_CFLAGS} | sed -e 's/-Wstrict-prototypes//' -e 's/-Wmissing-prototypes//' -e 's/-Wshadow//'`
504AC_SUBST(WARN_CXXFLAGS)
505
506AC_ARG_WITH(gold-ldflags,
507[  --with-gold-ldflags=FLAGS  additional link flags for gold],
508[if test "$withval" = "no" -o "$withval" = "yes"; then
509   GOLD_LDFLAGS=
510 else
511   GOLD_LDFLAGS=$withval
512 fi],
513[GOLD_LDFLAGS=])
514AC_SUBST(GOLD_LDFLAGS)
515
516AC_ARG_WITH(gold-ldadd,
517[  --with-gold-ldadd=LIBS     additional libraries for gold],
518[if test "$withval" = "no" -o "$withval" = "yes"; then
519   GOLD_LDADD=
520 else
521   GOLD_LDADD=$withval
522 fi],
523[GOLD_LDADD=])
524AC_SUBST(GOLD_LDADD)
525
526dnl Force support for large files by default.  This may need to be
527dnl host dependent.  If build == host, we can check getconf LFS_CFLAGS.
528LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
529AC_SUBST(LFS_CFLAGS)
530
531AC_CHECK_HEADERS(sys/mman.h)
532AC_CHECK_FUNCS(chsize mmap link)
533AC_REPLACE_FUNCS(pread ftruncate ffsll)
534
535AC_CACHE_CHECK([mremap with MREMAP_MAYMOVE], [gold_cv_lib_mremap_maymove],
536[AC_LINK_IFELSE([
537AC_LANG_PROGRAM([[
538#include <sys/mman.h>
539void f() { mremap (0, 0, 0, MREMAP_MAYMOVE); }
540]])], [gold_cv_lib_mremap_maymove=yes], [gold_cv_lib_mremap_maymove=no])])
541if test "$gold_cv_lib_mremap_maymove" = "yes"; then
542  AC_DEFINE(HAVE_MREMAP, 1,
543    [Define to 1 if you have the mremap function with MREMAP_MAYMOVE support])
544else
545  AC_LIBOBJ(mremap)
546fi
547
548# Link in zlib if we can.  This allows us to write compressed sections.
549AM_ZLIB
550
551AC_ARG_ENABLE([threads],
552[[  --enable-threads[=ARG]  multi-threaded linking [ARG={auto,yes,no}]]],
553[case "${enableval}" in
554  yes | "") threads=yes ;;
555  no) threads=no ;;
556  auto) threads=auto ;;
557  *) threads=yes ;;
558 esac],
559[threads=auto])
560
561if test "$threads" = "yes"; then
562  AX_PTHREAD([threads=yes], AC_MSG_ERROR([pthread not found]))
563elif test "$threads" = "auto"; then
564  AX_PTHREAD([threads=yes], [threads=no])
565fi
566
567if test "$threads" = "yes"; then
568  AC_DEFINE(ENABLE_THREADS, 1,
569	    [Define to do multi-threaded linking])
570fi
571AM_CONDITIONAL(THREADS, test "$threads" = "yes")
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([AC_LANG_SOURCE([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([AC_LANG_SOURCE([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 mkdtemp)
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([AC_LANG_SOURCE([
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([AC_LANG_SOURCE([
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