xref: /netbsd-src/external/gpl3/binutils/dist/gold/configure.ac (revision a4ddc2c8fb9af816efe3b1c375a5530aef0e89e9)
1dnl Process this file with autoconf to produce a configure script.
2
3AC_PREREQ(2.59)
4
5AC_INIT(gold, 0.1)
6AC_CONFIG_SRCDIR(gold.cc)
7
8AC_CANONICAL_TARGET
9
10AM_INIT_AUTOMAKE([no-dist parallel-tests])
11
12AM_CONFIG_HEADER(config.h:config.in)
13
14AC_ARG_WITH(sysroot,
15[  --with-sysroot[=DIR]    search for usr/lib et al within DIR],
16[sysroot=$withval], [sysroot=no])
17
18if test "$sysroot" = "yes"; then
19  sysroot='${exec_prefix}/${target_alias}/sys-root'
20elif test "$sysroot" = "no"; then
21  sysroot=
22fi
23
24sysroot_relocatable=0
25if test -n "$sysroot"; then
26  case "sysroot" in
27    "${prefix}" | "${prefix}/"* | \
28    "${exec_prefix}" | "${exec_prefix}/"* | \
29    '${prefix}' | '${prefix}/'*| \
30    '${exec_prefix}' | '${exec_prefix}/'*)
31      sysroot_relocatable=1
32      ;;
33  esac
34fi
35
36AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT, "$sysroot",
37  [System root for target files])
38AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT_RELOCATABLE, $sysroot_relocatable,
39  [Whether the system root can be relocated])
40
41dnl "install_as_default" is true if the linker to be installed as the
42dnl default linker, ld.
43dnl "installed_linker" is the installed gold linker name.
44
45default_ld=
46AC_ARG_ENABLE(ld,
47[[  --enable-ld[=ARG]     build ld [ARG={default,yes,no}]]],
48[case "${enableval}" in
49  default)
50    default_ld=ld.bfd
51    ;;
52esac])
53
54AC_ARG_ENABLE(gold,
55[[  --enable-gold[=ARG]     build gold [ARG={default,yes,no}]]],
56[case "${enableval}" in
57 yes|default)
58   if test x${default_ld} = x; then
59     install_as_default=yes
60   fi
61   installed_linker=ld.gold
62   ;;
63 no)
64   ;;
65 *)
66   AC_MSG_ERROR([invalid --enable-gold argument])
67   ;;
68 esac],
69[install_as_default=no
70 installed_linker=ld.gold])
71AC_SUBST(install_as_default)
72AC_SUBST(installed_linker)
73
74dnl For now threads are a configure time option.
75AC_ARG_ENABLE([threads],
76[  --enable-threads        multi-threaded linking],
77[case "${enableval}" in
78  yes | "") threads=yes ;;
79  no) threads=no ;;
80  *) threads=yes ;;
81 esac],
82[threads=no])
83if test "$threads" = "yes"; then
84  AC_DEFINE(ENABLE_THREADS, 1,
85	    [Define to do multi-threaded linking])
86fi
87AM_CONDITIONAL(THREADS, test "$threads" = "yes")
88
89AC_ARG_ENABLE([plugins],
90[  --enable-plugins        linker plugins],
91[case "${enableval}" in
92  yes | "") plugins=yes ;;
93  no) plugins=no ;;
94  *) plugins=yes ;;
95 esac],
96[plugins=no])
97if test "$plugins" = "yes"; then
98  AC_DEFINE(ENABLE_PLUGINS, 1,
99	    [Define to enable linker plugins])
100fi
101AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes")
102
103AC_ARG_ENABLE([targets],
104[  --enable-targets        alternative target configurations],
105[case "${enableval}" in
106  yes | "")
107    AC_MSG_ERROR([--enable-targets option must specify target names or 'all'])
108    ;;
109  no)
110    enable_targets=
111    ;;
112  *)
113    enable_targets=$enableval
114    ;;
115esac],
116[# For now, enable all targets by default
117 enable_targets=all
118])
119
120# Canonicalize the enabled targets.
121if test -n "$enable_targets"; then
122  for targ in `echo $enable_targets | sed -e 's/,/ /g'`; do
123    result=`$ac_config_sub $targ 2>/dev/null`
124    if test -n "$result"; then
125      canon_targets="$canon_targets $result"
126    else
127      # Permit unrecognized target names, like "all".
128      canon_targets="$canon_targets $targ"
129    fi
130  done
131fi
132
133# See which specific instantiations we need.
134targetobjs=
135all_targets=
136default_machine=
137default_size=
138default_big_endian=
139default_osabi=ELFOSABI_NONE
140targ_32_little=
141targ_32_big=
142targ_64_little=
143targ_64_big=
144for targ in $target $canon_targets; do
145  if test "$targ" = "all"; then
146    targ_32_little=yes
147    targ_32_big=yes
148    targ_64_little=yes
149    targ_64_big=yes
150    all_targets=yes
151  else
152    . ${srcdir}/configure.tgt
153
154    if test "$targ_obj" = "UNKNOWN"; then
155      AC_MSG_ERROR("unsupported target $targ")
156    else
157      targetobjs="$targetobjs ${targ_obj}.\$(OBJEXT)"
158      if test "$targ_extra_obj" != ""; then
159        targetobjs="$targetobjs ${targ_extra_obj}.\$(OBJEXT)"
160      fi
161      if test "$targ_size" = "32" -o "$targ_extra_size" = "32"; then
162	  if test "$targ_big_endian" = "true" \
163	      -o "$targ_extra_big_endian" = "true"; then
164	      targ_32_big=yes
165	  fi
166	  if test "$targ_big_endian" = "false" \
167	      -o "$targ_extra_big_endian" = "false"; then
168	      targ_32_little=yes
169	  fi
170      fi
171      if test "$targ_size" = "64" -o "$targ_extra_size" = "64"; then
172	  if test "$targ_big_endian" = "true" \
173	      -o "$targ_extra_big_endian" = "true"; then
174	      targ_64_big=yes
175	  fi
176	  if test "$targ_big_endian" = "false" \
177	      -o "$targ_extra_big_endian" = "false"; then
178	      targ_64_little=yes
179	  fi
180      fi
181
182      if test "$target" = "$targ"; then
183        default_machine=$targ_machine
184	default_size=$targ_size
185	default_big_endian=$targ_big_endian
186	default_osabi=$targ_osabi
187
188	AM_CONDITIONAL(DEFAULT_TARGET_ARM, test "$targ_obj" = "arm")
189	AM_CONDITIONAL(DEFAULT_TARGET_I386, test "$targ_obj" = "i386")
190	AM_CONDITIONAL(DEFAULT_TARGET_POWERPC, test "$targ_obj" = "powerpc")
191	AM_CONDITIONAL(DEFAULT_TARGET_SPARC, test "$targ_obj" = "sparc")
192	AM_CONDITIONAL(DEFAULT_TARGET_X86_64, test "$targ_obj" = "x86_64")
193      fi
194    fi
195  fi
196done
197
198# Remove any duplicates.
199to=""
200for t in $targetobjs; do
201  case " $to " in
202  *" $t "*) ;;
203  *) to="$to $t" ;;
204  esac
205done
206targetobjs=$to
207
208if test -n "$targ_32_little"; then
209  AC_DEFINE(HAVE_TARGET_32_LITTLE, 1,
210	      [Define to support 32-bit little-endian targets])
211fi
212if test -n "$targ_32_big"; then
213  AC_DEFINE(HAVE_TARGET_32_BIG, 1,
214	      [Define to support 32-bit big-endian targets])
215fi
216if test -n "$targ_64_little"; then
217  AC_DEFINE(HAVE_TARGET_64_LITTLE, 1,
218	      [Define to support 64-bit little-endian targets])
219fi
220if test -n "$targ_64_big"; then
221  AC_DEFINE(HAVE_TARGET_64_BIG, 1,
222	      [Define to support 64-bit big-endian targets])
223fi
224
225if test -n "$all_targets"; then
226  TARGETOBJS='$(ALL_TARGETOBJS)'
227else
228  TARGETOBJS="$targetobjs"
229fi
230AC_SUBST(TARGETOBJS)
231
232AC_DEFINE_UNQUOTED(GOLD_DEFAULT_MACHINE, $default_machine,
233		   [Default machine code])
234AC_DEFINE_UNQUOTED(GOLD_DEFAULT_SIZE, $default_size,
235		   [Default size (32 or 64)])
236AC_DEFINE_UNQUOTED(GOLD_DEFAULT_BIG_ENDIAN, $default_big_endian,
237		   [Default big endian (true or false)])
238AC_DEFINE_UNQUOTED(GOLD_DEFAULT_OSABI, $default_osabi,
239		   [Default OSABI code])
240
241AC_PROG_CC
242AC_PROG_CXX
243AC_PROG_YACC
244AC_PROG_RANLIB
245AC_PROG_INSTALL
246AC_PROG_LN_S
247
248AC_GNU_SOURCE
249
250ZW_GNU_GETTEXT_SISTER_DIR
251AM_PO_SUBDIRS
252
253AC_C_BIGENDIAN
254
255AC_EXEEXT
256
257AM_CONDITIONAL(NATIVE_LINKER,
258  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias")
259AM_CONDITIONAL(GCC, test "$GCC" = yes)
260
261AM_CONDITIONAL(NATIVE_OR_CROSS_LINKER,
262  test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias" -o "x$host_alias" = "x$build_alias")
263
264dnl Some architectures do not support taking pointers of functions
265dnl defined in shared libraries except in -fPIC mode.  We need to
266dnl tell the unittest framework if we're compiling for one of those
267dnl targets, so it doesn't try to run the tests that do that.
268AM_CONDITIONAL(FN_PTRS_IN_SO_WITHOUT_PIC, [
269  case $target_cpu in
270    i?86) true;;
271    x86_64) false;;
272    sparc64) false;;
273    *) true;;
274  esac])
275
276dnl Test for gcc 4.1 or later.  Full support for -mcmodel=medium is
277dnl only available in gcc 4.1.
278AC_CACHE_CHECK([for gcc >= 4.1], [gold_cv_prog_gcc41],
279[AC_COMPILE_IFELSE([
280#if !defined __GNUC__
281error
282#elif __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1)
283error
284#endif
285], [gold_cv_prog_gcc41=yes], [gold_cv_prog_gcc41=no])])
286
287dnl Whether we can test -mcmodel=medium.
288AM_CONDITIONAL(MCMODEL_MEDIUM,
289[test "$target_cpu" = "x86_64" -a "$gold_cv_prog_gcc41" = "yes"])
290
291dnl Test for __thread support.
292AC_CACHE_CHECK([for thread support], [gold_cv_c_thread],
293[AC_COMPILE_IFELSE([__thread int i = 1;],
294[gold_cv_c_thread=yes], [gold_cv_c_thread=no])])
295
296AM_CONDITIONAL(TLS, test "$gold_cv_c_thread" = "yes")
297
298dnl On GNU/Linux TLS in static programs only works when using glibc
299dnl 2.4 or later.
300AC_CACHE_CHECK([for glibc >= 2.4], [gold_cv_lib_glibc24],
301[AC_COMPILE_IFELSE([
302#include <features.h>
303#if !defined __GLIBC__
304error
305#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4)
306error
307#endif
308], [gold_cv_lib_glibc24=yes], [gold_cv_lib_glibc24=no])])
309
310AM_CONDITIONAL(STATIC_TLS, test "$gold_cv_lib_glibc24" = "yes")
311
312dnl Test for #pragma omp threadprivate
313AC_CACHE_CHECK([for omp support], [gold_cv_c_threadprivate],
314[save_CFLAGS="$CFLAGS"
315CFLAGS="$CFLAGS -fopenmp"
316AC_COMPILE_IFELSE([
317#include <omp.h>
318int i;
319#pragma omp threadprivate (i)
320], [gold_cv_c_threadprivate=yes], [gold_cv_c_threadprivate=no])
321CFLAGS="$save_CFLAGS"])
322if test "$gold_cv_c_threadprivate" = "yes"; then
323  AC_DEFINE(HAVE_OMP_SUPPORT, 1,
324	    [Define if compiler supports #pragma omp threadprivate])
325fi
326AM_CONDITIONAL(OMP_SUPPORT, test "$gold_cv_c_threadprivate" = "yes")
327
328dnl Test for the -ftls-dialect=gnu2 option.
329save_CFLAGS="$CFLAGS"
330CFLAGS="$CFLAGS -mtls-dialect=gnu2"
331AC_COMPILE_IFELSE([int i;], [have_tls_gnu2=yes], [have_tls_gnu2=no])
332CFLAGS="$save_CFLAGS"
333AM_CONDITIONAL(TLS_GNU2_DIALECT, test "$have_tls_gnu2" = "yes")
334
335dnl On GNU/Linux TLS descriptors are supported by the dynamic loader
336dnl only with glibc 2.9 or later.
337AC_CACHE_CHECK([for glibc >= 2.9], [gold_cv_lib_glibc29],
338[AC_COMPILE_IFELSE([
339#include <features.h>
340#if !defined __GLIBC__
341error
342#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 9)
343error
344#endif
345], [gold_cv_lib_glibc29=yes], [gold_cv_lib_glibc29=no])])
346
347AM_CONDITIONAL(TLS_DESCRIPTORS, test "$gold_cv_lib_glibc29" = "yes")
348
349dnl Check whether the compiler supports constructor priorities in
350dnl attributes, which were added in gcc 4.3.
351AC_CACHE_CHECK([for constructor priorities], [gold_cv_c_conprio],
352[AC_COMPILE_IFELSE([void f() __attribute__ ((constructor (1)));],
353[gold_cv_c_conprio=yes], [gold_cv_c_conprio=no])])
354
355AM_CONDITIONAL(CONSTRUCTOR_PRIORITY, test "$gold_cv_c_conprio" = "yes")
356
357dnl Test for the -frandom-seed option.
358AC_CACHE_CHECK([for -frandom-seed support], [gold_cv_c_random_seed],
359[save_CFLAGS="$CFLAGS"
360CFLAGS="$CFLAGS -frandom-seed=foo"
361AC_COMPILE_IFELSE([int i;], [gold_cv_c_random_seed=yes],
362[gold_cv_c_random_seed=no])
363CFLAGS="$save_CFLAGS"])
364if test "$gold_cv_c_random_seed" = "yes"; then
365  # In Makefile, '$@' will be expanded to be the name of the file
366  # being built, providing a unique seed for each file.
367  RANDOM_SEED_CFLAGS=-frandom-seed=\$@
368fi
369AC_SUBST(RANDOM_SEED_CFLAGS)
370
371dnl On GNU/Linux ifunc is supported by the dynamic linker in glibc
372dnl 2.11 or later, and by binutils 2.20.1 or later.
373AC_CACHE_CHECK([for glibc >= 2.11], [gold_cv_lib_glibc2_11],
374[AC_COMPILE_IFELSE([
375#include <features.h>
376#if !defined __GLIBC__
377error
378#elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 11)
379error
380#endif
381__asm__(".type foo, %gnu_indirect_function");
382], [gold_cv_lib_glibc2_11=yes], [gold_cv_lib_glibc2_11=no])])
383
384AM_CONDITIONAL(IFUNC, test "$gold_cv_lib_glibc2_11" = "yes")
385
386AM_BINUTILS_WARNINGS
387
388WARN_CXXFLAGS=`echo ${WARN_CFLAGS} | sed -e 's/-Wstrict-prototypes//' -e 's/-Wmissing-prototypes//' -e 's/-Wshadow//'`
389AC_SUBST(WARN_CXXFLAGS)
390
391dnl Force support for large files by default.  This may need to be
392dnl host dependent.  If build == host, we can check getconf LFS_CFLAGS.
393LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
394AC_SUBST(LFS_CFLAGS)
395
396AC_CHECK_FUNCS(chsize)
397AC_REPLACE_FUNCS(pread ftruncate mremap ffsll)
398
399# Link in zlib if we can.  This allows us to write compressed sections.
400AC_SEARCH_LIBS(zlibVersion, z, [AC_CHECK_HEADERS(zlib.h)])
401AM_CONDITIONAL(HAVE_ZLIB, test "$ac_cv_search_zlibVersion" != "no")
402
403dnl We have to check these in C, not C++, because autoconf generates
404dnl tests which have no type information, and current glibc provides
405dnl multiple declarations of functions like basename when compiling
406dnl with C++.
407AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp])
408
409AC_LANG_PUSH(C++)
410
411AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map)
412AC_CHECK_HEADERS(ext/hash_map ext/hash_set)
413AC_CHECK_HEADERS(byteswap.h)
414AC_CHECK_FUNCS(mallinfo posix_fallocate readv sysconf times)
415AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp, strndup, memmem])
416
417# Use of ::std::tr1::unordered_map::rehash causes undefined symbols
418# at link time with some versions of GCC.
419AC_CACHE_CHECK([whether ::std::tr1::unordered_map::rehash is usable.],
420[gold_cv_unordered_map_rehash],
421[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
422#include <tr1/unordered_map>
423void bar() { ::std::tr1::unordered_map<int, int> x; x.rehash(10); }
424]])], [gold_cv_unordered_map_rehash=yes], [gold_cv_unordered_map_rehash=no])])
425if test "$gold_cv_unordered_map_rehash" = "yes"; then
426  AC_DEFINE(HAVE_TR1_UNORDERED_MAP_REHASH, 1,
427	    [Define if ::std::tr1::unordered_map::rehash is usable])
428fi
429
430# gcc 4.3.0 doesn't recognize the printf attribute on a template
431# function.  Check for that.  This is gcc bug 35546.  This test can
432# probably be removed after the bug has been fixed for a while.
433AC_CACHE_CHECK([whether we can use attributes with template functions],
434[gold_cv_template_attribute],
435[AC_COMPILE_IFELSE([
436template<typename T> extern void foo(const char*, ...)
437  __attribute__ ((__format__ (__printf__, 1, 2)));
438template<typename T> void foo(const char* format, ...) {}
439void bar() { foo<int>("%s\n", "foo"); }
440], [gold_cv_template_attribute=yes], [gold_cv_template_attribute=no])])
441if test "$gold_cv_template_attribute" = "yes"; then
442  AC_DEFINE(HAVE_TEMPLATE_ATTRIBUTES, 1,
443	    [Define if attributes work on C++ templates])
444fi
445
446dnl Check if the system has struct stat::st_mtim.
447AC_CACHE_CHECK([for struct stat::st_mtim.],
448[gold_cv_stat_st_mtim],
449[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
450#include <sys/stat.h>
451long bar() { struct stat s; return (long)(s.st_mtim.tv_sec + s.st_mtim.tv_sec);}
452]])], [gold_cv_stat_st_mtim=yes], [gold_cv_stat_st_mtim=no])])
453if test "$gold_cv_stat_st_mtim" = "yes"; then
454  AC_DEFINE(HAVE_STAT_ST_MTIM, 1,
455	    [Define if struct stat has a field st_mtim with timespec for mtime])
456fi
457
458AC_LANG_POP(C++)
459
460AM_MAINTAINER_MODE
461
462AC_OUTPUT(Makefile testsuite/Makefile po/Makefile.in:po/Make-in)
463