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 AC_LIB_ARG_WITH([lib$1-type],
154 [ --with-lib$1-type=TYPE type of library to search for (auto/static/shared) ],
155 [ with_lib$1_type=$withval ], [ with_lib$1_type=auto ])
156 lib_type=`eval echo \$with_lib$1_type`
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" && test -f "$additional_libdir/lib$name.$shlibext" && test x$lib_type != xstatic; then
204 found_dir="$additional_libdir"
205 found_so="$additional_libdir/lib$name.$shlibext"
206 if test -f "$additional_libdir/lib$name.la"; then
207 found_la="$additional_libdir/lib$name.la"
209 elif test x$lib_type != xshared; then
210 if test -f "$additional_libdir/lib$name.$libext"; then
211 found_dir="$additional_libdir"
212 found_a="$additional_libdir/lib$name.$libext"
213 if test -f "$additional_libdir/lib$name.la"; then
214 found_la="$additional_libdir/lib$name.la"
219 if test "X$found_dir" = "X"; then
220 for x in $LDFLAGS $LTLIB[]NAME; do
221 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
224 dir=`echo "X$x" | sed -e 's/^X-L//'`
225 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext" && test x$lib_type != xstatic; then
227 found_so="$dir/lib$name.$shlibext"
228 if test -f "$dir/lib$name.la"; then
229 found_la="$dir/lib$name.la"
231 elif test x$lib_type != xshared; then
232 if test -f "$dir/lib$name.$libext"; then
234 found_a="$dir/lib$name.$libext"
235 if test -f "$dir/lib$name.la"; then
236 found_la="$dir/lib$name.la"
242 if test "X$found_dir" != "X"; then
247 if test "X$found_dir" != "X"; then
248 dnl Found the library.
249 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
250 if test "X$found_so" != "X"; then
251 dnl Linking with a shared library. We attempt to hardcode its
252 dnl directory into the executable's runpath, unless it's the
253 dnl standard /usr/lib.
254 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
255 dnl No hardcoding is needed.
256 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
258 dnl Use an explicit option to hardcode DIR into the resulting
260 dnl Potentially add DIR to ltrpathdirs.
261 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
263 for x in $ltrpathdirs; do
264 if test "X$x" = "X$found_dir"; then
269 if test -z "$haveit"; then
270 ltrpathdirs="$ltrpathdirs $found_dir"
272 dnl The hardcoding into $LIBNAME is system dependent.
273 if test "$hardcode_direct" = yes; then
274 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
275 dnl resulting binary.
276 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
278 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
279 dnl Use an explicit option to hardcode DIR into the resulting
281 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
282 dnl Potentially add DIR to rpathdirs.
283 dnl The rpathdirs will be appended to $LIBNAME at the end.
285 for x in $rpathdirs; do
286 if test "X$x" = "X$found_dir"; then
291 if test -z "$haveit"; then
292 rpathdirs="$rpathdirs $found_dir"
295 dnl Rely on "-L$found_dir".
296 dnl But don't add it if it's already contained in the LDFLAGS
297 dnl or the already constructed $LIBNAME
299 for x in $LDFLAGS $LIB[]NAME; do
300 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
301 if test "X$x" = "X-L$found_dir"; then
306 if test -z "$haveit"; then
307 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
309 if test "$hardcode_minus_L" != no; then
310 dnl FIXME: Not sure whether we should use
311 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
313 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
315 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
316 dnl here, because this doesn't fit in flags passed to the
317 dnl compiler. So give up. No hardcoding. This affects only
318 dnl very old systems.
319 dnl FIXME: Not sure whether we should use
320 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
322 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
328 if test "X$found_a" != "X"; then
329 dnl Linking with a static library.
330 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
332 dnl We shouldn't come here, but anyway it's good to have a
334 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
337 dnl Assume the include files are nearby.
338 additional_includedir=
341 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
342 additional_includedir="$basedir/include"
345 if test "X$additional_includedir" != "X"; then
346 dnl Potentially add $additional_includedir to $INCNAME.
348 dnl 1. if it's the standard /usr/include,
349 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
350 dnl 3. if it's already present in $CPPFLAGS or the already
351 dnl constructed $INCNAME,
352 dnl 4. if it doesn't exist as a directory.
353 if test "X$additional_includedir" != "X/usr/include"; then
355 if test "X$additional_includedir" = "X/usr/local/include"; then
356 if test -n "$GCC"; then
362 if test -z "$haveit"; then
363 for x in $CPPFLAGS $INC[]NAME; do
364 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
365 if test "X$x" = "X-I$additional_includedir"; then
370 if test -z "$haveit"; then
371 if test -d "$additional_includedir"; then
372 dnl Really add $additional_includedir to $INCNAME.
373 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
379 dnl Look for dependencies.
380 if test -n "$found_la"; then
381 dnl Read the .la file. It defines the variables
382 dnl dlname, library_names, old_library, dependency_libs, current,
383 dnl age, revision, installed, dlopen, dlpreopen, libdir.
384 save_libdir="$libdir"
386 */* | *\\*) . "$found_la" ;;
387 *) . "./$found_la" ;;
389 libdir="$save_libdir"
390 dnl We use only dependency_libs.
391 for dep in $dependency_libs; do
394 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
395 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
397 dnl 1. if it's the standard /usr/lib,
398 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
399 dnl 3. if it's already present in $LDFLAGS or the already
400 dnl constructed $LIBNAME,
401 dnl 4. if it doesn't exist as a directory.
402 if test "X$additional_libdir" != "X/usr/lib"; then
404 if test "X$additional_libdir" = "X/usr/local/lib"; then
405 if test -n "$GCC"; then
411 if test -z "$haveit"; then
413 for x in $LDFLAGS $LIB[]NAME; do
414 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
415 if test "X$x" = "X-L$additional_libdir"; then
420 if test -z "$haveit"; then
421 if test -d "$additional_libdir"; then
422 dnl Really add $additional_libdir to $LIBNAME.
423 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
427 for x in $LDFLAGS $LTLIB[]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 $LTLIBNAME.
437 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
444 dir=`echo "X$dep" | sed -e 's/^X-R//'`
445 if test "$enable_rpath" != no; then
446 dnl Potentially add DIR to rpathdirs.
447 dnl The rpathdirs will be appended to $LIBNAME at the end.
449 for x in $rpathdirs; do
450 if test "X$x" = "X$dir"; then
455 if test -z "$haveit"; then
456 rpathdirs="$rpathdirs $dir"
458 dnl Potentially add DIR to ltrpathdirs.
459 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
461 for x in $ltrpathdirs; do
462 if test "X$x" = "X$dir"; then
467 if test -z "$haveit"; then
468 ltrpathdirs="$ltrpathdirs $dir"
473 dnl Handle this in the next round.
474 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
477 dnl Handle this in the next round. Throw away the .la's
478 dnl directory; it is already contained in a preceding -L
480 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
483 dnl Most likely an immediate library name.
484 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
485 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
491 dnl Didn't find the library; assume it is in the system directories
492 dnl known to the linker and runtime loader. (All the system
493 dnl directories known to the linker should also be known to the
494 dnl runtime loader, otherwise the system is severely misconfigured.)
495 if test "x$lib_type" = "xauto" || test "x$lib_type" = "xshared"; then
496 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
497 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
499 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l:lib$name.$libext"
500 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l:lib$name.$libext"
507 if test "X$rpathdirs" != "X"; then
508 if test -n "$hardcode_libdir_separator"; then
509 dnl Weird platform: only the last -rpath option counts, the user must
510 dnl pass all path elements in one option. We can arrange that for a
511 dnl single library, but not when more than one $LIBNAMEs are used.
513 for found_dir in $rpathdirs; do
514 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
516 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
517 acl_save_libdir="$libdir"
519 eval flag=\"$hardcode_libdir_flag_spec\"
520 libdir="$acl_save_libdir"
521 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
523 dnl The -rpath options are cumulative.
524 for found_dir in $rpathdirs; do
525 acl_save_libdir="$libdir"
527 eval flag=\"$hardcode_libdir_flag_spec\"
528 libdir="$acl_save_libdir"
529 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
533 if test "X$ltrpathdirs" != "X"; then
534 dnl When using libtool, the option that works for both libraries and
535 dnl executables is -R. The -R options are cumulative.
536 for found_dir in $ltrpathdirs; do
537 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
542 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
543 dnl unless already present in VAR.
544 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
545 dnl contains two or three consecutive elements that belong together.
546 AC_DEFUN([AC_LIB_APPENDTOVAR],
548 for element in [$2]; do
551 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
552 if test "X$x" = "X$element"; then
557 if test -z "$haveit"; then
558 [$1]="${[$1]}${[$1]:+ }$element"