Blame m4/lib-prefix.m4

Packit Service 4684c1
# lib-prefix.m4 serial 17
Packit Service 4684c1
dnl Copyright (C) 2001-2005, 2008-2020 Free Software Foundation, Inc.
Packit Service 4684c1
dnl This file is free software; the Free Software Foundation
Packit Service 4684c1
dnl gives unlimited permission to copy and/or distribute it,
Packit Service 4684c1
dnl with or without modifications, as long as this notice is preserved.
Packit Service 4684c1
Packit Service 4684c1
dnl From Bruno Haible.
Packit Service 4684c1
Packit Service 4684c1
dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
Packit Service 4684c1
dnl to access previously installed libraries. The basic assumption is that
Packit Service 4684c1
dnl a user will want packages to use other packages he previously installed
Packit Service 4684c1
dnl with the same --prefix option.
Packit Service 4684c1
dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
Packit Service 4684c1
dnl libraries, but is otherwise very convenient.
Packit Service 4684c1
AC_DEFUN([AC_LIB_PREFIX],
Packit Service 4684c1
[
Packit Service 4684c1
  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
Packit Service 4684c1
  AC_REQUIRE([AC_PROG_CC])
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 4684c1
  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
Packit Service 4684c1
  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
Packit Service 4684c1
  dnl By default, look in $includedir and $libdir.
Packit Service 4684c1
  use_additional=yes
Packit Service 4684c1
  AC_LIB_WITH_FINAL_PREFIX([
Packit Service 4684c1
    eval additional_includedir=\"$includedir\"
Packit Service 4684c1
    eval additional_libdir=\"$libdir\"
Packit Service 4684c1
  ])
Packit Service 4684c1
  AC_ARG_WITH([lib-prefix],
Packit Service 4684c1
[[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
Packit Service 4684c1
  --without-lib-prefix    don't search for libraries in includedir and libdir]],
Packit Service 4684c1
[
Packit Service 4684c1
    if test "X$withval" = "Xno"; then
Packit Service 4684c1
      use_additional=no
Packit Service 4684c1
    else
Packit Service 4684c1
      if test "X$withval" = "X"; then
Packit Service 4684c1
        AC_LIB_WITH_FINAL_PREFIX([
Packit Service 4684c1
          eval additional_includedir=\"$includedir\"
Packit Service 4684c1
          eval additional_libdir=\"$libdir\"
Packit Service 4684c1
        ])
Packit Service 4684c1
      else
Packit Service 4684c1
        additional_includedir="$withval/include"
Packit Service 4684c1
        additional_libdir="$withval/$acl_libdirstem"
Packit Service 4684c1
      fi
Packit Service 4684c1
    fi
Packit Service 4684c1
])
Packit Service 4684c1
  if test $use_additional = yes; then
Packit Service 4684c1
    dnl Potentially add $additional_includedir to $CPPFLAGS.
Packit Service 4684c1
    dnl But don't add it
Packit Service 4684c1
    dnl   1. if it's the standard /usr/include,
Packit Service 4684c1
    dnl   2. if it's already present in $CPPFLAGS,
Packit Service 4684c1
    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
Packit Service 4684c1
    dnl   4. if it doesn't exist as a directory.
Packit Service 4684c1
    if test "X$additional_includedir" != "X/usr/include"; then
Packit Service 4684c1
      haveit=
Packit Service 4684c1
      for x in $CPPFLAGS; do
Packit Service 4684c1
        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
Packit Service 4684c1
        if test "X$x" = "X-I$additional_includedir"; then
Packit Service 4684c1
          haveit=yes
Packit Service 4684c1
          break
Packit Service 4684c1
        fi
Packit Service 4684c1
      done
Packit Service 4684c1
      if test -z "$haveit"; then
Packit Service 4684c1
        if test "X$additional_includedir" = "X/usr/local/include"; then
Packit Service 4684c1
          if test -n "$GCC"; then
Packit Service 4684c1
            case $host_os in
Packit Service 4684c1
              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
Packit Service 4684c1
            esac
Packit Service 4684c1
          fi
Packit Service 4684c1
        fi
Packit Service 4684c1
        if test -z "$haveit"; then
Packit Service 4684c1
          if test -d "$additional_includedir"; then
Packit Service 4684c1
            dnl Really add $additional_includedir to $CPPFLAGS.
Packit Service 4684c1
            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
Packit Service 4684c1
          fi
Packit Service 4684c1
        fi
Packit Service 4684c1
      fi
Packit Service 4684c1
    fi
Packit Service 4684c1
    dnl Potentially add $additional_libdir to $LDFLAGS.
Packit Service 4684c1
    dnl But don't add it
Packit Service 4684c1
    dnl   1. if it's the standard /usr/lib,
Packit Service 4684c1
    dnl   2. if it's already present in $LDFLAGS,
Packit Service 4684c1
    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
Packit Service 4684c1
    dnl   4. if it doesn't exist as a directory.
Packit Service 4684c1
    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
Packit Service 4684c1
      haveit=
Packit Service 4684c1
      for x in $LDFLAGS; do
Packit Service 4684c1
        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
Packit Service 4684c1
        if test "X$x" = "X-L$additional_libdir"; then
Packit Service 4684c1
          haveit=yes
Packit Service 4684c1
          break
Packit Service 4684c1
        fi
Packit Service 4684c1
      done
Packit Service 4684c1
      if test -z "$haveit"; then
Packit Service 4684c1
        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
Packit Service 4684c1
          if test -n "$GCC"; then
Packit Service 4684c1
            case $host_os in
Packit Service 4684c1
              linux*) haveit=yes;;
Packit Service 4684c1
            esac
Packit Service 4684c1
          fi
Packit Service 4684c1
        fi
Packit Service 4684c1
        if test -z "$haveit"; then
Packit Service 4684c1
          if test -d "$additional_libdir"; then
Packit Service 4684c1
            dnl Really add $additional_libdir to $LDFLAGS.
Packit Service 4684c1
            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
Packit Service 4684c1
          fi
Packit Service 4684c1
        fi
Packit Service 4684c1
      fi
Packit Service 4684c1
    fi
Packit Service 4684c1
  fi
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
Packit Service 4684c1
dnl acl_final_exec_prefix, containing the values to which $prefix and
Packit Service 4684c1
dnl $exec_prefix will expand at the end of the configure script.
Packit Service 4684c1
AC_DEFUN([AC_LIB_PREPARE_PREFIX],
Packit Service 4684c1
[
Packit Service 4684c1
  dnl Unfortunately, prefix and exec_prefix get only finally determined
Packit Service 4684c1
  dnl at the end of configure.
Packit Service 4684c1
  if test "X$prefix" = "XNONE"; then
Packit Service 4684c1
    acl_final_prefix="$ac_default_prefix"
Packit Service 4684c1
  else
Packit Service 4684c1
    acl_final_prefix="$prefix"
Packit Service 4684c1
  fi
Packit Service 4684c1
  if test "X$exec_prefix" = "XNONE"; then
Packit Service 4684c1
    acl_final_exec_prefix='${prefix}'
Packit Service 4684c1
  else
Packit Service 4684c1
    acl_final_exec_prefix="$exec_prefix"
Packit Service 4684c1
  fi
Packit Service 4684c1
  acl_save_prefix="$prefix"
Packit Service 4684c1
  prefix="$acl_final_prefix"
Packit Service 4684c1
  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
Packit Service 4684c1
  prefix="$acl_save_prefix"
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
Packit Service 4684c1
dnl variables prefix and exec_prefix bound to the values they will have
Packit Service 4684c1
dnl at the end of the configure script.
Packit Service 4684c1
AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
Packit Service 4684c1
[
Packit Service 4684c1
  acl_save_prefix="$prefix"
Packit Service 4684c1
  prefix="$acl_final_prefix"
Packit Service 4684c1
  acl_save_exec_prefix="$exec_prefix"
Packit Service 4684c1
  exec_prefix="$acl_final_exec_prefix"
Packit Service 4684c1
  $1
Packit Service 4684c1
  exec_prefix="$acl_save_exec_prefix"
Packit Service 4684c1
  prefix="$acl_save_prefix"
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
dnl AC_LIB_PREPARE_MULTILIB creates
Packit Service 4684c1
dnl - a function acl_is_expected_elfclass, that tests whether standard input
Packit Service 4684c1
dn;   has a 32-bit or 64-bit ELF header, depending on the host CPU ABI,
Packit Service 4684c1
dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing
Packit Service 4684c1
dnl   the basename of the libdir to try in turn, either "lib" or "lib64" or
Packit Service 4684c1
dnl   "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar.
Packit Service 4684c1
AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
Packit Service 4684c1
[
Packit Service 4684c1
  dnl There is no formal standard regarding lib, lib32, and lib64.
Packit Service 4684c1
  dnl On most glibc systems, the current practice is that on a system supporting
Packit Service 4684c1
  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
Packit Service 4684c1
  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. However, on
Packit Service 4684c1
  dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go
Packit Service 4684c1
  dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib.
Packit Service 4684c1
  dnl We determine the compiler's default mode by looking at the compiler's
Packit Service 4684c1
  dnl library search path. If at least one of its elements ends in /lib64 or
Packit Service 4684c1
  dnl points to a directory whose absolute pathname ends in /lib64, we use that
Packit Service 4684c1
  dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default,
Packit Service 4684c1
  dnl namely "lib".
Packit Service 4684c1
  dnl On Solaris systems, the current practice is that on a system supporting
Packit Service 4684c1
  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
Packit Service 4684c1
  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
Packit Service 4684c1
  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 4684c1
  AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT])
Packit Service 4684c1
Packit Service 4684c1
  AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf],
Packit Service 4684c1
    [AC_EGREP_CPP([Extensible Linking Format],
Packit Service 4684c1
       [#ifdef __ELF__
Packit Service 4684c1
        Extensible Linking Format
Packit Service 4684c1
        #endif
Packit Service 4684c1
       ],
Packit Service 4684c1
       [gl_cv_elf=yes],
Packit Service 4684c1
       [gl_cv_elf=no])
Packit Service 4684c1
     ])
Packit Service 4684c1
  if test $gl_cv_elf; then
Packit Service 4684c1
    # Extract the ELF class of a file (5th byte) in decimal.
Packit Service 4684c1
    # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
Packit Service 4684c1
    if od -A x < /dev/null >/dev/null 2>/dev/null; then
Packit Service 4684c1
      # Use POSIX od.
Packit Service 4684c1
      func_elfclass ()
Packit Service 4684c1
      {
Packit Service 4684c1
        od -A n -t d1 -j 4 -N 1
Packit Service 4684c1
      }
Packit Service 4684c1
    else
Packit Service 4684c1
      # Use BSD hexdump.
Packit Service 4684c1
      func_elfclass ()
Packit Service 4684c1
      {
Packit Service 4684c1
        dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
Packit Service 4684c1
        echo
Packit Service 4684c1
      }
Packit Service 4684c1
    fi
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
    case $HOST_CPU_C_ABI_32BIT in
Packit Service 4684c1
      yes)
Packit Service 4684c1
        # 32-bit ABI.
Packit Service 4684c1
        acl_is_expected_elfclass ()
Packit Service 4684c1
        {
Packit Service 4684c1
          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 1
Packit Service 4684c1
        }
Packit Service 4684c1
        ;;
Packit Service 4684c1
      no)
Packit Service 4684c1
        # 64-bit ABI.
Packit Service 4684c1
        acl_is_expected_elfclass ()
Packit Service 4684c1
        {
Packit Service 4684c1
          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 2
Packit Service 4684c1
        }
Packit Service 4684c1
        ;;
Packit Service 4684c1
      *)
