Edit

thodg/libiconv/m4/lib-link.m4

Branch :

  • Show log

    Commit

  • Author : Bruno Haible
    Date : 2002-04-29 13:10:06
    Hash : 70b9eb6d
    Message : Make autoconfiguration independent of clisp.

  • m4/lib-link.m4
  • # lib-link.m4 serial 2 (gettext-0.11.2)
    dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
    dnl This file is free software, distributed under the terms of the GNU
    dnl General Public License.  As a special exception to the GNU General
    dnl Public License, this file may be distributed as part of a program
    dnl that contains a configuration script generated by Autoconf, under
    dnl the same distribution terms as the rest of that program.
    
    dnl From Bruno Haible.
    
    dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
    dnl the libraries corresponding to explicit and implicit dependencies.
    dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
    dnl augments the CPPFLAGS variable.
    AC_DEFUN([AC_LIB_LINKFLAGS],
    [
      AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
      AC_REQUIRE([AC_LIB_RPATH])
      define([Name],[translit([$1],[./-], [___])])
      define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
      AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
        AC_LIB_LINKFLAGS_BODY([$1], [$2])
        ac_cv_lib[]Name[]_libs="$LIB[]NAME"
        ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
        ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
      ])
      LIB[]NAME="$ac_cv_lib[]Name[]_libs"
      LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
      INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
      AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
      AC_SUBST([LIB]NAME)
      AC_SUBST([LTLIB]NAME)
      dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
      dnl results of this search when this library appears as a dependency.
      HAVE_LIB[]NAME=yes
      undefine([Name])
      undefine([NAME])
    ])
    
    dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
    dnl searches for libname and the libraries corresponding to explicit and
    dnl implicit dependencies, together with the specified include files and
    dnl the ability to compile and link the specified testcode. If found, it
    dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
    dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
    dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
    dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
    AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
    [
      AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
      AC_REQUIRE([AC_LIB_RPATH])
      define([Name],[translit([$1],[./-], [___])])
      define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
    
      dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
      dnl accordingly.
      AC_LIB_LINKFLAGS_BODY([$1], [$2])
    
      dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
      dnl because if the user has installed lib[]Name and not disabled its use
      dnl via --without-lib[]Name-prefix, he wants to use it.
      ac_save_CPPFLAGS="$CPPFLAGS"
      AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
    
      AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
        ac_save_LIBS="$LIBS"
        LIBS="$LIBS $LIB[]NAME"
        AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
        LIBS="$ac_save_LIBS"
      ])
      if test "$ac_cv_lib[]Name" = yes; then
        HAVE_LIB[]NAME=yes
        AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
        AC_MSG_CHECKING([how to link with lib[]$1])
        AC_MSG_RESULT([$LIB[]NAME])
      else
        HAVE_LIB[]NAME=no
        dnl If $LIB[]NAME didn't lead to a usable library, we don't need
        dnl $INC[]NAME either.
        CPPFLAGS="$ac_save_CPPFLAGS"
        LIB[]NAME=
        LTLIB[]NAME=
      fi
      AC_SUBST([HAVE_LIB]NAME)
      AC_SUBST([LIB]NAME)
      AC_SUBST([LTLIB]NAME)
      undefine([Name])
      undefine([NAME])
    ])
    
    dnl Determine the platform dependent parameters needed to use rpath:
    dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
    dnl hardcode_direct, hardcode_minus_L,
    dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec.
    AC_DEFUN([AC_LIB_RPATH],
    [
      AC_REQUIRE([AC_PROG_CC])                dnl we use $CC, $GCC, $LDFLAGS
      AC_REQUIRE([AC_LIB_PROG_LD])            dnl we use $LD, $with_gnu_ld
      AC_REQUIRE([AC_CANONICAL_HOST])         dnl we use $host
      AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
      AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
        CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
        ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
        . ./conftest.sh
        rm -f ./conftest.sh
        acl_cv_rpath=done
      ])
      wl="$acl_cv_wl"
      libext="$acl_cv_libext"
      shlibext="$acl_cv_shlibext"
      hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
      hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
      hardcode_direct="$acl_cv_hardcode_direct"
      hardcode_minus_L="$acl_cv_hardcode_minus_L"
      sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
      sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
    ])
    
    dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
    dnl the libraries corresponding to explicit and implicit dependencies.
    dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
    AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
    [
      define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
                                   [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
      dnl By default, look in $includedir and $libdir.
      use_additional=yes
      AC_LIB_WITH_FINAL_PREFIX([
        eval additional_includedir=\"$includedir\"
        eval additional_libdir=\"$libdir\"
      ])
      AC_ARG_WITH([lib$1-prefix],
    [  --with-lib$1-prefix[=DIR]  search for lib$1 in DIR/include and DIR/lib
      --without-lib$1-prefix     don't search for lib$1 in includedir and libdir],
    [
        if test "X$withval" = "Xno"; then
          use_additional=no
        else
          if test "X$withval" = "X"; then
            AC_LIB_WITH_FINAL_PREFIX([
              eval additional_includedir=\"$includedir\"
              eval additional_libdir=\"$libdir\"
            ])
          else
            additional_includedir="$withval/include"
            additional_libdir="$withval/lib"
          fi
        fi
    ])
      dnl Search the library and its dependencies in $additional_libdir and
      dnl $LDFLAGS. Using breadth-first-seach.
      LIB[]NAME=
      LTLIB[]NAME=
      INC[]NAME=
      rpathdirs=
      ltrpathdirs=
      names_already_handled=
      names_next_round='$1 $2'
      while test -n "$names_next_round"; do
        names_this_round="$names_next_round"
        names_next_round=
        for name in $names_this_round; do
          already_handled=
          for n in $names_already_handled; do
            if test "$n" = "$name"; then
              already_handled=yes
              break
            fi
          done
          if test -z "$already_handled"; then
            names_already_handled="$names_already_handled $name"
            dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
            dnl or AC_LIB_HAVE_LINKFLAGS call.
            uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
            eval value=\"\$HAVE_LIB$uppername\"
            if test -n "$value"; then
              if test "$value" = yes; then
                eval value=\"\$LIB$uppername\"
                test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
                eval value=\"\$LTLIB$uppername\"
                test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
              else
                dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
                dnl that this library doesn't exist. So just drop it.
                :
              fi
            else
              dnl Search the library lib$name in $additional_libdir and $LDFLAGS
              dnl and the already constructed $LIBNAME/$LTLIBNAME.
              found_dir=
              found_la=
              found_so=
              found_a=
              if test $use_additional = yes; then
                if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
                  found_dir="$additional_libdir"
                  found_so="$additional_libdir/lib$name.$shlibext"
                  if test -f "$additional_libdir/lib$name.la"; then
                    found_la="$additional_libdir/lib$name.la"
                  fi
                else
                  if test -f "$additional_libdir/lib$name.$libext"; then
                    found_dir="$additional_libdir"
                    found_a="$additional_libdir/lib$name.$libext"
                    if test -f "$additional_libdir/lib$name.la"; then
                      found_la="$additional_libdir/lib$name.la"
                    fi
                  fi
                fi
              fi
              if test "X$found_dir" = "X"; then
                for x in $LDFLAGS $LTLIB[]NAME; do
                  AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
                  case "$x" in
                    -L*)
                      dir=`echo "X$x" | sed -e 's/^X-L//'`
                      if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
                        found_dir="$dir"
                        found_so="$dir/lib$name.$shlibext"
                        if test -f "$dir/lib$name.la"; then
                          found_la="$dir/lib$name.la"
                        fi
                      else
                        if test -f "$dir/lib$name.$libext"; then
                          found_dir="$dir"
                          found_a="$dir/lib$name.$libext"
                          if test -f "$dir/lib$name.la"; then
                            found_la="$dir/lib$name.la"
                          fi
                        fi
                      fi
                      ;;
                  esac
                  if test "X$found_dir" != "X"; then
                    break
                  fi
                done
              fi
              if test "X$found_dir" != "X"; then
                dnl Found the library.
                LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
                if test "X$found_so" != "X"; then
                  dnl Linking with a shared library. We attempt to hardcode its
                  dnl directory into the executable's runpath, unless it's the
                  dnl standard /usr/lib.
                  if test "X$found_dir" = "X/usr/lib"; then
                    dnl No hardcoding is needed.
                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                  else
                    dnl Use an explicit option to hardcode DIR into the resulting
                    dnl binary.
                    dnl Potentially add DIR to ltrpathdirs.
                    dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
                    haveit=
                    for x in $ltrpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      ltrpathdirs="$ltrpathdirs $found_dir"
                    fi
                    dnl The hardcoding into $LIBNAME is system dependent.
                    if test "$hardcode_direct" = yes; then
                      dnl Using DIR/libNAME.so during linking hardcodes DIR into the
                      dnl resulting binary.
                      LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                    else
                      if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
                        dnl Use an explicit option to hardcode DIR into the resulting
                        dnl binary.
                        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                        dnl Potentially add DIR to rpathdirs.
                        dnl The rpathdirs will be appended to $LIBNAME at the end.
                        haveit=
                        for x in $rpathdirs; do
                          if test "X$x" = "X$found_dir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          rpathdirs="$rpathdirs $found_dir"
                        fi
                      else
                        dnl Rely on "-L$found_dir".
                        dnl But don't add it if it's already contained in the LDFLAGS
                        dnl or the already constructed $LIBNAME
                        haveit=
                        for x in $LDFLAGS $LIB[]NAME; do
                          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
                          if test "X$x" = "X-L$found_dir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
                        fi
                        if test "$hardcode_minus_L" != no; then
                          dnl FIXME: Not sure whether we should use
                          dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
                          dnl here.
                          LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
                        else
                          dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
                          dnl here, because this doesn't fit in flags passed to the
                          dnl compiler. So give up. No hardcoding. This affects only
                          dnl very old systems.
                          dnl FIXME: Not sure whether we should use
                          dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
                          dnl here.
                          LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
                        fi
                      fi
                    fi
                  fi
                else
                  if test "X$found_a" != "X"; then
                    dnl Linking with a static library.
                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
                  else
                    dnl We shouldn't come here, but anyway it's good to have a
                    dnl fallback.
                    LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
                  fi
                fi
                dnl Assume the include files are nearby.
                additional_includedir=
                case "$found_dir" in
                  */lib | */lib/)
                    basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
                    additional_includedir="$basedir/include"
                    ;;
                esac
                if test "X$additional_includedir" != "X"; then
                  dnl Potentially add $additional_includedir to $INCNAME.
                  dnl But don't add it
                  dnl   1. if it's the standard /usr/include,
                  dnl   2. if it's /usr/local/include and we are using GCC on Linux,
                  dnl   3. if it's already present in $CPPFLAGS or the already
                  dnl      constructed $INCNAME,
                  dnl   4. if it doesn't exist as a directory.
                  if test "X$additional_includedir" != "X/usr/include"; then
                    haveit=
                    if test "X$additional_includedir" = "X/usr/local/include"; then
                      if test -n "$GCC"; then
                        case $host_os in
                          linux*) haveit=yes;;
                        esac
                      fi
                    fi
                    if test -z "$haveit"; then
                      for x in $CPPFLAGS $INC[]NAME; do
                        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
                        if test "X$x" = "X-I$additional_includedir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        if test -d "$additional_includedir"; then
                          dnl Really add $additional_includedir to $INCNAME.
                          INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
                        fi
                      fi
                    fi
                  fi
                fi
                dnl Look for dependencies.
                if test -n "$found_la"; then
                  dnl Read the .la file. It defines the variables
                  dnl dlname, library_names, old_library, dependency_libs, current,
                  dnl age, revision, installed, dlopen, dlpreopen, libdir.
                  save_libdir="$libdir"
                  case "$found_la" in
                    */* | *\\*) . "$found_la" ;;
                    *) . "./$found_la" ;;
                  esac
                  libdir="$save_libdir"
                  dnl We use only dependency_libs.
                  for dep in $dependency_libs; do
                    case "$dep" in
                      -L*)
                        additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                        dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
                        dnl But don't add it
                        dnl   1. if it's the standard /usr/lib,
                        dnl   2. if it's /usr/local/lib and we are using GCC on Linux,
                        dnl   3. if it's already present in $LDFLAGS or the already
                        dnl      constructed $LIBNAME,
                        dnl   4. if it doesn't exist as a directory.
                        if test "X$additional_libdir" != "X/usr/lib"; then
                          haveit=
                          if test "X$additional_libdir" = "X/usr/local/lib"; then
                            if test -n "$GCC"; then
                              case $host_os in
                                linux*) haveit=yes;;
                              esac
                            fi
                          fi
                          if test -z "$haveit"; then
                            haveit=
                            for x in $LDFLAGS $LIB[]NAME; do
                              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
                              if test "X$x" = "X-L$additional_libdir"; then
                                haveit=yes
                                break
                              fi
                            done
                            if test -z "$haveit"; then
                              if test -d "$additional_libdir"; then
                                dnl Really add $additional_libdir to $LIBNAME.
                                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
                              fi
                            fi
                            haveit=
                            for x in $LDFLAGS $LTLIB[]NAME; do
                              AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
                              if test "X$x" = "X-L$additional_libdir"; then
                                haveit=yes
                                break
                              fi
                            done
                            if test -z "$haveit"; then
                              if test -d "$additional_libdir"; then
                                dnl Really add $additional_libdir to $LTLIBNAME.
                                LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
                              fi
                            fi
                          fi
                        fi
                        ;;
                      -R*)
                        dir=`echo "X$dep" | sed -e 's/^X-R//'`
                        dnl Potentially add DIR to rpathdirs.
                        dnl The rpathdirs will be appended to $LIBNAME at the end.
                        haveit=
                        for x in $rpathdirs; do
                          if test "X$x" = "X$dir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          rpathdirs="$rpathdirs $dir"
                        fi
                        dnl Potentially add DIR to ltrpathdirs.
                        dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
                        haveit=
                        for x in $ltrpathdirs; do
                          if test "X$x" = "X$dir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          ltrpathdirs="$ltrpathdirs $dir"
                        fi
                        ;;
                      -l*)
                        dnl Handle this in the next round.
                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                        ;;
                      *.la)
                        dnl Handle this in the next round. Throw away the .la's
                        dnl directory; it is already contained in a preceding -L
                        dnl option.
                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                        ;;
                      *)
                        dnl Most likely an immediate library name.
                        LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
                        LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
                        ;;
                    esac
                  done
                fi
              else
                dnl Didn't find the library; assume it is in the system directories
                dnl known to the linker and runtime loader. (All the system
                dnl directories known to the linker should also be known to the
                dnl runtime loader, otherwise the system is severely misconfigured.)
                LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
                LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
              fi
            fi
          fi
        done
      done
      if test "X$rpathdirs" != "X"; then
        if test -n "$hardcode_libdir_separator"; then
          dnl Weird platform: only the last -rpath option counts, the user must
          dnl pass all path elements in one option. We can arrange that for a
          dnl single library, but not when more than one $LIBNAMEs are used.
          alldirs=
          for found_dir in $rpathdirs; do
            alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
          done
          dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
          acl_save_libdir="$libdir"
          libdir="$alldirs"
          eval flag=\"$hardcode_libdir_flag_spec\"
          libdir="$acl_save_libdir"
          LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
        else
          dnl The -rpath options are cumulative.
          for found_dir in $rpathdirs; do
            acl_save_libdir="$libdir"
            libdir="$found_dir"
            eval flag=\"$hardcode_libdir_flag_spec\"
            libdir="$acl_save_libdir"
            LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
          done
        fi
      fi
      if test "X$ltrpathdirs" != "X"; then
        dnl When using libtool, the option that works for both libraries and
        dnl executables is -R. The -R options are cumulative.
        for found_dir in $ltrpathdirs; do
          LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
        done
      fi
    ])
    
    dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
    dnl unless already present in VAR.
    dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
    dnl contains two or three consecutive elements that belong together.
    AC_DEFUN([AC_LIB_APPENDTOVAR],
    [
      for element in [$2]; do
        haveit=
        for x in $[$1]; do
          AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
          if test "X$x" = "X$element"; then
            haveit=yes
            break
          fi
        done
        if test -z "$haveit"; then
          [$1]="${[$1]}${[$1]:+ }$element"
        fi
      done
    ])