1 # lib-link.m4 serial 9 (gettext-0.16)
2 dnl Copyright (C) 2001-2006 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.
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 dnl Tell automake >= 1.10 to complain if config.rpath is missing.
99 m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
100 AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
101 AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
102 AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
103 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
104 AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
105 CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
106 ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
112 libext="$acl_cv_libext"
113 shlibext="$acl_cv_shlibext"
114 hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
115 hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
116 hardcode_direct="$acl_cv_hardcode_direct"
117 hardcode_minus_L="$acl_cv_hardcode_minus_L"
118 dnl Determine whether the user wants rpath handling at all.
120 [ --disable-rpath do not hardcode runtime library paths],
124 dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
125 dnl the libraries corresponding to explicit and implicit dependencies.
126 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
127 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
129 AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
130 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
131 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
132 dnl Autoconf >= 2.61 supports dots in --with options.
133 define([N_A_M_E],[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]),[2.61]),[-1],[translit([$1],[.],[_])],[$1])])
134 dnl By default, look in $includedir and $libdir.
136 AC_LIB_WITH_FINAL_PREFIX([
137 eval additional_includedir=\"$includedir\"
138 eval additional_libdir=\"$libdir\"
140 AC_LIB_ARG_WITH([lib]N_A_M_E[-prefix],
141 [ --with-lib]N_A_M_E[-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
142 --without-lib]N_A_M_E[-prefix don't search for lib$1 in includedir and libdir],
144 if test "X$withval" = "Xno"; then
147 if test "X$withval" = "X"; then
148 AC_LIB_WITH_FINAL_PREFIX([
149 eval additional_includedir=\"$includedir\"
150 eval additional_libdir=\"$libdir\"
153 additional_includedir="$withval/include"
154 additional_libdir="$withval/$acl_libdirstem"
158 dnl Search the library and its dependencies in $additional_libdir and
159 dnl $LDFLAGS. Using breadth-first-seach.
165 names_already_handled=
166 names_next_round='$1 $2'
167 while test -n "$names_next_round"; do
168 names_this_round="$names_next_round"
170 for name in $names_this_round; do
172 for n in $names_already_handled; do
173 if test "$n" = "$name"; then
178 if test -z "$already_handled"; then
179 names_already_handled="$names_already_handled $name"
180 dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
181 dnl or AC_LIB_HAVE_LINKFLAGS call.
182 uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
183 eval value=\"\$HAVE_LIB$uppername\"
184 if test -n "$value"; then
185 if test "$value" = yes; then
186 eval value=\"\$LIB$uppername\"
187 test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
188 eval value=\"\$LTLIB$uppername\"
189 test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
191 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
192 dnl that this library doesn't exist. So just drop it.
196 dnl Search the library lib$name in $additional_libdir and $LDFLAGS
197 dnl and the already constructed $LIBNAME/$LTLIBNAME.
202 if test $use_additional = yes; then
203 if test -n "$shlibext" \
204 && { test -f "$additional_libdir/lib$name.$shlibext" \
205 || { test "$shlibext" = dll \
206 && test -f "$additional_libdir/lib$name.dll.a"; }; }; then
207 found_dir="$additional_libdir"
208 if test -f "$additional_libdir/lib$name.$shlibext"; then
209 found_so="$additional_libdir/lib$name.$shlibext"
211 found_so="$additional_libdir/lib$name.dll.a"
213 if test -f "$additional_libdir/lib$name.la"; then
214 found_la="$additional_libdir/lib$name.la"
217 if test -f "$additional_libdir/lib$name.$libext"; then
218 found_dir="$additional_libdir"
219 found_a="$additional_libdir/lib$name.$libext"
220 if test -f "$additional_libdir/lib$name.la"; then
221 found_la="$additional_libdir/lib$name.la"
226 if test "X$found_dir" = "X"; then
227 for x in $LDFLAGS $LTLIB[]NAME; do
228 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
231 dir=`echo "X$x" | sed -e 's/^X-L//'`
232 if test -n "$shlibext" \
233 && { test -f "$dir/lib$name.$shlibext" \
234 || { test "$shlibext" = dll \
235 && test -f "$dir/lib$name.dll.a"; }; }; then
237 if test -f "$dir/lib$name.$shlibext"; then
238 found_so="$dir/lib$name.$shlibext"
240 found_so="$dir/lib$name.dll.a"
242 if test -f "$dir/lib$name.la"; then
243 found_la="$dir/lib$name.la"
246 if test -f "$dir/lib$name.$libext"; then
248 found_a="$dir/lib$name.$libext"
249 if test -f "$dir/lib$name.la"; then
250 found_la="$dir/lib$name.la"
256 if test "X$found_dir" != "X"; then
261 if test "X$found_dir" != "X"; then
262 dnl Found the library.
263 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
264 if test "X$found_so" != "X"; then
265 dnl Linking with a shared library. We attempt to hardcode its
266 dnl directory into the executable's runpath, unless it's the
267 dnl standard /usr/lib.
268 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
269 dnl No hardcoding is needed.
270 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
272 dnl Use an explicit option to hardcode DIR into the resulting
274 dnl Potentially add DIR to ltrpathdirs.
275 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
277 for x in $ltrpathdirs; do
278 if test "X$x" = "X$found_dir"; then
283 if test -z "$haveit"; then
284 ltrpathdirs="$ltrpathdirs $found_dir"
286 dnl The hardcoding into $LIBNAME is system dependent.
287 if test "$hardcode_direct" = yes; then
288 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
289 dnl resulting binary.
290 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
292 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
293 dnl Use an explicit option to hardcode DIR into the resulting
295 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
296 dnl Potentially add DIR to rpathdirs.
297 dnl The rpathdirs will be appended to $LIBNAME at the end.
299 for x in $rpathdirs; do
300 if test "X$x" = "X$found_dir"; then
305 if test -z "$haveit"; then
306 rpathdirs="$rpathdirs $found_dir"
309 dnl Rely on "-L$found_dir".
310 dnl But don't add it if it's already contained in the LDFLAGS
311 dnl or the already constructed $LIBNAME
313 for x in $LDFLAGS $LIB[]NAME; do
314 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
315 if test "X$x" = "X-L$found_dir"; then
320 if test -z "$haveit"; then
321 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
323 if test "$hardcode_minus_L" != no; then
324 dnl FIXME: Not sure whether we should use
325 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
327 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
329 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
330 dnl here, because this doesn't fit in flags passed to the
331 dnl compiler. So give up. No hardcoding. This affects only
332 dnl very old systems.
333 dnl FIXME: Not sure whether we should use
334 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
336 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
342 if test "X$found_a" != "X"; then
343 dnl Linking with a static library.
344 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
346 dnl We shouldn't come here, but anyway it's good to have a
348 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
351 dnl Assume the include files are nearby.
352 additional_includedir=
354 */$acl_libdirstem | */$acl_libdirstem/)
355 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
356 additional_includedir="$basedir/include"
359 if test "X$additional_includedir" != "X"; then
360 dnl Potentially add $additional_includedir to $INCNAME.
362 dnl 1. if it's the standard /usr/include,
363 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
364 dnl 3. if it's already present in $CPPFLAGS or the already
365 dnl constructed $INCNAME,
366 dnl 4. if it doesn't exist as a directory.
367 if test "X$additional_includedir" != "X/usr/include"; then
369 if test "X$additional_includedir" = "X/usr/local/include"; then
370 if test -n "$GCC"; then
372 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
376 if test -z "$haveit"; then
377 for x in $CPPFLAGS $INC[]NAME; do
378 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
379 if test "X$x" = "X-I$additional_includedir"; then
384 if test -z "$haveit"; then
385 if test -d "$additional_includedir"; then
386 dnl Really add $additional_includedir to $INCNAME.
387 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
393 dnl Look for dependencies.
394 if test -n "$found_la"; then
395 dnl Read the .la file. It defines the variables
396 dnl dlname, library_names, old_library, dependency_libs, current,
397 dnl age, revision, installed, dlopen, dlpreopen, libdir.
398 save_libdir="$libdir"
400 */* | *\\*) . "$found_la" ;;
401 *) . "./$found_la" ;;
403 libdir="$save_libdir"
404 dnl We use only dependency_libs.
405 for dep in $dependency_libs; do
408 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
409 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
411 dnl 1. if it's the standard /usr/lib,
412 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
413 dnl 3. if it's already present in $LDFLAGS or the already
414 dnl constructed $LIBNAME,
415 dnl 4. if it doesn't exist as a directory.
416 if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
418 if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
419 if test -n "$GCC"; then
421 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
425 if test -z "$haveit"; then
427 for x in $LDFLAGS $LIB[]NAME; do
428 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
429 if test "X$x" = "X-L$additional_libdir"; then
434 if test -z "$haveit"; then
435 if test -d "$additional_libdir"; then
436 dnl Really add $additional_libdir to $LIBNAME.
437 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
441 for x in $LDFLAGS $LTLIB[]NAME; do
442 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
443 if test "X$x" = "X-L$additional_libdir"; then
448 if test -z "$haveit"; then
449 if test -d "$additional_libdir"; then
450 dnl Really add $additional_libdir to $LTLIBNAME.
451 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
458 dir=`echo "X$dep" | sed -e 's/^X-R//'`
459 if test "$enable_rpath" != no; then
460 dnl Potentially add DIR to rpathdirs.
461 dnl The rpathdirs will be appended to $LIBNAME at the end.
463 for x in $rpathdirs; do
464 if test "X$x" = "X$dir"; then
469 if test -z "$haveit"; then
470 rpathdirs="$rpathdirs $dir"
472 dnl Potentially add DIR to ltrpathdirs.
473 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
475 for x in $ltrpathdirs; do
476 if test "X$x" = "X$dir"; then
481 if test -z "$haveit"; then
482 ltrpathdirs="$ltrpathdirs $dir"
487 dnl Handle this in the next round.
488 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
491 dnl Handle this in the next round. Throw away the .la's
492 dnl directory; it is already contained in a preceding -L
494 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
497 dnl Most likely an immediate library name.
498 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
499 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
505 dnl Didn't find the library; assume it is in the system directories
506 dnl known to the linker and runtime loader. (All the system
507 dnl directories known to the linker should also be known to the
508 dnl runtime loader, otherwise the system is severely misconfigured.)
509 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
510 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
516 if test "X$rpathdirs" != "X"; then
517 if test -n "$hardcode_libdir_separator"; then
518 dnl Weird platform: only the last -rpath option counts, the user must
519 dnl pass all path elements in one option. We can arrange that for a
520 dnl single library, but not when more than one $LIBNAMEs are used.
522 for found_dir in $rpathdirs; do
523 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
525 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
526 acl_save_libdir="$libdir"
528 eval flag=\"$hardcode_libdir_flag_spec\"
529 libdir="$acl_save_libdir"
530 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
532 dnl The -rpath options are cumulative.
533 for found_dir in $rpathdirs; do
534 acl_save_libdir="$libdir"
536 eval flag=\"$hardcode_libdir_flag_spec\"
537 libdir="$acl_save_libdir"
538 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
542 if test "X$ltrpathdirs" != "X"; then
543 dnl When using libtool, the option that works for both libraries and
544 dnl executables is -R. The -R options are cumulative.
545 for found_dir in $ltrpathdirs; do
546 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
551 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
552 dnl unless already present in VAR.
553 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
554 dnl contains two or three consecutive elements that belong together.
555 AC_DEFUN([AC_LIB_APPENDTOVAR],
557 for element in [$2]; do
560 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
561 if test "X$x" = "X$element"; then
566 if test -z "$haveit"; then
567 [$1]="${[$1]}${[$1]:+ }$element"
572 dnl For those cases where a variable contains several -L and -l options
573 dnl referring to unknown libraries and directories, this macro determines the
574 dnl necessary additional linker options for the runtime path.
575 dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
576 dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
577 dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
578 dnl otherwise linking without libtool is assumed.
579 AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
581 AC_REQUIRE([AC_LIB_RPATH])
582 AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
584 if test "$enable_rpath" != no; then
585 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
586 dnl Use an explicit option to hardcode directories into the resulting
591 if test -n "$next"; then
593 dnl No need to hardcode the standard /usr/lib.
594 if test "X$dir" != "X/usr/$acl_libdirstem"; then
595 rpathdirs="$rpathdirs $dir"
601 -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
602 dnl No need to hardcode the standard /usr/lib.
603 if test "X$dir" != "X/usr/$acl_libdirstem"; then
604 rpathdirs="$rpathdirs $dir"
611 if test "X$rpathdirs" != "X"; then
612 if test -n ""$3""; then
613 dnl libtool is used for linking. Use -R options.
614 for dir in $rpathdirs; do
615 $1="${$1}${$1:+ }-R$dir"
618 dnl The linker is used for linking directly.
619 if test -n "$hardcode_libdir_separator"; then
620 dnl Weird platform: only the last -rpath option counts, the user
621 dnl must pass all path elements in one option.
623 for dir in $rpathdirs; do
624 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir"
626 acl_save_libdir="$libdir"
628 eval flag=\"$hardcode_libdir_flag_spec\"
629 libdir="$acl_save_libdir"
632 dnl The -rpath options are cumulative.
633 for dir in $rpathdirs; do
634 acl_save_libdir="$libdir"
636 eval flag=\"$hardcode_libdir_flag_spec\"
637 libdir="$acl_save_libdir"
638 $1="${$1}${$1:+ }$flag"