| dnl Process this file with autoconf to produce a configure script. |
| dnl |
| dnl Copyright (C) 2006-2024 Free Software Foundation, Inc. |
| dnl |
| dnl This file is free software; you can redistribute it and/or modify |
| dnl it under the terms of the GNU General Public License as published by |
| dnl the Free Software Foundation; either version 3 of the License, or |
| dnl (at your option) any later version. |
| dnl |
| dnl This program is distributed in the hope that it will be useful, |
| dnl but WITHOUT ANY WARRANTY; without even the implied warranty of |
| dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| dnl GNU General Public License for more details. |
| dnl |
| dnl You should have received a copy of the GNU General Public License |
| dnl along with this program; see the file COPYING3. If not see |
| dnl <http://www.gnu.org/licenses/>. |
| dnl |
| |
| AC_INIT([gold], [0.1]) |
| AC_CONFIG_SRCDIR(gold.cc) |
| |
| AC_CANONICAL_TARGET |
| |
| AM_INIT_AUTOMAKE([no-dist parallel-tests]) |
| AM_SILENT_RULES([yes]) |
| |
| AM_CONFIG_HEADER(config.h:config.in) |
| |
| AC_USE_SYSTEM_EXTENSIONS |
| |
| # PR 14072 |
| AH_VERBATIM([00_CONFIG_H_CHECK], |
| [/* Check that config.h is #included before system headers |
| (this works only for glibc, but that should be enough). */ |
| #if defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__CONFIG_H__) |
| # error config.h must be #included before system headers |
| #endif |
| #define __CONFIG_H__ 1]) |
| |
| AC_ARG_WITH(sysroot, |
| [ --with-sysroot[=DIR] search for usr/lib et al within DIR], |
| [sysroot=$withval], [sysroot=no]) |
| |
| if test "$sysroot" = "yes"; then |
| sysroot='${exec_prefix}/${target_alias}/sys-root' |
| elif test "$sysroot" = "no"; then |
| sysroot= |
| fi |
| |
| sysroot_relocatable=0 |
| if test -n "$sysroot"; then |
| case "$sysroot" in |
| "${prefix}" | "${prefix}/"* | \ |
| "${exec_prefix}" | "${exec_prefix}/"* | \ |
| '${prefix}' | '${prefix}/'*| \ |
| '${exec_prefix}' | '${exec_prefix}/'*) |
| sysroot_relocatable=1 |
| ;; |
| esac |
| fi |
| |
| AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT, "$sysroot", |
| [System root for target files]) |
| AC_DEFINE_UNQUOTED(TARGET_SYSTEM_ROOT_RELOCATABLE, $sysroot_relocatable, |
| [Whether the system root can be relocated]) |
| |
| dnl "install_as_default" is true if the linker to be installed as the |
| dnl default linker, ld. |
| dnl "installed_linker" is the installed gold linker name. |
| |
| installed_linker=ld.gold |
| AC_ARG_ENABLE(gold, |
| [[ --enable-gold[=ARG] build gold [ARG={default,yes,no}]]], |
| [case "${enableval}" in |
| default) |
| install_as_default=yes |
| ;; |
| yes) |
| if test x${enable_ld} = xno; then |
| install_as_default=yes |
| fi |
| ;; |
| esac], |
| [install_as_default=no]) |
| AC_SUBST(install_as_default) |
| AC_SUBST(installed_linker) |
| |
| AC_PLUGINS |
| if test "$plugins" = "yes"; then |
| AC_DEFINE(ENABLE_PLUGINS, 1, |
| [Define to enable linker plugins]) |
| fi |
| AM_CONDITIONAL(PLUGINS, test "$plugins" = "yes") |
| |
| # Decide if -z relro should be enabled in ELF linker by default. |
| ac_default_ld_z_relro=unset |
| # Provide a configure time option to override our default. |
| AC_ARG_ENABLE(relro, |
| AS_HELP_STRING([--enable-relro], |
| [enable -z relro in ELF linker by default]), |
| [case "${enableval}" in |
| yes) ac_default_ld_z_relro=1 ;; |
| no) ac_default_ld_z_relro=0 ;; |
| esac])dnl |
| if test "${ac_default_ld_z_relro}" = unset; then |
| ac_default_ld_z_relro=1 |
| fi |
| AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_RELRO, |
| $ac_default_ld_z_relro, |
| [Define to 1 if you want to enable -z relro in ELF linker by default.]) |
| |
| AC_ARG_ENABLE([targets], |
| [ --enable-targets alternative target configurations], |
| [case "${enableval}" in |
| yes | "") |
| AC_MSG_ERROR([--enable-targets option must specify target names or 'all']) |
| ;; |
| no) |
| enable_targets= |
| ;; |
| *) |
| enable_targets=$enableval |
| ;; |
| esac], |
| [# For now, enable all targets by default |
| enable_targets=all |
| ]) |
| |
| # Canonicalize the enabled targets. |
| if test -n "$enable_targets"; then |
| for targ in `echo $enable_targets | sed -e 's/,/ /g'`; do |
| result=`$ac_config_sub $targ 2>/dev/null` |
| if test -n "$result"; then |
| canon_targets="$canon_targets $result" |
| else |
| # Permit unrecognized target names, like "all". |
| canon_targets="$canon_targets $targ" |
| fi |
| done |
| fi |
| |
| # Decide which "--hash-style" to use by default |
| # Provide a configure time option to override our default. |
| AC_ARG_ENABLE([default-hash-style], |
| AS_HELP_STRING([--enable-default-hash-style={sysv,gnu,both}], |
| [use this default hash style]), |
| [case "${enable_default_hash_style}" in |
| sysv | gnu | both) ;; |
| *) AC_MSG_ERROR([bad value ${enable_default_hash_style} for enable-default-hash-style option]) ;; |
| esac], |
| [case "${target}" in |
| # Enable gnu hash only on GNU targets, but not mips |
| mips*-*-*) enable_default_hash_style=sysv ;; |
| *-*-gnu* | *-*-linux* | *-*-nacl*) enable_default_hash_style=both ;; |
| *) enable_default_hash_style=sysv ;; |
| esac]) |
| |
| AC_DEFINE_UNQUOTED([DEFAULT_HASH_STYLE], |
| ["${enable_default_hash_style}"], |
| [Set the default --hash-style value]) |
| |
| # See which specific instantiations we need. |
| targetobjs= |
| all_targets= |
| default_machine= |
| default_size= |
| default_big_endian= |
| default_osabi=ELFOSABI_NONE |
| targ_32_little= |
| targ_32_big= |
| targ_64_little= |
| targ_64_big= |
| for targ in $target $canon_targets; do |
| if test "$targ" = "all"; then |
| targ_32_little=yes |
| targ_32_big=yes |
| targ_64_little=yes |
| targ_64_big=yes |
| all_targets=yes |
| else |
| . ${srcdir}/configure.tgt |
| |
| if test "$targ_obj" = "UNKNOWN"; then |
| AC_MSG_ERROR("unsupported target $targ") |
| else |
| targetobjs="$targetobjs ${targ_obj}.\$(OBJEXT)" |
| if test "$targ_extra_obj" != ""; then |
| targetobjs="$targetobjs ${targ_extra_obj}.\$(OBJEXT)" |
| fi |
| if test "$targ_size" = "32" -o "$targ_extra_size" = "32"; then |
| if test "$targ_big_endian" = "true" \ |
| -o "$targ_extra_big_endian" = "true"; then |
| targ_32_big=yes |
| fi |
| if test "$targ_big_endian" = "false" \ |
| -o "$targ_extra_big_endian" = "false"; then |
| targ_32_little=yes |
| fi |
| fi |
| if test "$targ_size" = "64" -o "$targ_extra_size" = "64"; then |
| if test "$targ_big_endian" = "true" \ |
| -o "$targ_extra_big_endian" = "true"; then |
| targ_64_big=yes |
| fi |
| if test "$targ_big_endian" = "false" \ |
| -o "$targ_extra_big_endian" = "false"; then |
| targ_64_little=yes |
| fi |
| fi |
| |
| if test "$target" = "$targ"; then |
| default_machine=$targ_machine |
| default_size=$targ_size |
| default_big_endian=$targ_big_endian |
| default_osabi=$targ_osabi |
| |
| AM_CONDITIONAL(DEFAULT_TARGET_AARCH64, test "$targ_obj" = "aarch64") |
| AM_CONDITIONAL(DEFAULT_TARGET_ARM, test "$targ_obj" = "arm") |
| AM_CONDITIONAL(DEFAULT_TARGET_I386, test "$targ_obj" = "i386") |
| AM_CONDITIONAL(DEFAULT_TARGET_POWERPC, test "$targ_obj" = "powerpc") |
| AM_CONDITIONAL(DEFAULT_TARGET_SPARC, test "$targ_obj" = "sparc") |
| AM_CONDITIONAL(DEFAULT_TARGET_S390, test "$targ_obj" = "s390") |
| target_x86_64=no |
| target_x32=no |
| if test "$targ_obj" = "x86_64"; then |
| case "$target" in |
| x86_64*-linux-gnux32) |
| target_x32=yes |
| default_size=32 |
| ;; |
| *) |
| target_x86_64=yes |
| ;; |
| esac |
| fi |
| AM_CONDITIONAL(DEFAULT_TARGET_X86_64, test "$target_x86_64" = "yes") |
| AM_CONDITIONAL(DEFAULT_TARGET_X32, test "$target_x32" = "yes") |
| AM_CONDITIONAL(DEFAULT_TARGET_X86_64_OR_X32, |
| test "$target_x86_64" = "yes" -o "$target_x32" = "yes") |
| AM_CONDITIONAL(DEFAULT_TARGET_TILEGX, test "$targ_obj" = "tilegx") |
| AM_CONDITIONAL(DEFAULT_TARGET_MIPS, test "$targ_obj" = "mips") |
| DEFAULT_TARGET=${targ_obj} |
| AC_SUBST(DEFAULT_TARGET) |
| fi |
| fi |
| fi |
| done |
| |
| # Remove any duplicates. |
| to="" |
| for t in $targetobjs; do |
| case " $to " in |
| *" $t "*) ;; |
| *) to="$to $t" ;; |
| esac |
| done |
| targetobjs=$to |
| |
| if test -n "$targ_32_little"; then |
| AC_DEFINE(HAVE_TARGET_32_LITTLE, 1, |
| [Define to support 32-bit little-endian targets]) |
| fi |
| if test -n "$targ_32_big"; then |
| AC_DEFINE(HAVE_TARGET_32_BIG, 1, |
| [Define to support 32-bit big-endian targets]) |
| fi |
| if test -n "$targ_64_little"; then |
| AC_DEFINE(HAVE_TARGET_64_LITTLE, 1, |
| [Define to support 64-bit little-endian targets]) |
| fi |
| if test -n "$targ_64_big"; then |
| AC_DEFINE(HAVE_TARGET_64_BIG, 1, |
| [Define to support 64-bit big-endian targets]) |
| fi |
| |
| if test -n "$all_targets"; then |
| TARGETOBJS='$(ALL_TARGETOBJS)' |
| else |
| TARGETOBJS="$targetobjs" |
| fi |
| AC_SUBST(TARGETOBJS) |
| |
| AC_DEFINE_UNQUOTED(GOLD_DEFAULT_MACHINE, $default_machine, |
| [Default machine code]) |
| AC_DEFINE_UNQUOTED(GOLD_DEFAULT_SIZE, $default_size, |
| [Default size (32 or 64)]) |
| AC_DEFINE_UNQUOTED(GOLD_DEFAULT_BIG_ENDIAN, $default_big_endian, |
| [Default big endian (true or false)]) |
| AC_DEFINE_UNQUOTED(GOLD_DEFAULT_OSABI, $default_osabi, |
| [Default OSABI code]) |
| |
| AC_ARG_WITH(lib-path, |
| [ --with-lib-path=dir1:dir2... set default LIB_PATH], |
| [case "$withval" in |
| yes) LIB_PATH='"/lib:/usr/lib"' ;; |
| no) LIB_PATH='""' ;; |
| *) LIB_PATH='"'"$withval"'"' ;; |
| esac], |
| [LIB_PATH='"::DEFAULT::"']) |
| AC_DEFINE_UNQUOTED(LIB_PATH, $LIB_PATH, |
| [Default library search path]) |
| if test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias"; then |
| AC_DEFINE(NATIVE_LINKER, 1, [Whether configured as a native linker]) |
| fi |
| |
| AC_CHECK_TOOL(NM, nm) |
| |
| AC_PROG_CC |
| AC_PROG_CXX |
| AC_PROG_YACC |
| AC_PROG_RANLIB |
| AC_PROG_INSTALL |
| AC_PROG_LN_S |
| |
| ZW_GNU_GETTEXT_SISTER_DIR |
| AM_PO_SUBDIRS |
| |
| AC_C_BIGENDIAN |
| |
| AC_EXEEXT |
| |
| AM_CONDITIONAL(NATIVE_LINKER, |
| test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias") |
| AM_CONDITIONAL(GCC, test "$GCC" = yes) |
| |
| AM_CONDITIONAL(NATIVE_OR_CROSS_LINKER, |
| test "x$target_alias" = "x" -o "x$host_alias" = "x$target_alias" -o "x$host_alias" = "x$build_alias") |
| |
| dnl Test for whether static linking is supported. Some systems do not |
| dnl install static libraries. This only affects the set of tests that |
| dnl we run. |
| AC_CACHE_CHECK([whether static linking works], [gold_cv_lib_static], |
| [LDFLAGS_hold=$LDFLAGS |
| LDFLAGS="$LDFLAGS -static" |
| AC_LINK_IFELSE([ |
| AC_LANG_PROGRAM([[void f() { }]])], |
| [gold_cv_lib_static=yes], [gold_cv_lib_static=no]) |
| LDFLAGS=$LDFLAGS_hold]) |
| AM_CONDITIONAL(HAVE_STATIC, test "$gold_cv_lib_static" = "yes") |
| |
| dnl Some architectures do not support taking pointers of functions |
| dnl defined in shared libraries except in -fPIC mode. We need to |
| dnl tell the unittest framework if we're compiling for one of those |
| dnl targets, so it doesn't try to run the tests that do that. |
| AM_CONDITIONAL(FN_PTRS_IN_SO_WITHOUT_PIC, [ |
| case $target_cpu in |
| powerpc*) false;; |
| x86_64) false;; |
| sparc64) false;; |
| s390x) false;; |
| *) true;; |
| esac]) |
| |
| dnl Test for gcc 4.1 or later. Full support for -mcmodel=medium is |
| dnl only available in gcc 4.1. |
| AC_CACHE_CHECK([for gcc >= 4.1], [gold_cv_prog_gcc41], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #if !defined __GNUC__ |
| error |
| #elif __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 1) |
| error |
| #endif |
| ])], [gold_cv_prog_gcc41=yes], [gold_cv_prog_gcc41=no])]) |
| |
| save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -mcmodel=medium" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [have_mcmodel_medium=yes], [have_mcmodel_medium=no]) |
| CFLAGS="$save_CFLAGS" |
| dnl Whether we can test -mcmodel=medium. |
| AM_CONDITIONAL(MCMODEL_MEDIUM, |
| [test "$target_cpu" = "x86_64" -a "$have_mcmodel_medium" = "yes" -a "$gold_cv_prog_gcc41" = "yes"]) |
| |
| dnl Test for gcc 9 or later. Some incremental tests fail with GCC 9 or |
| dnl later. |
| AC_CACHE_CHECK([for gcc >= 9], [gold_cv_prog_gcc9], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #if !defined __GNUC__ || __GNUC__ < 9 |
| error |
| #endif |
| ])], [gold_cv_prog_gcc9=yes], [gold_cv_prog_gcc9=no])]) |
| AM_CONDITIONAL(GCC9, [test "$gold_cv_prog_gcc9" = "yes"]) |
| |
| dnl Test for -fcf-protection on x86-64. Some incremental tests fail with |
| dnl -fcf-protection. |
| AC_CACHE_CHECK([for -fcf-protection], [gold_cv_cflags_cf_protection], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #if !defined __x86_64__ || !defined __CET__ |
| error |
| #endif |
| ])], [gold_cv_cflags_cf_protection=yes], [gold_cv_cflags_cf_protection=no])]) |
| AM_CONDITIONAL(CFLAGS_CF_PROTECTION, [test "$gold_cv_cflags_cf_protection" = "yes"]) |
| |
| AC_CACHE_CHECK([whether $CC supports -fmerge-constants], |
| [gold_cv_merge_constants], [ |
| save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -fmerge-constants" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([const char *s = "foo";])], |
| [gold_cv_merge_constants=yes], |
| [gold_cv_merge_constants=no]) |
| CFLAGS="$save_CFLAGS"]) |
| AC_SUBST([MERGE_CONSTANTS_FLAG]) |
| AS_IF([test "$gold_cv_merge_constants" = yes], |
| [MERGE_CONSTANTS_FLAG=-fmerge-constants], |
| [MERGE_CONSTANTS_FLAG=]) |
| |
| dnl Test for __thread support. |
| AC_CACHE_CHECK([for thread support], [gold_cv_c_thread], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([__thread int i = 1;])], |
| [gold_cv_c_thread=yes], [gold_cv_c_thread=no])]) |
| |
| AM_CONDITIONAL(TLS, test "$gold_cv_c_thread" = "yes") |
| |
| dnl On GNU/Linux TLS in static programs only works when using glibc |
| dnl 2.4 or later. |
| AC_CACHE_CHECK([for glibc >= 2.4], [gold_cv_lib_glibc24], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #include <features.h> |
| #if !defined __GLIBC__ |
| error |
| #elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4) |
| error |
| #endif |
| ])], [gold_cv_lib_glibc24=yes], [gold_cv_lib_glibc24=no])]) |
| |
| AM_CONDITIONAL(STATIC_TLS, test "$gold_cv_lib_glibc24" = "yes") |
| |
| dnl Test for #pragma omp threadprivate |
| AC_CACHE_CHECK([for omp support], [gold_cv_c_threadprivate], |
| [save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -fopenmp" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #include <omp.h> |
| int i; |
| #pragma omp threadprivate (i) |
| ])], [gold_cv_c_threadprivate=yes], [gold_cv_c_threadprivate=no]) |
| CFLAGS="$save_CFLAGS"]) |
| if test "$gold_cv_c_threadprivate" = "yes"; then |
| AC_DEFINE(HAVE_OMP_SUPPORT, 1, |
| [Define if compiler supports #pragma omp threadprivate]) |
| fi |
| AM_CONDITIONAL(OMP_SUPPORT, test "$gold_cv_c_threadprivate" = "yes") |
| |
| dnl Test for the -ftls-dialect=gnu2 option. |
| dnl Use -Werror in case of compilers that make unknown -m options warnings. |
| dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS |
| dnl gets set later by default Autoconf magic to include -Werror. (We are |
| dnl assuming here that there is no compiler that groks -mtls-dialect=gnu2 |
| dnl but does not grok -Werror.) |
| save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -Werror -fpic -mtls-dialect=gnu2" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| __thread int i; |
| void foo (void) |
| { |
| i = 10; |
| } |
| ])], [have_tls_gnu2=yes], [have_tls_gnu2=no]) |
| CFLAGS="$save_CFLAGS" |
| AM_CONDITIONAL(TLS_GNU2_DIALECT, test "$have_tls_gnu2" = "yes") |
| |
| dnl On GNU/Linux TLS descriptors are supported by the dynamic loader |
| dnl only with glibc 2.9 or later. |
| AC_CACHE_CHECK([for glibc >= 2.9], [gold_cv_lib_glibc29], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #include <features.h> |
| #if !defined __GLIBC__ |
| error |
| #elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 9) |
| error |
| #endif |
| ])], [gold_cv_lib_glibc29=yes], [gold_cv_lib_glibc29=no])]) |
| |
| AM_CONDITIONAL(TLS_DESCRIPTORS, test "$gold_cv_lib_glibc29" = "yes") |
| |
| dnl Test for the -frandom-seed option. |
| AC_CACHE_CHECK([for -frandom-seed support], [gold_cv_c_random_seed], |
| [save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -frandom-seed=foo" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [gold_cv_c_random_seed=yes], |
| [gold_cv_c_random_seed=no]) |
| CFLAGS="$save_CFLAGS"]) |
| if test "$gold_cv_c_random_seed" = "yes"; then |
| # In Makefile, '$@' will be expanded to be the name of the file |
| # being built, providing a unique seed for each file. |
| RANDOM_SEED_CFLAGS=-frandom-seed=\$@ |
| fi |
| AC_SUBST(RANDOM_SEED_CFLAGS) |
| |
| dnl On GNU/Linux ifunc is supported by the dynamic linker in glibc |
| dnl 2.11 or later, and by binutils 2.20.1 or later. |
| AC_CACHE_CHECK([for glibc ifunc support], [gold_cv_lib_glibc_ifunc], |
| [save_LDFLAGS="$LDFLAGS" |
| LDFLAGS="$LDFLAGS -static" |
| AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
| #include <features.h> |
| #if !defined __GLIBC__ |
| error |
| #elif __GLIBC__ < 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 11) |
| error |
| #endif |
| void func (void) { } |
| void invoke (void); |
| __asm__(".type invoke, %gnu_indirect_function"); |
| typedef void (*funcptr) (void); |
| funcptr dispatch (void) __asm__ ("invoke"); |
| funcptr dispatch (void) { return &func; }]], |
| [[invoke();]]) |
| ], [ |
| if ${NM} conftest$EXEEXT | grep "__rela\?_iplt_start" >/dev/null 2>&1; then |
| gold_cv_lib_glibc_ifunc=both |
| else |
| gold_cv_lib_glibc_ifunc=dyn |
| fi], [gold_cv_lib_glibc_ifunc=no]) |
| LDFLAGS="$save_LDFLAGS"]) |
| |
| AM_CONDITIONAL(IFUNC, test "$gold_cv_lib_glibc_ifunc" != "no") |
| AM_CONDITIONAL(IFUNC_STATIC, test "$gold_cv_lib_glibc_ifunc" = "both") |
| |
| AM_BINUTILS_WARNINGS |
| |
| WARN_CXXFLAGS=`echo ${WARN_CFLAGS} | sed -e 's/-Wstrict-prototypes//' -e 's/-Wmissing-prototypes//' -e 's/-Wshadow//'` |
| AC_SUBST(WARN_CXXFLAGS) |
| |
| AC_ARG_WITH(gold-ldflags, |
| [ --with-gold-ldflags=FLAGS additional link flags for gold], |
| [if test "$withval" = "no" -o "$withval" = "yes"; then |
| GOLD_LDFLAGS= |
| else |
| GOLD_LDFLAGS=$withval |
| fi], |
| [GOLD_LDFLAGS=]) |
| AC_SUBST(GOLD_LDFLAGS) |
| |
| AC_ARG_WITH(gold-ldadd, |
| [ --with-gold-ldadd=LIBS additional libraries for gold], |
| [if test "$withval" = "no" -o "$withval" = "yes"; then |
| GOLD_LDADD= |
| else |
| GOLD_LDADD=$withval |
| fi], |
| [GOLD_LDADD=]) |
| AC_SUBST(GOLD_LDADD) |
| |
| dnl Force support for large files by default. This may need to be |
| dnl host dependent. If build == host, we can check getconf LFS_CFLAGS. |
| LFS_CFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64" |
| AC_SUBST(LFS_CFLAGS) |
| |
| AC_CHECK_HEADERS(sys/mman.h) |
| AC_CHECK_FUNCS(chsize mmap link) |
| AC_REPLACE_FUNCS(pread ftruncate ffsll) |
| |
| AC_CACHE_CHECK([mremap with MREMAP_MAYMOVE], [gold_cv_lib_mremap_maymove], |
| [AC_LINK_IFELSE([ |
| AC_LANG_PROGRAM([[ |
| #include <sys/mman.h> |
| void f() { mremap (0, 0, 0, MREMAP_MAYMOVE); } |
| ]])], [gold_cv_lib_mremap_maymove=yes], [gold_cv_lib_mremap_maymove=no])]) |
| if test "$gold_cv_lib_mremap_maymove" = "yes"; then |
| AC_DEFINE(HAVE_MREMAP, 1, |
| [Define to 1 if you have the mremap function with MREMAP_MAYMOVE support]) |
| else |
| AC_LIBOBJ(mremap) |
| fi |
| |
| # Link in zlib/zstd if we can. This allows us to write compressed sections. |
| AM_ZLIB |
| AC_ZSTD |
| AM_CONDITIONAL(HAVE_ZSTD, test "$pkg_cv_ZSTD_LIBS" != "") |
| |
| AC_ARG_ENABLE([threads], |
| [[ --enable-threads[=ARG] multi-threaded linking [ARG={auto,yes,no}]]], |
| [case "${enableval}" in |
| yes | "") threads=yes ;; |
| no) threads=no ;; |
| auto) threads=auto ;; |
| *) threads=yes ;; |
| esac], |
| [threads=auto]) |
| |
| if test "$threads" = "yes"; then |
| AX_PTHREAD([threads=yes], AC_MSG_ERROR([pthread not found])) |
| elif test "$threads" = "auto"; then |
| AX_PTHREAD([threads=yes], [threads=no]) |
| fi |
| |
| if test "$threads" = "yes"; then |
| AC_DEFINE(ENABLE_THREADS, 1, |
| [Define to do multi-threaded linking]) |
| fi |
| AM_CONDITIONAL(THREADS, test "$threads" = "yes") |
| |
| # Used to validate --package-metadata= input. Disabled by default. |
| AC_ARG_ENABLE([jansson], |
| [AS_HELP_STRING([--enable-jansson], |
| [enable jansson [default=no]])], |
| [enable_jansson=$enableval], |
| [enable_jansson="no"]) |
| |
| if test "x$enable_jansson" != "xno"; then |
| PKG_PROG_PKG_CONFIG |
| AS_IF([test -n "$PKG_CONFIG"], |
| [ |
| PKG_CHECK_MODULES(JANSSON, [jansson], |
| [ |
| AC_DEFINE(HAVE_JANSSON, 1, [The jansson library is to be used]) |
| AC_SUBST([JANSSON_CFLAGS]) |
| AC_SUBST([JANSSON_LIBS]) |
| ], |
| [ |
| AC_MSG_ERROR([Cannot find jansson library]) |
| ]) |
| ], |
| [ |
| AC_MSG_ERROR([Cannot find pkg-config]) |
| ]) |
| fi |
| |
| dnl We have to check these in C, not C++, because autoconf generates |
| dnl tests which have no type information, and current glibc provides |
| dnl multiple declarations of functions like basename when compiling |
| dnl with C++. |
| AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp]) |
| |
| dnl Check if gcc supports the -gpubnames option. |
| dnl Use -Werror in case of compilers that make unknown -g options warnings. |
| dnl They would pass the test here, but fail in actual use when $WARN_CFLAGS |
| dnl gets set later by default Autoconf magic to include -Werror. (We are |
| dnl assuming here that there is no compiler that groks -gpubnames |
| dnl but does not grok -Werror.) |
| save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -Werror -gpubnames" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [have_pubnames=yes], [have_pubnames=no]) |
| CFLAGS="$save_CFLAGS" |
| AM_CONDITIONAL(HAVE_PUBNAMES, test "$have_pubnames" = "yes") |
| |
| dnl Check if gcc supports the -fno-use-linker-plugin option. |
| save_CFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -Werror -fno-use-linker-plugin" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], [have_no_use_linker_plugin=yes], [have_no_use_linker_plugin=no]) |
| CFLAGS="$save_CFLAGS" |
| AM_CONDITIONAL(HAVE_NO_USE_LINKER_PLUGIN, test "$have_no_use_linker_plugin" = "yes") |
| |
| AC_LANG_PUSH(C++) |
| |
| AC_CHECK_HEADERS(unordered_set unordered_map) |
| AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map) |
| AC_CHECK_HEADERS(ext/hash_map ext/hash_set) |
| AC_CHECK_HEADERS(byteswap.h) |
| |
| dnl Check for bswap_{16,32,64} |
| AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64], [], [], [[#include <byteswap.h>]]) |
| |
| dnl When plugins enabled dynamic loader interface is required. Check headers |
| dnl which may provide this interface. Add the necessary library to link. |
| AC_CHECK_HEADERS(windows.h) |
| AC_CHECK_HEADERS(dlfcn.h) |
| AC_SEARCH_LIBS(dlopen, [dl dld]) |
| case "$ac_cv_search_dlopen" in |
| no*) DLOPEN_LIBS="";; |
| *) DLOPEN_LIBS="$ac_cv_search_dlopen";; |
| esac |
| AC_SUBST(DLOPEN_LIBS) |
| |
| AC_CHECK_FUNCS(mallinfo mallinfo2 posix_fallocate fallocate readv sysconf times mkdtemp) |
| AC_CHECK_DECLS([basename, ffs, asprintf, vasprintf, snprintf, vsnprintf, strverscmp, strndup, memmem]) |
| |
| # Use of ::std::tr1::unordered_map::rehash causes undefined symbols |
| # at link time with some versions of GCC. |
| AC_CACHE_CHECK([whether ::std::tr1::unordered_map::rehash is usable.], |
| [gold_cv_unordered_map_rehash], |
| [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ |
| #include <tr1/unordered_map> |
| void bar() { ::std::tr1::unordered_map<int, int> x; x.rehash(10); } |
| ]])], [gold_cv_unordered_map_rehash=yes], [gold_cv_unordered_map_rehash=no])]) |
| if test "$gold_cv_unordered_map_rehash" = "yes"; then |
| AC_DEFINE(HAVE_TR1_UNORDERED_MAP_REHASH, 1, |
| [Define if ::std::tr1::unordered_map::rehash is usable]) |
| fi |
| |
| # Since 5e9091dab8858b25210a91d22fbbbfdee9c969ad gold now requires C++11 |
| # So we need to check for it. |
| AX_CXX_COMPILE_STDCXX([11], [], [mandatory]) |
| |
| # Use of tr1/unordered_map with off_t as a key is not supported on GCC |
| # 4.1.xx when compiling in 32-bit mode with a 64-bit off_t type. |
| AC_CACHE_CHECK([whether std::tr1::hash<off_t> is defined], |
| [gold_cv_hash_off_t], |
| [CXXFLAGS_hold=$CXXFLAGS |
| CXXFLAGS="$CXXFLAGS $LFS_CFLAGS" |
| AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| #include <sys/types.h> |
| #include <tr1/unordered_map> |
| std::tr1::hash<off_t> h; |
| ])], |
| [gold_cv_hash_off_t=yes], |
| [gold_cv_hash_off_t=no]) |
| CXXFLAGS=$CXXFLAGS_hold]) |
| if test "$gold_cv_hash_off_t" = "yes"; then |
| AC_DEFINE(HAVE_TR1_HASH_OFF_T, 1, |
| [Define if std::tr1::hash<off_t> is usable]) |
| fi |
| |
| # gcc 4.3.0 doesn't recognize the printf attribute on a template |
| # function. Check for that. This is gcc bug 35546. This test can |
| # probably be removed after the bug has been fixed for a while. |
| AC_CACHE_CHECK([whether we can use attributes with template functions], |
| [gold_cv_template_attribute], |
| [AC_COMPILE_IFELSE([AC_LANG_SOURCE([ |
| template<typename T> extern void foo(const char*, ...) |
| __attribute__ ((__format__ (__printf__, 1, 2))); |
| template<typename T> void foo(const char* format, ...) {} |
| void bar() { foo<int>("%s\n", "foo"); } |
| ])], [gold_cv_template_attribute=yes], [gold_cv_template_attribute=no])]) |
| if test "$gold_cv_template_attribute" = "yes"; then |
| AC_DEFINE(HAVE_TEMPLATE_ATTRIBUTES, 1, |
| [Define if attributes work on C++ templates]) |
| fi |
| |
| dnl Check if the system has struct stat::st_mtim. |
| AC_CACHE_CHECK([for struct stat::st_mtim.], |
| [gold_cv_stat_st_mtim], |
| [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ |
| #include <sys/stat.h> |
| long bar() { struct stat s; return (long)(s.st_mtim.tv_sec + s.st_mtim.tv_sec);} |
| ]])], [gold_cv_stat_st_mtim=yes], [gold_cv_stat_st_mtim=no])]) |
| if test "$gold_cv_stat_st_mtim" = "yes"; then |
| AC_DEFINE(HAVE_STAT_ST_MTIM, 1, |
| [Define if struct stat has a field st_mtim with timespec for mtime]) |
| fi |
| |
| AC_LANG_POP(C++) |
| |
| AC_CHECK_HEADERS(locale.h) |
| AC_CHECK_FUNCS(setlocale) |
| AM_LC_MESSAGES |
| |
| AM_MAINTAINER_MODE |
| |
| AC_OUTPUT(Makefile testsuite/Makefile po/Makefile.in:po/Make-in) |