Packit Service 4684c1
        # Unknown.
Packit Service 4684c1
        acl_is_expected_elfclass ()
Packit Service 4684c1
        {
Packit Service 4684c1
          :
Packit Service 4684c1
        }
Packit Service 4684c1
        ;;
Packit Service 4684c1
    esac
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
  else
Packit Service 4684c1
    acl_is_expected_elfclass ()
Packit Service 4684c1
    {
Packit Service 4684c1
      :
Packit Service 4684c1
    }
Packit Service 4684c1
  fi
Packit Service 4684c1
Packit Service 4684c1
  dnl Allow the user to override the result by setting acl_cv_libdirstems.
Packit Service 4684c1
  AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
Packit Service 4684c1
    [acl_cv_libdirstems],
Packit Service 4684c1
    [dnl Try 'lib' first, because that's the default for libdir in GNU, see
Packit Service 4684c1
     dnl <https://www.gnu.org/prep/standards/html_node/Directory-Variables.html>.
Packit Service 4684c1
     acl_libdirstem=lib
Packit Service 4684c1
     acl_libdirstem2=
Packit Service 4684c1
     acl_libdirstem3=
Packit Service 4684c1
     case "$host_os" in
Packit Service 4684c1
       solaris*)
Packit Service 4684c1
         dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
