1 # lib-link.m4 serial 7 (gettext-0.15)
2 dnl Copyright (C) 2001-2005 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" && test -f "$additional_libdir/lib$name.$shlibext"; then
202 found_dir="$additional_libdir"
203 found_so="$additional_libdir/lib$name.$shlibext"
204 if test -f "$additional_libdir/lib$name.la"; then
205 found_la="$additional_libdir/lib$name.la"
208 if test -f "$additional_libdir/lib$name.$libext"; then
209 found_dir="$additional_libdir"
210 found_a="$additional_libdir/lib$name.$libext"
211 if test -f "$additional_libdir/lib$name.la"; then
212 found_la="$additional_libdir/lib$name.la"
217 if test "X$found_dir" = "X"; then
218 for x in $LDFLAGS $LTLIB[]NAME; do
219 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
222 dir=`echo "X$x" | sed -e 's/^X-L//'`
223 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
225 found_so="$dir/lib$name.$shlibext"
226 if test -f "$dir/lib$name.la"; then
227 found_la="$dir/lib$name.la"
230 if test -f "$dir/lib$name.$libext"; then
232 found_a="$dir/lib$name.$libext"
233 if test -f "$dir/lib$name.la"; then
234 found_la="$dir/lib$name.la"
240 if test "X$found_dir" != "X"; then
245 if test "X$found_dir" != "X"; then
246 dnl Found the library.
247 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
248 if test "X$found_so" != "X"; then
249 dnl Linking with a shared library. We attempt to hardcode its
250 dnl directory into the executable's runpath, unless it's the
251 dnl standard /usr/lib.
252 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
253 dnl No hardcoding is needed.
254 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
256 dnl Use an explicit option to hardcode DIR into the resulting
258 dnl Potentially add DIR to ltrpathdirs.
259 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
261 for x in $ltrpathdirs; do
262 if test "X$x" = "X$found_dir"; then
267 if test -z "$haveit"; then
268 ltrpathdirs="$ltrpathdirs $found_dir"
270 dnl The hardcoding into $LIBNAME is system dependent.
271 if test "$hardcode_direct" = yes; then
272 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
273 dnl resulting binary.
274 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
276 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
277 dnl Use an explicit option to hardcode DIR into the resulting
279 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
280 dnl Potentially add DIR to rpathdirs.
281 dnl The rpathdirs will be appended to $LIBNAME at the end.
283 for x in $rpathdirs; do
284 if test "X$x" = "X$found_dir"; then
289 if test -z "$haveit"; then
290 rpathdirs="$rpathdirs $found_dir"
293 dnl Rely on "-L$found_dir".
294 dnl But don't add it if it's already contained in the LDFLAGS
295 dnl or the already constructed $LIBNAME
297 for x in $LDFLAGS $LIB[]NAME; do
298 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
299 if test "X$x" = "X-L$found_dir"; then
304 if test -z "$haveit"; then
305 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
307 if test "$hardcode_minus_L" != no; then
308 dnl FIXME: Not sure whether we should use
309 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
311 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
313 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
314 dnl here, because this doesn't fit in flags passed to the
315 dnl compiler. So give up. No hardcoding. This affects only
316 dnl very old systems.
317 dnl FIXME: Not sure whether we should use
318 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
320 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
326 if test "X$found_a" != "X"; then
327 dnl Linking with a static library.
328 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
330 dnl We shouldn't come here, but anyway it's good to have a
332 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
335 dnl Assume the include files are nearby.
336 additional_includedir=
338 */$acl_libdirstem | */$acl_libdirstem/)
339 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
340 additional_includedir="$basedir/include"
343 if test "X$additional_includedir" != "X"; then
344 dnl Potentially add $additional_includedir to $INCNAME.
346 dnl 1. if it's the standard /usr/include,
347 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
348 dnl 3. if it's already present in $CPPFLAGS or the already
349 dnl constructed $INCNAME,
350 dnl 4. if it doesn't exist as a directory.
351 if test "X$additional_includedir" != "X/usr/include"; then
353 if test "X$additional_includedir" = "X/usr/local/include"; then
354 if test -n "$GCC"; then
356 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
360 if test -z "$haveit"; then
361 for x in $CPPFLAGS $INC[]NAME; do
362 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
363 if test "X$x" = "X-I$additional_includedir"; then
368 if test -z "$haveit"; then
369 if test -d "$additional_includedir"; then
370 dnl Really add $additional_includedir to $INCNAME.
371 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
377 dnl Look for dependencies.
378 if test -n "$found_la"; then
379 dnl Read the .la file. It defines the variables
380 dnl dlname, library_names, old_library, dependency_libs, current,
381 dnl age, revision, installed, dlopen, dlpreopen, libdir.
382 save_libdir="$libdir"
384 */* | *\\*) . "$found_la" ;;
385 *) . "./$found_la" ;;
387 libdir="$save_libdir"
388 dnl We use only dependency_libs.
389 for dep in $dependency_libs; do
392 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
393 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
395 dnl 1. if it's the standard /usr/lib,
396 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
397 dnl 3. if it's already present in $LDFLAGS or the already
398 dnl constructed $LIBNAME,
399 dnl 4. if it doesn't exist as a directory.
400 if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
402 if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
403 if test -n "$GCC"; then
405 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
409 if test -z "$haveit"; then
411 for x in $LDFLAGS $LIB[]NAME; do
412 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
413 if test "X$x" = "X-L$additional_libdir"; then
418 if test -z "$haveit"; then
419 if test -d "$additional_libdir"; then
420 dnl Really add $additional_libdir to $LIBNAME.
421 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
425 for x in $LDFLAGS $LTLIB[]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 $LTLIBNAME.
435 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
442 dir=`echo "X$dep" | sed -e 's/^X-R//'`
443 if test "$enable_rpath" != no; then
444 dnl Potentially add DIR to rpathdirs.
445 dnl The rpathdirs will be appended to $LIBNAME at the end.
447 for x in $rpathdirs; do
448 if test "X$x" = "X$dir"; then
453 if test -z "$haveit"; then
454 rpathdirs="$rpathdirs $dir"
456 dnl Potentially add DIR to ltrpathdirs.
457 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
459 for x in $ltrpathdirs; do
460 if test "X$x" = "X$dir"; then
465 if test -z "$haveit"; then
466 ltrpathdirs="$ltrpathdirs $dir"
471 dnl Handle this in the next round.
472 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
475 dnl Handle this in the next round. Throw away the .la's
476 dnl directory; it is already contained in a preceding -L
478 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
481 dnl Most likely an immediate library name.
482 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
483 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
489 dnl Didn't find the library; assume it is in the system directories
490 dnl known to the linker and runtime loader. (All the system
491 dnl directories known to the linker should also be known to the
492 dnl runtime loader, otherwise the system is severely misconfigured.)
493 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
494 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
500 if test "X$rpathdirs" != "X"; then
501 if test -n "$hardcode_libdir_separator"; then
502 dnl Weird platform: only the last -rpath option counts, the user must
503 dnl pass all path elements in one option. We can arrange that for a
504 dnl single library, but not when more than one $LIBNAMEs are used.
506 for found_dir in $rpathdirs; do
507 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
509 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
510 acl_save_libdir="$libdir"
512 eval flag=\"$hardcode_libdir_flag_spec\"
513 libdir="$acl_save_libdir"
514 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
516 dnl The -rpath options are cumulative.
517 for found_dir in $rpathdirs; do
518 acl_save_libdir="$libdir"
520 eval flag=\"$hardcode_libdir_flag_spec\"
521 libdir="$acl_save_libdir"
522 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
526 if test "X$ltrpathdirs" != "X"; then
527 dnl When using libtool, the option that works for both libraries and
528 dnl executables is -R. The -R options are cumulative.
529 for found_dir in $ltrpathdirs; do
530 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
535 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
536 dnl unless already present in VAR.
537 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
538 dnl contains two or three consecutive elements that belong together.
539 AC_DEFUN([AC_LIB_APPENDTOVAR],
541 for element in [$2]; do
544 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
545 if test "X$x" = "X$element"; then
550 if test -z "$haveit"; then
551 [$1]="${[$1]}${[$1]:+ }$element"