xref: /src/sys/contrib/openzfs/config/lib-prefix.m4 (revision 8a62a2a5659d1839d8799b4274c04469d7f17c78)
1# SPDX-License-Identifier: FSFULLR
2# lib-prefix.m4 serial 14
3dnl Copyright (C) 2001-2005, 2008-2019 Free Software Foundation, Inc.
4dnl This file is free software; the Free Software Foundation
5dnl gives unlimited permission to copy and/or distribute it,
6dnl with or without modifications, as long as this notice is preserved.
7
8dnl From Bruno Haible.
9
10dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
11dnl to access previously installed libraries. The basic assumption is that
12dnl packages should use other packages that are installed with the same
13dnl --prefix option.  This macro is not needed if only AC_LIB_LINKFLAGS is
14dnl used to locate 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 variable acl_libdirstem, containing the basename of the libdir, either
151dnl   "lib" or "lib64" or "lib/64",
152dnl - a variable acl_libdirstem2, as a secondary possible value for
153dnl   acl_libdirstem, either the same as acl_libdirstem or "lib/sparcv9" or
154dnl   "lib/amd64".
155AC_DEFUN([AC_LIB_PREPARE_MULTILIB],
156[
157  dnl There is no formal standard regarding lib and lib64.
158  dnl On 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. We determine
161  dnl the compiler's default mode by looking at the compiler's library search
162  dnl path. If at least one of its elements ends in /lib64 or points to a
163  dnl directory whose absolute pathname ends in /lib64, we assume a 64-bit ABI.
164  dnl Otherwise we use the default, namely "lib".
165  dnl On Solaris systems, the current practice is that on a system supporting
166  dnl 32-bit and 64-bit instruction sets or ABIs, 64-bit libraries go under
167  dnl $prefix/lib/64 (which is a symlink to either $prefix/lib/sparcv9 or
168  dnl $prefix/lib/amd64) and 32-bit libraries go under $prefix/lib.
169  AC_REQUIRE([AC_CANONICAL_HOST])
170  AC_REQUIRE([gl_HOST_CPU_C_ABI_32BIT])
171
172  case "$host_os" in
173    solaris*)
174      AC_CACHE_CHECK([for 64-bit host], [gl_cv_solaris_64bit],
175        [AC_COMPILE_IFELSE(
176           [AC_LANG_SOURCE(
177              [[#ifdef _LP64
178                 int ok;
179                #else
180                 error fail
181                #endif
182              ]])],
183           [gl_cv_solaris_64bit=yes],
184           [gl_cv_solaris_64bit=no])
185        ]);;
186  esac
187
188  dnl Allow the user to override the result by setting acl_cv_libdirstems.
189  AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
190    [acl_cv_libdirstems],
191    [acl_libdirstem=lib
192     acl_libdirstem2=
193     case "$host_os" in
194       solaris*)
195         dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
196         dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
197         dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
198         dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
199         dnl symlink is missing, so we set acl_libdirstem2 too.
200         if test $gl_cv_solaris_64bit = yes; then
201           acl_libdirstem=lib/64
202           case "$host_cpu" in
203             sparc*)        acl_libdirstem2=lib/sparcv9 ;;
204             i*86 | x86_64) acl_libdirstem2=lib/amd64 ;;
205           esac
206         fi
207         ;;
208       *)
209         dnl If $CC generates code for a 32-bit ABI, the libraries are
210         dnl surely under $prefix/lib, not $prefix/lib64.
211         if test "$HOST_CPU_C_ABI_32BIT" != yes; then
212           dnl The result is a property of the system. However, non-system
213           dnl compilers sometimes have odd library search paths. Therefore
214           dnl prefer asking /usr/bin/gcc, if available, rather than $CC.
215           searchpath=`(if test -f /usr/bin/gcc \
216                           && LC_ALL=C /usr/bin/gcc -print-search-dirs >/dev/null 2>/dev/null; then \
217                          LC_ALL=C /usr/bin/gcc -print-search-dirs; \
218                        else \
219                          LC_ALL=C $CC -print-search-dirs; \
220                        fi) 2>/dev/null \
221                       | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
222           if test -n "$searchpath"; then
223             acl_save_IFS="${IFS= 	}"; IFS=":"
224             for searchdir in $searchpath; do
225               if test -d "$searchdir"; then
226                 case "$searchdir" in
227                   */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
228                   */../ | */.. )
229                     # Better ignore directories of this form. They are misleading.
230                     ;;
231                   *) searchdir=`cd "$searchdir" && pwd`
232                      case "$searchdir" in
233                        */lib64 ) acl_libdirstem=lib64 ;;
234                      esac ;;
235                 esac
236               fi
237             done
238             IFS="$acl_save_IFS"
239           fi
240         fi
241         ;;
242     esac
243     test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
244     acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2"
245    ])
246  # Decompose acl_cv_libdirstems into acl_libdirstem and acl_libdirstem2.
247  acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
248  acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e '/,/s/.*,//'`
249])
250