Packit Service 4684c1
         dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
Packit Service 4684c1
         dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
Packit Service 4684c1
         dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
Packit Service 4684c1
         dnl symlink is missing, so we set acl_libdirstem2 too.
Packit Service 4684c1
         if test $HOST_CPU_C_ABI_32BIT = no; then
Packit Service 4684c1
           acl_libdirstem2=lib/64
Packit Service 4684c1
           case "$host_cpu" in
Packit Service 4684c1
             sparc*)        acl_libdirstem3=lib/sparcv9 ;;
Packit Service 4684c1
             i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
Packit Service 4684c1
           esac
Packit Service 4684c1
         fi
Packit Service 4684c1
         ;;
Packit Service 4684c1
       *)
Packit Service 4684c1
         dnl If $CC generates code for a 32-bit ABI, the libraries are
Packit Service 4684c1
         dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64.
Packit Service 4684c1
         dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries
Packit Service 4684c1
         dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32.
Packit Service 4684c1
         dnl Find the compiler's search path. However, non-system compilers
Packit Service 4684c1
         dnl sometimes have odd library search paths. But we can't simply invoke
Packit Service 4684c1
         dnl '/usr/bin/gcc -print-search-dirs' because that would not take into
Packit Service 4684c1
         dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS.
Packit Service 4684c1
         searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
