1 # lib-link.m4 serial 6 (gettext-0.14.3)
2 dnl Copyright (C) 2001-2005, 2009, 2010 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 AC_PATH_PROG(CONFIG_RPATH, config.rpath, config.rpath, [])
99 AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
100 AC_REQUIRE([AC_PROG_LD]) dnl we use $LD, $with_gnu_ld
101 AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
103 AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
104 CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
105 ${CONFIG_SHELL-/bin/sh} "$srcdir/config.rpath" "$host" > conftest.sh
111 libext="$acl_cv_libext"
112 shlibext="$acl_cv_shlibext"
113 hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
114 hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
115 hardcode_direct="$acl_cv_hardcode_direct"
116 hardcode_minus_L="$acl_cv_hardcode_minus_L"
117 dnl Determine whether the user wants rpath handling at all.
119 [ --disable-rpath do not hardcode runtime library paths],
123 dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
124 dnl the libraries corresponding to explicit and implicit dependencies.
125 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
126 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
128 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
129 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
130 dnl By default, look in $includedir and $libdir.
132 AC_LIB_WITH_FINAL_PREFIX([
133 eval additional_includedir=\"$includedir\"
134 eval additional_libdir=\"$libdir\"
136 AC_LIB_ARG_WITH([lib$1-prefix],
137 [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
138 --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
140 if test "X$withval" = "Xno"; then
143 if test "X$withval" = "X"; then
144 AC_LIB_WITH_FINAL_PREFIX([
145 eval additional_includedir=\"$includedir\"
146 eval additional_libdir=\"$libdir\"
149 additional_includedir="$withval/include"
150 additional_libdir="$withval/lib"
154 dnl Search the library and its dependencies in $additional_libdir and
155 dnl $LDFLAGS. Using breadth-first-seach.
161 names_already_handled=
162 names_next_round='$1 $2'
163 while test -n "$names_next_round"; do
164 names_this_round="$names_next_round"
166 for name in $names_this_round; do
168 for n in $names_already_handled; do
169 if test "$n" = "$name"; then
174 if test -z "$already_handled"; then
175 names_already_handled="$names_already_handled $name"
176 dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
177 dnl or AC_LIB_HAVE_LINKFLAGS call.
178 uppername="`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`"
179 eval value=\"\$HAVE_LIB$uppername\"
180 if test -n "$value"; then
181 if test "$value" = yes; then
182 eval value=\"\$LIB$uppername\"
183 test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
184 eval value=\"\$LTLIB$uppername\"
185 test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
187 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
188 dnl that this library doesn't exist. So just drop it.
192 dnl Search the library lib$name in $additional_libdir and $LDFLAGS
193 dnl and the already constructed $LIBNAME/$LTLIBNAME.
198 if test $use_additional = yes; then
199 if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
200 found_dir="$additional_libdir"
201 found_so="$additional_libdir/lib$name.$shlibext"
202 if test -f "$additional_libdir/lib$name.la"; then
203 found_la="$additional_libdir/lib$name.la"
206 if test -f "$additional_libdir/lib$name.$libext"; then
207 found_dir="$additional_libdir"
208 found_a="$additional_libdir/lib$name.$libext"
209 if test -f "$additional_libdir/lib$name.la"; then
210 found_la="$additional_libdir/lib$name.la"
215 if test "X$found_dir" = "X"; then
216 for x in $LDFLAGS $LTLIB[]NAME; do
217 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
220 dir=`echo "X$x" | sed -e 's/^X-L//'`
221 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
223 found_so="$dir/lib$name.$shlibext"
224 if test -f "$dir/lib$name.la"; then
225 found_la="$dir/lib$name.la"
228 if test -f "$dir/lib$name.$libext"; then
230 found_a="$dir/lib$name.$libext"
231 if test -f "$dir/lib$name.la"; then
232 found_la="$dir/lib$name.la"
238 if test "X$found_dir" != "X"; then
243 if test "X$found_dir" != "X"; then
244 dnl Found the library.
245 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
246 if test "X$found_so" != "X"; then
247 dnl Linking with a shared library. We attempt to hardcode its
248 dnl directory into the executable's runpath, unless it's the
249 dnl standard /usr/lib.
250 if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
251 dnl No hardcoding is needed.
252 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
254 dnl Use an explicit option to hardcode DIR into the resulting
256 dnl Potentially add DIR to ltrpathdirs.
257 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
259 for x in $ltrpathdirs; do
260 if test "X$x" = "X$found_dir"; then
265 if test -z "$haveit"; then
266 ltrpathdirs="$ltrpathdirs $found_dir"
268 dnl The hardcoding into $LIBNAME is system dependent.
269 if test "$hardcode_direct" = yes; then
270 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
271 dnl resulting binary.
272 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
274 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
275 dnl Use an explicit option to hardcode DIR into the resulting
277 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
278 dnl Potentially add DIR to rpathdirs.
279 dnl The rpathdirs will be appended to $LIBNAME at the end.
281 for x in $rpathdirs; do
282 if test "X$x" = "X$found_dir"; then
287 if test -z "$haveit"; then
288 rpathdirs="$rpathdirs $found_dir"
291 dnl Rely on "-L$found_dir".
292 dnl But don't add it if it's already contained in the LDFLAGS
293 dnl or the already constructed $LIBNAME
295 for x in $LDFLAGS $LIB[]NAME; do
296 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
297 if test "X$x" = "X-L$found_dir"; then
302 if test -z "$haveit"; then
303 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
305 if test "$hardcode_minus_L" != no; then
306 dnl FIXME: Not sure whether we should use
307 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
309 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
311 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
312 dnl here, because this doesn't fit in flags passed to the
313 dnl compiler. So give up. No hardcoding. This affects only
314 dnl very old systems.
315 dnl FIXME: Not sure whether we should use
316 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
318 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
324 if test "X$found_a" != "X"; then
325 dnl Linking with a static library.
326 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
328 dnl We shouldn't come here, but anyway it's good to have a
330 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
333 dnl Assume the include files are nearby.
334 additional_includedir=
337 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
338 additional_includedir="$basedir/include"
341 if test "X$additional_includedir" != "X"; then
342 dnl Potentially add $additional_includedir to $INCNAME.
344 dnl 1. if it's the standard /usr/include,
345 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
346 dnl 3. if it's already present in $CPPFLAGS or the already
347 dnl constructed $INCNAME,
348 dnl 4. if it doesn't exist as a directory.
349 if test "X$additional_includedir" != "X/usr/include"; then
351 if test "X$additional_includedir" = "X/usr/local/include"; then
352 if test -n "$GCC"; then
354 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
358 if test -z "$haveit"; then
359 for x in $CPPFLAGS $INC[]NAME; do
360 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
361 if test "X$x" = "X-I$additional_includedir"; then
366 if test -z "$haveit"; then
367 if test -d "$additional_includedir"; then
368 dnl Really add $additional_includedir to $INCNAME.
369 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
375 dnl Look for dependencies.
376 if test -n "$found_la"; then
377 dnl Read the .la file. It defines the variables
378 dnl dlname, library_names, old_library, dependency_libs, current,
379 dnl age, revision, installed, dlopen, dlpreopen, libdir.
380 save_libdir="$libdir"
382 */* | *\\*) . "$found_la" ;;
383 *) . "./$found_la" ;;
385 libdir="$save_libdir"
386 dnl We use only dependency_libs.
387 for dep in $dependency_libs; do
390 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
391 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
393 dnl 1. if it's the standard /usr/lib,
394 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
395 dnl 3. if it's already present in $LDFLAGS or the already
396 dnl constructed $LIBNAME,
397 dnl 4. if it doesn't exist as a directory.
398 if test "X$additional_libdir" != "X/usr/lib"; then
400 if test "X$additional_libdir" = "X/usr/local/lib"; then
401 if test -n "$GCC"; then
403 linux* | gnu* | k*bsd*-gnu) haveit=yes;;
407 if test -z "$haveit"; then
409 for x in $LDFLAGS $LIB[]NAME; do
410 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
411 if test "X$x" = "X-L$additional_libdir"; then
416 if test -z "$haveit"; then
417 if test -d "$additional_libdir"; then
418 dnl Really add $additional_libdir to $LIBNAME.
419 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
423 for x in $LDFLAGS $LTLIB[]NAME; do
424 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
425 if test "X$x" = "X-L$additional_libdir"; then
430 if test -z "$haveit"; then
431 if test -d "$additional_libdir"; then
432 dnl Really add $additional_libdir to $LTLIBNAME.
433 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
440 dir=`echo "X$dep" | sed -e 's/^X-R//'`
441 if test "$enable_rpath" != no; then
442 dnl Potentially add DIR to rpathdirs.
443 dnl The rpathdirs will be appended to $LIBNAME at the end.
445 for x in $rpathdirs; do
446 if test "X$x" = "X$dir"; then
451 if test -z "$haveit"; then
452 rpathdirs="$rpathdirs $dir"
454 dnl Potentially add DIR to ltrpathdirs.
455 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
457 for x in $ltrpathdirs; do
458 if test "X$x" = "X$dir"; then
463 if test -z "$haveit"; then
464 ltrpathdirs="$ltrpathdirs $dir"
469 dnl Handle this in the next round.
470 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
473 dnl Handle this in the next round. Throw away the .la's
474 dnl directory; it is already contained in a preceding -L
476 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
479 dnl Most likely an immediate library name.
480 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
481 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
487 dnl Didn't find the library; assume it is in the system directories
488 dnl known to the linker and runtime loader. (All the system
489 dnl directories known to the linker should also be known to the
490 dnl runtime loader, otherwise the system is severely misconfigured.)
491 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
492 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
498 if test "X$rpathdirs" != "X"; then
499 if test -n "$hardcode_libdir_separator"; then
500 dnl Weird platform: only the last -rpath option counts, the user must
501 dnl pass all path elements in one option. We can arrange that for a
502 dnl single library, but not when more than one $LIBNAMEs are used.
504 for found_dir in $rpathdirs; do
505 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
507 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
508 acl_save_libdir="$libdir"
510 eval flag=\"$hardcode_libdir_flag_spec\"
511 libdir="$acl_save_libdir"
512 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
514 dnl The -rpath options are cumulative.
515 for found_dir in $rpathdirs; do
516 acl_save_libdir="$libdir"
518 eval flag=\"$hardcode_libdir_flag_spec\"
519 libdir="$acl_save_libdir"
520 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
524 if test "X$ltrpathdirs" != "X"; then
525 dnl When using libtool, the option that works for both libraries and
526 dnl executables is -R. The -R options are cumulative.
527 for found_dir in $ltrpathdirs; do
528 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
533 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
534 dnl unless already present in VAR.
535 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
536 dnl contains two or three consecutive elements that belong together.
537 AC_DEFUN([AC_LIB_APPENDTOVAR],
539 for element in [$2]; do
542 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
543 if test "X$x" = "X$element"; then
548 if test -z "$haveit"; then
549 [$1]="${[$1]}${[$1]:+ }$element"