1# lib-prefix.m4 serial 17
2dnl Copyright (C) 2001-2005, 2008-2020 Free Software Foundation, Inc.
3dnl This file is free software; the Free Software Foundation
4dnl gives unlimited permission to copy and/or distribute it,
5dnl with or without modifications, as long as this notice is preserved.
6
7dnl From Bruno Haible.
8
9dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
10dnl to access previously installed libraries. The basic assumption is that
11dnl a user will want packages to use other packages he previously installed
12dnl with the same --prefix option.
13dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
14dnl libraries, but is otherwise very convenient.
15AC_DEFUN([AC_LIB_PREFIX],
16[
17  AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
18  AC_REQUIRE([AC_PROG_CC])
19  AC_REQUIRE([AC_CANONICAL_HOST])
20  AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
21  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
22  dnl By default, look in $includedir and $libdir.
23  use_additional=yes
24  AC_LIB_WITH_FINAL_PREFIX([
25    eval additional_includedir=\"$includedir\"
26    eval additional_libdir=\"$libdir\"
27  ])
28  AC_ARG_WITH([lib-prefix],
29[[  --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
30  --without-lib-prefix    don't search for libraries in includedir and libdir]],
31[
32    if test "X$withval" = "Xno"; then
33      use_additional=no
34    else
35      if test "X$withval" = "X"; then
36        AC_LIB_WITH_FINAL_PREFIX([
37          eval additional_includedir=\"$includedir\"
38          eval additional_libdir=\"$libdir\"
39        ])
40      else
41        additional_includedir="$withval/include"
42        additional_libdir="$withval/$acl_libdirstem"
43      fi
44    fi
45])
46  if test $use_additional = yes; then
47    dnl Potentially add $additional_includedir to $CPPFLAGS.
48    dnl But don't add it
49    dnl   1. if it's the standard /usr/include,
50    dnl   2. if it's already present in $CPPFLAGS,
51    dnl   3. if it's /usr/local/include and we are using GCC on Linux,
52    dnl   4. if it doesn't exist as a directory.
53    if test "X$additional_includedir" != "X/usr/include"; then
54      haveit=
55      for x in $CPPFLAGS; do
56        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
57        if test "X$x" = "X-I$additional_includedir"; then
58          haveit=yes
59          break
60        fi
61      done
62      if test -z "$haveit"; then
63        if test "X$additional_includedir" = "X/usr/local/include"; then
64          if test -n "$GCC"; then
65            case $host_os in
66              linux* | gnu* | k*bsd*-gnu) haveit=yes;;
67            esac
68          fi
69        fi
70        if test -z "$haveit"; then
71          if test -d "$additional_includedir"; then
72            dnl Really add $additional_includedir to $CPPFLAGS.
73            CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
74          fi
75        fi
76      fi
77    fi
78    dnl Potentially add $additional_libdir to $LDFLAGS.
79    dnl But don't add it
80    dnl   1. if it's the standard /usr/lib,
81    dnl   2. if it's already present in $LDFLAGS,
82    dnl   3. if it's /usr/local/lib and we are using GCC on Linux,
83    dnl   4. if it doesn't exist as a directory.
84    if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
85      haveit=
86      for x in $LDFLAGS; do
87        AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
88        if test "X$x" = "X-L$additional_libdir"; then
89          haveit=yes
90          break
91        fi
92      done
93      if test -z "$haveit"; then
94        if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
95          if test -n "$GCC"; then
96            case $host_os in
97              linux*) haveit=yes;;
98            esac
99          fi
100        fi
101        if test -z "$haveit"; then
102          if test -d "$additional_libdir"; then
103            dnl Really add $additional_libdir to $LDFLAGS.
104            LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
105          fi
106        fi
107      fi
108    fi
109  fi
110])
111
112dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
113dnl acl_final_exec_prefix, containing the values to which $prefix and
114dnl $exec_prefix will expand at the end of the configure script.
115AC_DEFUN([AC_LIB_PREPARE_PREFIX],
116[
117  dnl Unfortunately, prefix and exec_prefix get only finally determined
118  dnl at the end of configure.
119  if test "X$prefix" = "XNONE"; then
120    acl_final_prefix="$ac_default_prefix"
121  else
122    acl_final_prefix="$prefix"
123  fi
124  if test "X$exec_prefix" = "XNONE"; then
125    acl_final_exec_prefix='${prefix}'
126  else
127    acl_final_exec_prefix="$exec_prefix"
128  fi
129  acl_save_prefix="$prefix"
130  prefix="$acl_final_prefix"
131  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
132  prefix="$acl_save_prefix"
133])
134
135dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
136dnl variables prefix and exec_prefix bound to the values they will have
137dnl at the end of the configure script.
138AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
139[
140  acl_save_prefix="$prefix"
141  prefix="$acl_final_prefix"
142  acl_save_exec_prefix="$exec_prefix"
143  exec_prefix="$acl_final_exec_prefix"
144  $1
145  exec_prefix="$acl_save_exec_prefix"
146  prefix="$acl_save_prefix"
147])
148
149dnl AC_LIB_PREPARE_MULTILIB creates
150dnl - a function acl_is_expected_elfclass, that tests whether standard input
151dn;   has a 32-bit or 64-bit ELF header, depending on the host CPU ABI,
152dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing
153dnl   the basename of the libdir to try in turn, either "lib" or "lib64" or
154dnl   "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar.
155AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
156[
157  dnl There is no formal standard regarding lib, lib32, and lib64.
158  dnl On most glibc systems, the current practice is that on a system supporting
159  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
160  dnl $prefix/lib64 and 32-bit libraries go under $prefix/lib. However, on
161  dnl Arch Linux based distributions, it's the opposite: 32-bit libraries go
162  dnl under $prefix/lib32 and 64-bit libraries go under $prefix/lib.
163  dnl We determine the compiler's default mode by looking at the compiler's
164  dnl library search path. If at least one of its elements ends in /lib64 or
165  dnl points to a directory whose absolute pathname ends in /lib64, we use that
166  dnl for 64-bit ABIs. Similarly for 32-bit ABIs. Otherwise we use the default,
167  dnl namely "lib".
168  dnl On Solaris systems, the current practice is that on a system supporting
169  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
170  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
171  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
172  AC_REQUIRE([AC_CANONICAL_HOST])
173  AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT])
174
175  AC_CACHE_CHECK([for ELF binary format], [gl_cv_elf],
176    [AC_EGREP_CPP([Extensible Linking Format],
177       [#ifdef __ELF__
178        Extensible Linking Format
179        #endif
180       ],
181       [gl_cv_elf=yes],
182       [gl_cv_elf=no])
183     ])
184  if test $gl_cv_elf; then
185    # Extract the ELF class of a file (5th byte) in decimal.
186    # Cf. https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
187    if od -A x < /dev/null >/dev/null 2>/dev/null; then
188      # Use POSIX od.
189      func_elfclass ()
190      {
191        od -A n -t d1 -j 4 -N 1
192      }
193    else
194      # Use BSD hexdump.
195      func_elfclass ()
196      {
197        dd bs=1 count=1 skip=4 2>/dev/null | hexdump -e '1/1 "%3d "'
198        echo
199      }
200    fi
201changequote(,)dnl
202    case $HOST_CPU_C_ABI_32BIT in
203      yes)
204        # 32-bit ABI.
205        acl_is_expected_elfclass ()
206        {
207          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 1
208        }
209        ;;
210      no)
211        # 64-bit ABI.
212        acl_is_expected_elfclass ()
213        {
214          test "`func_elfclass | sed -e 's/[ 	]//g'`" = 2
215        }
216        ;;
217      *)
218        # Unknown.
219        acl_is_expected_elfclass ()
220        {
221          :
222        }
223        ;;
224    esac
225changequote([,])dnl
226  else
227    acl_is_expected_elfclass ()
228    {
229      :
230    }
231  fi
232
233  dnl Allow the user to override the result by setting acl_cv_libdirstems.
234  AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
235    [acl_cv_libdirstems],
236    [dnl Try 'lib' first, because that's the default for libdir in GNU, see
237     dnl <https://www.gnu.org/prep/standards/html_node/Directory-Variables.html>.
238     acl_libdirstem=lib
239     acl_libdirstem2=
240     acl_libdirstem3=
241     case "$host_os" in
242       solaris*)
243         dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
244         dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
245         dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
246         dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
247         dnl symlink is missing, so we set acl_libdirstem2 too.
248         if test $HOST_CPU_C_ABI_32BIT = no; then
249           acl_libdirstem2=lib/64
250           case "$host_cpu" in
251             sparc*)        acl_libdirstem3=lib/sparcv9 ;;
252             i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
253           esac
254         fi
255         ;;
256       *)
257         dnl If $CC generates code for a 32-bit ABI, the libraries are
258         dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64.
259         dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries
260         dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32.
261         dnl Find the compiler's search path. However, non-system compilers
262         dnl sometimes have odd library search paths. But we can't simply invoke
263         dnl '/usr/bin/gcc -print-search-dirs' because that would not take into
264         dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS.
265         searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
266                     | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
267         if test $HOST_CPU_C_ABI_32BIT != no; then
268           # 32-bit or unknown ABI.
269           if test -d /usr/lib32; then
270             acl_libdirstem2=lib32
271           fi
272         fi
273         if test $HOST_CPU_C_ABI_32BIT != yes; then
274           # 64-bit or unknown ABI.
275           if test -d /usr/lib64; then
276             acl_libdirstem3=lib64
277           fi
278         fi
279         if test -n "$searchpath"; then
280           acl_save_IFS="${IFS= 	}"; IFS=":"
281           for searchdir in $searchpath; do
282             if test -d "$searchdir"; then
283               case "$searchdir" in
284                 */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
285                 */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
286                 */../ | */.. )
287                   # Better ignore directories of this form. They are misleading.
288                   ;;
289                 *) searchdir=`cd "$searchdir" && pwd`
290                    case "$searchdir" in
291                      */lib32 ) acl_libdirstem2=lib32 ;;
292                      */lib64 ) acl_libdirstem3=lib64 ;;
293                    esac ;;
294               esac
295             fi
296           done
297           IFS="$acl_save_IFS"
298           if test $HOST_CPU_C_ABI_32BIT = yes; then
299             # 32-bit ABI.
300             acl_libdirstem3=
301           fi
302           if test $HOST_CPU_C_ABI_32BIT = no; then
303             # 64-bit ABI.
304             acl_libdirstem2=
305           fi
306         fi
307         ;;
308     esac
309     test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
310     test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
311     acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
312    ])
313  dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and
314  dnl acl_libdirstem3.
315changequote(,)dnl
316  acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
317  acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
318  acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
319changequote([,])dnl
320])
321