Packit Service 4684c1
                     | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
Packit Service 4684c1
         if test $HOST_CPU_C_ABI_32BIT != no; then
Packit Service 4684c1
           # 32-bit or unknown ABI.
Packit Service 4684c1
           if test -d /usr/lib32; then
Packit Service 4684c1
             acl_libdirstem2=lib32
Packit Service 4684c1
           fi
Packit Service 4684c1
         fi
Packit Service 4684c1
         if test $HOST_CPU_C_ABI_32BIT != yes; then
Packit Service 4684c1
           # 64-bit or unknown ABI.
Packit Service 4684c1
           if test -d /usr/lib64; then
Packit Service 4684c1
             acl_libdirstem3=lib64
Packit Service 4684c1
           fi
Packit Service 4684c1
         fi
Packit Service 4684c1
         if test -n "$searchpath"; then
Packit Service 4684c1
           acl_save_IFS="${IFS= 	}"; IFS=":"
Packit Service 4684c1
           for searchdir in $searchpath; do
Packit Service 4684c1
             if test -d "$searchdir"; then
Packit Service 4684c1
               case "$searchdir" in
Packit Service 4684c1
                 */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
Packit Service 4684c1
                 */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
Packit Service 4684c1
                 */../ | */.. )
Packit Service 4684c1
                   # Better ignore directories of this form. They are misleading.
Packit Service 4684c1
                   ;;
Packit Service 4684c1
                 *) searchdir=`cd "$searchdir" && pwd`
Packit Service 4684c1
                    case "$searchdir" in
Packit Service 4684c1
                      */lib32 ) acl_libdirstem2=lib32 ;;
Packit Service 4684c1
                      */lib64 ) acl_libdirstem3=lib64 ;;
Packit Service 4684c1
                    esac ;;
Packit Service 4684c1
               esac
Packit Service 4684c1
             fi
Packit Service 4684c1
           done
Packit Service 4684c1
           IFS="$acl_save_IFS"
Packit Service 4684c1
           if test $HOST_CPU_C_ABI_32BIT = yes; then
Packit Service 4684c1
             # 32-bit ABI.
Packit Service 4684c1
             acl_libdirstem3=
Packit Service 4684c1
           fi
Packit Service 4684c1
           if test $HOST_CPU_C_ABI_32BIT = no; then
Packit Service 4684c1
             # 64-bit ABI.
Packit Service 4684c1
             acl_libdirstem2=
Packit Service 4684c1
           fi
Packit Service 4684c1
         fi
Packit Service 4684c1
         ;;
Packit Service 4684c1
     esac
Packit Service 4684c1
     test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
Packit Service 4684c1
     test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
Packit Service 4684c1
     acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
Packit Service 4684c1
    ])
Packit Service 4684c1
  dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and
Packit Service 4684c1
  dnl acl_libdirstem3.
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
  acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
Packit Service 4684c1
  acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
Packit Service 4684c1
  acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
])