1 # lib-link.m4 serial 4 (gettext-0.12)
2 dnl Copyright (C) 2001-2003 Free Software Foundation, Inc.
3 dnl This file is free software, distributed under the terms of the GNU
4 dnl General Public License. As a special exception to the GNU General
5 dnl Public License, this file may be distributed as part of a program
6 dnl that contains a configuration script generated by Autoconf, under
7 dnl the same distribution terms as the rest of that program.
11 dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
12 dnl the libraries corresponding to explicit and implicit dependencies.
13 dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
14 dnl augments the CPPFLAGS variable.
15 AC_DEFUN([AC_LIB_LINKFLAGS],
17 AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
18 AC_REQUIRE([AC_LIB_RPATH])
19 define([Name],[translit([$1],[./-], [___])])
20 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
21 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
22 AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
23 AC_LIB_LINKFLAGS_BODY([$1], [$2])
24 ac_cv_lib[]Name[]_libs="$LIB[]NAME"
25 ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
26 ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
28 LIB[]NAME="$ac_cv_lib[]Name[]_libs"
29 LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
30 INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
31 AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
34 dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
35 dnl results of this search when this library appears as a dependency.
41 dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
42 dnl searches for libname and the libraries corresponding to explicit and
43 dnl implicit dependencies, together with the specified include files and
44 dnl the ability to compile and link the specified testcode. If found, it
45 dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
46 dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
47 dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
48 dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
49 AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
51 AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
52 AC_REQUIRE([AC_LIB_RPATH])
53 define([Name],[translit([$1],[./-], [___])])
54 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
55 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
57 dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
59 AC_LIB_LINKFLAGS_BODY([$1], [$2])
61 dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
62 dnl because if the user has installed lib[]Name and not disabled its use
63 dnl via --without-lib[]Name-prefix, he wants to use it.
64 ac_save_CPPFLAGS="$CPPFLAGS"
65 AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
67 AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
69 LIBS="$LIBS $LIB[]NAME"
70 AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
73 if test "$ac_cv_lib[]Name" = yes; then
75 AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
76 AC_MSG_CHECKING([how to link with lib[]$1])
77 AC_MSG_RESULT([$LIB[]NAME])
80 dnl If $LIB[]NAME didn't lead to a usable library, we don't need
81 dnl $INC[]NAME either.
82 CPPFLAGS="$ac_save_CPPFLAGS"
86 AC_SUBST([HAVE_LIB]NAME)
93 dnl Determine the platform dependent parameters needed to use rpath:
94 dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
95 dnl hardcode_direct, hardcode_minus_L.
96 AC_DEFUN([AC_LIB_RPATH],
98 AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
99 AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
100 AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
101 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
102 AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
103 CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
104 ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
110 libext="$acl_cv_libext"
111 shlibext="$acl_cv_shlibext"
112 hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
113 hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
114 hardcode_direct="$acl_cv_hardcode_direct"
115 hardcode_minus_L="$acl_cv_hardcode_minus_L"
116 dnl Determine whether the user wants rpath handling at all.
118 [ --disable-rpath do not hardcode runtime library paths],
122 dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
123 dnl the libraries corresponding to explicit and implicit dependencies.
124 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
125 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
127 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
128 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
129 dnl By default, look in $includedir and $libdir.
131 AC_LIB_WITH_FINAL_PREFIX([
132 eval additional_includedir=\"$includedir\"
133 eval additional_libdir=\"$libdir\"
135 AC_LIB_ARG_WITH([lib$1-prefix],
136 [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
137 --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
139 if test "X$withval" = "Xno"; then
142 if test "X$withval" = "X"; then
143 AC_LIB_WITH_FINAL_PREFIX([
144 eval additional_includedir=\"$includedir\"
145 eval additional_libdir=\"$libdir\"
148 additional_includedir="$withval/include"
149 additional_libdir="$withval/lib"
153 dnl Search the library and its dependencies in $additional_libdir and
154 dnl $LDFLAGS. Using breadth-first-seach.
160 names_already_handled=
161 names_next_round='$1 $2'
162 while test -n "$names_next_round"; do
163 names_this_round="$names_next_round"
165 for name in $names_this_round; do
167 for n in $names_already_handled; do
168 if test "$n" = "$name"; then
173 if test -z "$already_handled"; then
174 names_already_handled="$names_already_handled $name"
175 dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
176 dnl or AC_LIB_HAVE_LINKFLAGS call.
177 uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
178 eval value=\"\$HAVE_LIB$uppername\"
179 if test -n "$value"; then
180 if test "$value" = yes; then
181 eval value=\"\$LIB$uppername\"
182 test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
183 eval value=\"\$LTLIB$uppername\"
184 test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
186 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
187 dnl that this library doesn't exist. So just drop it.
191 dnl Search the library lib$name in $additional_libdir and $LDFLAGS
192 dnl and the already constructed $LIBNAME/$LTLIBNAME.
197 if test $use_additional = yes; then
198 if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
199 found_dir="$additional_libdir"
200 found_so="$additional_libdir/lib$name.$shlibext"
201 if test -f "$additional_libdir/lib$name.la"; then
202 found_la="$additional_libdir/lib$name.la"
205 if test -f "$additional_libdir/lib$name.$libext"; then
206 found_dir="$additional_libdir"
207 found_a="$additional_libdir/lib$name.$libext"
208 if test -f "$additional_libdir/lib$name.la"; then
209 found_la="$additional_libdir/lib$name.la"
214 if test "X$found_dir" = "X"; then
215 for x in $LDFLAGS $LTLIB[]NAME; do
216 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
219 dir=`echo "X$x" | sed -e 's/^X-L//'`
220 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
222 found_so="$dir/lib$name.$shlibext"
223 if test -f "$dir/lib$name.la"; then
224 found_la="$dir/lib$name.la"
227 if test -f "$dir/lib$name.$libext"; then
229 found_a="$dir/lib$name.$libext"
230 if test -f "$dir/lib$name.la"; then
231 found_la="$dir/lib$name.la"
237 if test "X$found_dir" != "X"; then
242 if test "X$found_dir" != "X"; then
243 dnl Found the library.
244 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
245 if test "X$found_so" != "X"; then
246 dnl Linking with a shared library. We attempt to hardcode its
247 dnl directory into the executable's runpath, unless it's the
248 dnl standard /usr/lib.
249 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
250 dnl No hardcoding is needed.
251 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
253 dnl Use an explicit option to hardcode DIR into the resulting
255 dnl Potentially add DIR to ltrpathdirs.
256 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
258 for x in $ltrpathdirs; do
259 if test "X$x" = "X$found_dir"; then
264 if test -z "$haveit"; then
265 ltrpathdirs="$ltrpathdirs $found_dir"
267 dnl The hardcoding into $LIBNAME is system dependent.
268 if test "$hardcode_direct" = yes; then
269 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
270 dnl resulting binary.
271 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
273 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
274 dnl Use an explicit option to hardcode DIR into the resulting
276 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
277 dnl Potentially add DIR to rpathdirs.
278 dnl The rpathdirs will be appended to $LIBNAME at the end.
280 for x in $rpathdirs; do
281 if test "X$x" = "X$found_dir"; then
286 if test -z "$haveit"; then
287 rpathdirs="$rpathdirs $found_dir"
290 dnl Rely on "-L$found_dir".
291 dnl But don't add it if it's already contained in the LDFLAGS
292 dnl or the already constructed $LIBNAME
294 for x in $LDFLAGS $LIB[]NAME; do
295 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
296 if test "X$x" = "X-L$found_dir"; then
301 if test -z "$haveit"; then
302 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
304 if test "$hardcode_minus_L" != no; then
305 dnl FIXME: Not sure whether we should use
306 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
308 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
310 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
311 dnl here, because this doesn't fit in flags passed to the
312 dnl compiler. So give up. No hardcoding. This affects only
313 dnl very old systems.
314 dnl FIXME: Not sure whether we should use
315 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
317 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
323 if test "X$found_a" != "X"; then
324 dnl Linking with a static library.
325 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
327 dnl We shouldn't come here, but anyway it's good to have a
329 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
332 dnl Assume the include files are nearby.
333 additional_includedir=
336 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
337 additional_includedir="$basedir/include"
340 if test "X$additional_includedir" != "X"; then
341 dnl Potentially add $additional_includedir to $INCNAME.
343 dnl 1. if it's the standard /usr/include,
344 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
345 dnl 3. if it's already present in $CPPFLAGS or the already
346 dnl constructed $INCNAME,
347 dnl 4. if it doesn't exist as a directory.
348 if test "X$additional_includedir" != "X/usr/include"; then
350 if test "X$additional_includedir" = "X/usr/local/include"; then
351 if test -n "$GCC"; then
357 if test -z "$haveit"; then
358 for x in $CPPFLAGS $INC[]NAME; do
359 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
360 if test "X$x" = "X-I$additional_includedir"; then
365 if test -z "$haveit"; then
366 if test -d "$additional_includedir"; then
367 dnl Really add $additional_includedir to $INCNAME.
368 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
374 dnl Look for dependencies.
375 if test -n "$found_la"; then
376 dnl Read the .la file. It defines the variables
377 dnl dlname, library_names, old_library, dependency_libs, current,
378 dnl age, revision, installed, dlopen, dlpreopen, libdir.
379 save_libdir="$libdir"
381 */* | *\\*) . "$found_la" ;;
382 *) . "./$found_la" ;;
384 libdir="$save_libdir"
385 dnl We use only dependency_libs.
386 for dep in $dependency_libs; do
389 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
390 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
392 dnl 1. if it's the standard /usr/lib,
393 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
394 dnl 3. if it's already present in $LDFLAGS or the already
395 dnl constructed $LIBNAME,
396 dnl 4. if it doesn't exist as a directory.
397 if test "X$additional_libdir" != "X/usr/lib"; then
399 if test "X$additional_libdir" = "X/usr/local/lib"; then
400 if test -n "$GCC"; then
406 if test -z "$haveit"; then
408 for x in $LDFLAGS $LIB[]NAME; do
409 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
410 if test "X$x" = "X-L$additional_libdir"; then
415 if test -z "$haveit"; then
416 if test -d "$additional_libdir"; then
417 dnl Really add $additional_libdir to $LIBNAME.
418 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
422 for x in $LDFLAGS $LTLIB[]NAME; do
423 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
424 if test "X$x" = "X-L$additional_libdir"; then
429 if test -z "$haveit"; then
430 if test -d "$additional_libdir"; then
431 dnl Really add $additional_libdir to $LTLIBNAME.
432 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
439 dir=`echo "X$dep" | sed -e 's/^X-R//'`
440 if test "$enable_rpath" != no; then
441 dnl Potentially add DIR to rpathdirs.
442 dnl The rpathdirs will be appended to $LIBNAME at the end.
444 for x in $rpathdirs; do
445 if test "X$x" = "X$dir"; then
450 if test -z "$haveit"; then
451 rpathdirs="$rpathdirs $dir"
453 dnl Potentially add DIR to ltrpathdirs.
454 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
456 for x in $ltrpathdirs; do
457 if test "X$x" = "X$dir"; then
462 if test -z "$haveit"; then
463 ltrpathdirs="$ltrpathdirs $dir"
468 dnl Handle this in the next round.
469 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
472 dnl Handle this in the next round. Throw away the .la's
473 dnl directory; it is already contained in a preceding -L
475 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
478 dnl Most likely an immediate library name.
479 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
480 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
486 dnl Didn't find the library; assume it is in the system directories
487 dnl known to the linker and runtime loader. (All the system
488 dnl directories known to the linker should also be known to the
489 dnl runtime loader, otherwise the system is severely misconfigured.)
490 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
491 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
497 if test "X$rpathdirs" != "X"; then
498 if test -n "$hardcode_libdir_separator"; then
499 dnl Weird platform: only the last -rpath option counts, the user must
500 dnl pass all path elements in one option. We can arrange that for a
501 dnl single library, but not when more than one $LIBNAMEs are used.
503 for found_dir in $rpathdirs; do
504 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
506 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
507 acl_save_libdir="$libdir"
509 eval flag=\"$hardcode_libdir_flag_spec\"
510 libdir="$acl_save_libdir"
511 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
513 dnl The -rpath options are cumulative.
514 for found_dir in $rpathdirs; do
515 acl_save_libdir="$libdir"
517 eval flag=\"$hardcode_libdir_flag_spec\"
518 libdir="$acl_save_libdir"
519 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
523 if test "X$ltrpathdirs" != "X"; then
524 dnl When using libtool, the option that works for both libraries and
525 dnl executables is -R. The -R options are cumulative.
526 for found_dir in $ltrpathdirs; do
527 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
532 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
533 dnl unless already present in VAR.
534 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
535 dnl contains two or three consecutive elements that belong together.
536 AC_DEFUN([AC_LIB_APPENDTOVAR],
538 for element in [$2]; do
541 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
542 if test "X$x" = "X$element"; then
547 if test -z "$haveit"; then
548 [$1]="${[$1]}${[$1]:+ }$element"