]> www.ginac.de Git - ginac.git/blob - m4/lib-prefix.m4
[BUGFIX] Fix crash in parser.
[ginac.git] / m4 / lib-prefix.m4
1 # lib-prefix.m4 serial 20
2 dnl Copyright (C) 2001-2005, 2008-2022 Free Software Foundation, Inc.
3 dnl This file is free software; the Free Software Foundation
4 dnl gives unlimited permission to copy and/or distribute it,
5 dnl with or without modifications, as long as this notice is preserved.
6
7 dnl From Bruno Haible.
8
9 dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
10 dnl to access previously installed libraries. The basic assumption is that
11 dnl a user will want packages to use other packages he previously installed
12 dnl with the same --prefix option.
13 dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
14 dnl libraries, but is otherwise very convenient.
15 AC_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
112 dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
113 dnl acl_final_exec_prefix, containing the values to which $prefix and
114 dnl $exec_prefix will expand at the end of the configure script.
115 AC_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
135 dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
136 dnl variables prefix and exec_prefix bound to the values they will have
137 dnl at the end of the configure script.
138 AC_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
149 dnl AC_LIB_PREPARE_MULTILIB creates
150 dnl - a function acl_is_expected_elfclass, that tests whether standard input
151 dn;   has a 32-bit or 64-bit ELF header, depending on the host CPU ABI,
152 dnl - 3 variables acl_libdirstem, acl_libdirstem2, acl_libdirstem3, containing
153 dnl   the basename of the libdir to try in turn, either "lib" or "lib64" or
154 dnl   "lib/64" or "lib32" or "lib/sparcv9" or "lib/amd64" or similar.
155 AC_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        [#if defined __ELF__ || (defined __linux__ && defined __EDG__)
178         Extensible Linking Format
179         #endif
180        ],
181        [gl_cv_elf=yes],
182        [gl_cv_elf=no])
183     ])
184   if test $gl_cv_elf = yes; 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
201     # Use 'expr', not 'test', to compare the values of func_elfclass, because on
202     # Solaris 11 OpenIndiana and Solaris 11 OmniOS, the result is 001 or 002,
203     # not 1 or 2.
204 changequote(,)dnl
205     case $HOST_CPU_C_ABI_32BIT in
206       yes)
207         # 32-bit ABI.
208         acl_is_expected_elfclass ()
209         {
210           expr "`func_elfclass | sed -e 's/[    ]//g'`" = 1 > /dev/null
211         }
212         ;;
213       no)
214         # 64-bit ABI.
215         acl_is_expected_elfclass ()
216         {
217           expr "`func_elfclass | sed -e 's/[    ]//g'`" = 2 > /dev/null
218         }
219         ;;
220       *)
221         # Unknown.
222         acl_is_expected_elfclass ()
223         {
224           :
225         }
226         ;;
227     esac
228 changequote([,])dnl
229   else
230     acl_is_expected_elfclass ()
231     {
232       :
233     }
234   fi
235
236   dnl Allow the user to override the result by setting acl_cv_libdirstems.
237   AC_CACHE_CHECK([for the common suffixes of directories in the library search path],
238     [acl_cv_libdirstems],
239     [dnl Try 'lib' first, because that's the default for libdir in GNU, see
240      dnl <https://www.gnu.org/prep/standards/html_node/Directory-Variables.html>.
241      acl_libdirstem=lib
242      acl_libdirstem2=
243      acl_libdirstem3=
244      case "$host_os" in
245        solaris*)
246          dnl See Solaris 10 Software Developer Collection > Solaris 64-bit Developer's Guide > The Development Environment
247          dnl <https://docs.oracle.com/cd/E19253-01/816-5138/dev-env/index.html>.
248          dnl "Portable Makefiles should refer to any library directories using the 64 symbolic link."
249          dnl But we want to recognize the sparcv9 or amd64 subdirectory also if the
250          dnl symlink is missing, so we set acl_libdirstem2 too.
251          if test $HOST_CPU_C_ABI_32BIT = no; then
252            acl_libdirstem2=lib/64
253            case "$host_cpu" in
254              sparc*)        acl_libdirstem3=lib/sparcv9 ;;
255              i*86 | x86_64) acl_libdirstem3=lib/amd64 ;;
256            esac
257          fi
258          ;;
259        *)
260          dnl If $CC generates code for a 32-bit ABI, the libraries are
261          dnl surely under $prefix/lib or $prefix/lib32, not $prefix/lib64.
262          dnl Similarly, if $CC generates code for a 64-bit ABI, the libraries
263          dnl are surely under $prefix/lib or $prefix/lib64, not $prefix/lib32.
264          dnl Find the compiler's search path. However, non-system compilers
265          dnl sometimes have odd library search paths. But we can't simply invoke
266          dnl '/usr/bin/gcc -print-search-dirs' because that would not take into
267          dnl account the -m32/-m31 or -m64 options from the $CC or $CFLAGS.
268          searchpath=`(LC_ALL=C $CC $CPPFLAGS $CFLAGS -print-search-dirs) 2>/dev/null \
269                      | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
270          if test $HOST_CPU_C_ABI_32BIT != no; then
271            # 32-bit or unknown ABI.
272            if test -d /usr/lib32; then
273              acl_libdirstem2=lib32
274            fi
275          fi
276          if test $HOST_CPU_C_ABI_32BIT != yes; then
277            # 64-bit or unknown ABI.
278            if test -d /usr/lib64; then
279              acl_libdirstem3=lib64
280            fi
281          fi
282          if test -n "$searchpath"; then
283            acl_save_IFS="${IFS=         }"; IFS=":"
284            for searchdir in $searchpath; do
285              if test -d "$searchdir"; then
286                case "$searchdir" in
287                  */lib32/ | */lib32 ) acl_libdirstem2=lib32 ;;
288                  */lib64/ | */lib64 ) acl_libdirstem3=lib64 ;;
289                  */../ | */.. )
290                    # Better ignore directories of this form. They are misleading.
291                    ;;
292                  *) searchdir=`cd "$searchdir" && pwd`
293                     case "$searchdir" in
294                       */lib32 ) acl_libdirstem2=lib32 ;;
295                       */lib64 ) acl_libdirstem3=lib64 ;;
296                     esac ;;
297                esac
298              fi
299            done
300            IFS="$acl_save_IFS"
301            if test $HOST_CPU_C_ABI_32BIT = yes; then
302              # 32-bit ABI.
303              acl_libdirstem3=
304            fi
305            if test $HOST_CPU_C_ABI_32BIT = no; then
306              # 64-bit ABI.
307              acl_libdirstem2=
308            fi
309          fi
310          ;;
311      esac
312      test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem"
313      test -n "$acl_libdirstem3" || acl_libdirstem3="$acl_libdirstem"
314      acl_cv_libdirstems="$acl_libdirstem,$acl_libdirstem2,$acl_libdirstem3"
315     ])
316   dnl Decompose acl_cv_libdirstems into acl_libdirstem, acl_libdirstem2, and
317   dnl acl_libdirstem3.
318 changequote(,)dnl
319   acl_libdirstem=`echo "$acl_cv_libdirstems" | sed -e 's/,.*//'`
320   acl_libdirstem2=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,//' -e 's/,.*//'`
321   acl_libdirstem3=`echo "$acl_cv_libdirstems" | sed -e 's/^[^,]*,[^,]*,//' -e 's/,.*//'`
322 changequote([,])dnl
323 ])