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 By default, look in $includedir and $libdir.
134 AC_LIB_WITH_FINAL_PREFIX([
135 eval additional_includedir=\"$includedir\"
136 eval additional_libdir=\"$libdir\"
138 AC_LIB_ARG_WITH([lib$1-prefix],
139 [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
140 --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
142 if test "X$withval" = "Xno"; then
145 if test "X$withval" = "X"; then
146 AC_LIB_WITH_FINAL_PREFIX([
147 eval additional_includedir=\"$includedir\"
148 eval additional_libdir=\"$libdir\"
151 additional_includedir="$withval/include"
152 additional_libdir="$withval/$acl_libdirstem"
156 dnl Search the library and its dependencies in $additional_libdir and
157 dnl $LDFLAGS. Using breadth-first-seach.
163 names_already_handled=
164 names_next_round='$1 $2'
165 while test -n "$names_next_round"; do
166 names_this_round="$names_next_round"
168 for name in $names_this_round; do
170 for n in $names_already_handled; do
171 if test "$n" = "$name"; then
176 if test -z "$already_handled"; then
177 names_already_handled="$names_already_handled $name"
178 dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
179 dnl or AC_LIB_HAVE_LINKFLAGS call.
180 uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
181 eval value=\"\$HAVE_LIB$uppername\"
182 if test -n "$value"; then
183 if test "$value" = yes; then
184 eval value=\"\$LIB$uppername\"
185 test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
186 eval value=\"\$LTLIB$uppername\"
187 test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
189 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
190 dnl that this library doesn't exist. So just drop it.
194 dnl Search the library lib$name in $additional_libdir and $LDFLAGS
195 dnl and the already constructed $LIBNAME/$LTLIBNAME.
200 if test $use_additional = yes; then
201 if test -n "$shlibext" \
202 && { test -f "$additional_libdir/lib$name.$shlibext" \
203 || { test "$shlibext" = dll \
204 && test -f "$additional_libdir/lib$name.dll.a"; }; }; then
205 found_dir="$additional_libdir"
206 if test -f "$additional_libdir/lib$name.$shlibext"; then
207 found_so="$additional_libdir/lib$name.$shlibext"
209 found_so="$additional_libdir/lib$name.dll.a"
211 if test -f "$additional_libdir/lib$name.la"; then
212 found_la="$additional_libdir/lib$name.la"
215 if test -f "$additional_libdir/lib$name.$libext"; then
216 found_dir="$additional_libdir"
217 found_a="$additional_libdir/lib$name.$libext"
218 if test -f "$additional_libdir/lib$name.la"; then
219 found_la="$additional_libdir/lib$name.la"
224 if test "X$found_dir" = "X"; then
225 for x in $LDFLAGS $LTLIB[]NAME; do
226 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
229 dir=`echo "X$x" | sed -e 's/^X-L//'`
230 if test -n "$shlibext" \
231 && { test -f "$dir/lib$name.$shlibext" \
232 || { test "$shlibext" = dll \
233 && test -f "$dir/lib$name.dll.a"; }; }; then
235 if test -f "$dir/lib$name.$shlibext"; then
236 found_so="$dir/lib$name.$shlibext"
238 found_so="$dir/lib$name.dll.a"
240 if test -f "$dir/lib$name.la"; then
241 found_la="$dir/lib$name.la"
244 if test -f "$dir/lib$name.$libext"; then
246 found_a="$dir/lib$name.$libext"
247 if test -f "$dir/lib$name.la"; then
248 found_la="$dir/lib$name.la"
254 if test "X$found_dir" != "X"; then
259 if test "X$found_dir" != "X"; then
260 dnl Found the library.
261 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
262 if test "X$found_so" != "X"; then
263 dnl Linking with a shared library. We attempt to hardcode its
264 dnl directory into the executable's runpath, unless it's the
265 dnl standard /usr/lib.
266 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
267 dnl No hardcoding is needed.
268 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
270 dnl Use an explicit option to hardcode DIR into the resulting
272 dnl Potentially add DIR to ltrpathdirs.
273 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
275 for x in $ltrpathdirs; do
276 if test "X$x" = "X$found_dir"; then
281 if test -z "$haveit"; then
282 ltrpathdirs="$ltrpathdirs $found_dir"
284 dnl The hardcoding into $LIBNAME is system dependent.
285 if test "$hardcode_direct" = yes; then
286 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
287 dnl resulting binary.
288 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
290 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
291 dnl Use an explicit option to hardcode DIR into the resulting
293 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
294 dnl Potentially add DIR to rpathdirs.
295 dnl The rpathdirs will be appended to $LIBNAME at the end.
297 for x in $rpathdirs; do
298 if test "X$x" = "X$found_dir"; then
303 if test -z "$haveit"; then
304 rpathdirs="$rpathdirs $found_dir"
307 dnl Rely on "-L$found_dir".
308 dnl But don't add it if it's already contained in the LDFLAGS
309 dnl or the already constructed $LIBNAME
311 for x in $LDFLAGS $LIB[]NAME; do
312 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
313 if test "X$x" = "X-L$found_dir"; then
318 if test -z "$haveit"; then
319 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
321 if test "$hardcode_minus_L" != no; then
322 dnl FIXME: Not sure whether we should use
323 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
325 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
327 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
328 dnl here, because this doesn't fit in flags passed to the
329 dnl compiler. So give up. No hardcoding. This affects only
330 dnl very old systems.
331 dnl FIXME: Not sure whether we should use
332 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
334 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
340 if test "X$found_a" != "X"; then
341 dnl Linking with a static library.
342 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
344 dnl We shouldn't come here, but anyway it's good to have a
346 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
349 dnl Assume the include files are nearby.
350 additional_includedir=
352 */$acl_libdirstem | */$acl_libdirstem/)
353 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
354 additional_includedir="$basedir/include"
357 if test "X$additional_includedir" != "X"; then
358 dnl Potentially add $additional_includedir to $INCNAME.
360 dnl 1. if it's the standard /usr/include,
361 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
362 dnl 3. if it's already present in $CPPFLAGS or the already
363 dnl constructed $INCNAME,
364 dnl 4. if it doesn't exist as a directory.
365 if test "X$additional_includedir" != "X/usr/include"; then
367 if test "X$additional_includedir" = "X/usr/local/include"; then
368 if test -n "$GCC"; then
370 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
374 if test -z "$haveit"; then
375 for x in $CPPFLAGS $INC[]NAME; do
376 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
377 if test "X$x" = "X-I$additional_includedir"; then
382 if test -z "$haveit"; then
383 if test -d "$additional_includedir"; then
384 dnl Really add $additional_includedir to $INCNAME.
385 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
391 dnl Look for dependencies.
392 if test -n "$found_la"; then
393 dnl Read the .la file. It defines the variables
394 dnl dlname, library_names, old_library, dependency_libs, current,
395 dnl age, revision, installed, dlopen, dlpreopen, libdir.
396 save_libdir="$libdir"
398 */* | *\\*) . "$found_la" ;;
399 *) . "./$found_la" ;;
401 libdir="$save_libdir"
402 dnl We use only dependency_libs.
403 for dep in $dependency_libs; do
406 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
407 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
409 dnl 1. if it's the standard /usr/lib,
410 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
411 dnl 3. if it's already present in $LDFLAGS or the already
412 dnl constructed $LIBNAME,
413 dnl 4. if it doesn't exist as a directory.
414 if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
416 if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
417 if test -n "$GCC"; then
419 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
423 if test -z "$haveit"; then
425 for x in $LDFLAGS $LIB[]NAME; do
426 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
427 if test "X$x" = "X-L$additional_libdir"; then
432 if test -z "$haveit"; then
433 if test -d "$additional_libdir"; then
434 dnl Really add $additional_libdir to $LIBNAME.
435 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
439 for x in $LDFLAGS $LTLIB[]NAME; do
440 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
441 if test "X$x" = "X-L$additional_libdir"; then
446 if test -z "$haveit"; then
447 if test -d "$additional_libdir"; then
448 dnl Really add $additional_libdir to $LTLIBNAME.
449 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
456 dir=`echo "X$dep" | sed -e 's/^X-R//'`
457 if test "$enable_rpath" != no; then
458 dnl Potentially add DIR to rpathdirs.
459 dnl The rpathdirs will be appended to $LIBNAME at the end.
461 for x in $rpathdirs; do
462 if test "X$x" = "X$dir"; then
467 if test -z "$haveit"; then
468 rpathdirs="$rpathdirs $dir"
470 dnl Potentially add DIR to ltrpathdirs.
471 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
473 for x in $ltrpathdirs; do
474 if test "X$x" = "X$dir"; then
479 if test -z "$haveit"; then
480 ltrpathdirs="$ltrpathdirs $dir"
485 dnl Handle this in the next round.
486 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
489 dnl Handle this in the next round. Throw away the .la's
490 dnl directory; it is already contained in a preceding -L
492 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
495 dnl Most likely an immediate library name.
496 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
497 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
503 dnl Didn't find the library; assume it is in the system directories
504 dnl known to the linker and runtime loader. (All the system
505 dnl directories known to the linker should also be known to the
506 dnl runtime loader, otherwise the system is severely misconfigured.)
507 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
508 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
514 if test "X$rpathdirs" != "X"; then
515 if test -n "$hardcode_libdir_separator"; then
516 dnl Weird platform: only the last -rpath option counts, the user must
517 dnl pass all path elements in one option. We can arrange that for a
518 dnl single library, but not when more than one $LIBNAMEs are used.
520 for found_dir in $rpathdirs; do
521 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
523 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
524 acl_save_libdir="$libdir"
526 eval flag=\"$hardcode_libdir_flag_spec\"
527 libdir="$acl_save_libdir"
528 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
530 dnl The -rpath options are cumulative.
531 for found_dir in $rpathdirs; do
532 acl_save_libdir="$libdir"
534 eval flag=\"$hardcode_libdir_flag_spec\"
535 libdir="$acl_save_libdir"
536 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
540 if test "X$ltrpathdirs" != "X"; then
541 dnl When using libtool, the option that works for both libraries and
542 dnl executables is -R. The -R options are cumulative.
543 for found_dir in $ltrpathdirs; do
544 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
549 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
550 dnl unless already present in VAR.
551 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
552 dnl contains two or three consecutive elements that belong together.
553 AC_DEFUN([AC_LIB_APPENDTOVAR],
555 for element in [$2]; do
558 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
559 if test "X$x" = "X$element"; then
564 if test -z "$haveit"; then
565 [$1]="${[$1]}${[$1]:+ }$element"
570 dnl For those cases where a variable contains several -L and -l options
571 dnl referring to unknown libraries and directories, this macro determines the
572 dnl necessary additional linker options for the runtime path.
573 dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
574 dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
575 dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
576 dnl otherwise linking without libtool is assumed.
577 AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
579 AC_REQUIRE([AC_LIB_RPATH])
580 AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
582 if test "$enable_rpath" != no; then
583 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
584 dnl Use an explicit option to hardcode directories into the resulting
589 if test -n "$next"; then
591 dnl No need to hardcode the standard /usr/lib.
592 if test "X$dir" != "X/usr/$acl_libdirstem"; then
593 rpathdirs="$rpathdirs $dir"
599 -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
600 dnl No need to hardcode the standard /usr/lib.
601 if test "X$dir" != "X/usr/$acl_libdirstem"; then
602 rpathdirs="$rpathdirs $dir"
609 if test "X$rpathdirs" != "X"; then
610 if test -n ""$3""; then
611 dnl libtool is used for linking. Use -R options.
612 for dir in $rpathdirs; do
613 $1="${$1}${$1:+ }-R$dir"
616 dnl The linker is used for linking directly.
617 if test -n "$hardcode_libdir_separator"; then
618 dnl Weird platform: only the last -rpath option counts, the user
619 dnl must pass all path elements in one option.
621 for dir in $rpathdirs; do
622 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir"
624 acl_save_libdir="$libdir"
626 eval flag=\"$hardcode_libdir_flag_spec\"
627 libdir="$acl_save_libdir"
630 dnl The -rpath options are cumulative.
631 for dir in $rpathdirs; do
632 acl_save_libdir="$libdir"
634 eval flag=\"$hardcode_libdir_flag_spec\"
635 libdir="$acl_save_libdir"
636 $1="${$1}${$1:+ }$flag"