1 # lib-link.m4 serial 1 (gettext-0.11)
2 dnl Copyright (C) 2001-2002 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 dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec.
97 AC_DEFUN([AC_LIB_RPATH],
99 AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
100 AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
101 AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
102 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
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} "$ac_aux_dir/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 sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
118 sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
121 dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
122 dnl the libraries corresponding to explicit and implicit dependencies.
123 dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
124 AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
126 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
127 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
128 dnl By default, look in $includedir and $libdir.
130 AC_LIB_WITH_FINAL_PREFIX([
131 eval additional_includedir=\"$includedir\"
132 eval additional_libdir=\"$libdir\"
134 AC_ARG_WITH([lib$1-prefix],
135 [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
136 --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
138 if test "X$withval" = "Xno"; then
141 if test "X$withval" = "X"; then
142 AC_LIB_WITH_FINAL_PREFIX([
143 eval additional_includedir=\"$includedir\"
144 eval additional_libdir=\"$libdir\"
147 additional_includedir="$withval/include"
148 additional_libdir="$withval/lib"
152 dnl Search the library and its dependencies in $additional_libdir and
153 dnl $LDFLAGS. Using breadth-first-seach.
159 names_already_handled=
160 names_next_round='$1 $2'
161 while test -n "$names_next_round"; do
162 names_this_round="$names_next_round"
164 for name in $names_this_round; do
166 for n in $names_already_handled; do
167 if test "$n" = "$name"; then
172 if test -z "$already_handled"; then
173 names_already_handled="$names_already_handled $name"
174 dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
175 dnl or AC_LIB_HAVE_LINKFLAGS call.
176 uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
177 eval value=\"\$HAVE_LIB$uppername\"
178 if test -n "$value"; then
179 if test "$value" = yes; then
180 eval value=\"\$LIB$uppername\"
181 test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
182 eval value=\"\$LTLIB$uppername\"
183 test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
185 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
186 dnl that this library doesn't exist. So just drop it.
190 dnl Search the library lib$name in $additional_libdir and $LDFLAGS
191 dnl and the already constructed $LIBNAME/$LTLIBNAME.
196 if test $use_additional = yes; then
197 if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
198 found_dir="$additional_libdir"
199 found_so="$additional_libdir/lib$name.$shlibext"
200 if test -f "$additional_libdir/lib$name.la"; then
201 found_la="$additional_libdir/lib$name.la"
204 if test -f "$additional_libdir/lib$name.$libext"; then
205 found_dir="$additional_libdir"
206 found_a="$additional_libdir/lib$name.$libext"
207 if test -f "$additional_libdir/lib$name.la"; then
208 found_la="$additional_libdir/lib$name.la"
213 if test "X$found_dir" = "X"; then
214 for x in $LDFLAGS $LTLIB[]NAME; do
215 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
218 dir=`echo "X$x" | sed -e 's/^X-L//'`
219 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
221 found_so="$dir/lib$name.$shlibext"
222 if test -f "$dir/lib$name.la"; then
223 found_la="$dir/lib$name.la"
226 if test -f "$dir/lib$name.$libext"; then
228 found_a="$dir/lib$name.$libext"
229 if test -f "$dir/lib$name.la"; then
230 found_la="$dir/lib$name.la"
236 if test "X$found_dir" != "X"; then
241 if test "X$found_dir" != "X"; then
242 dnl Found the library.
243 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
244 if test "X$found_so" != "X"; then
245 dnl Linking with a shared library. We attempt to hardcode its
246 dnl directory into the executable's runpath, unless it's the
247 dnl standard /usr/lib.
248 if test "X$found_dir" = "X/usr/lib"; then
249 dnl No hardcoding is needed.
250 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
252 dnl Use an explicit option to hardcode DIR into the resulting
254 dnl Potentially add DIR to ltrpathdirs.
255 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
257 for x in $ltrpathdirs; do
258 if test "X$x" = "X$found_dir"; then
263 if test -z "$haveit"; then
264 ltrpathdirs="$ltrpathdirs $found_dir"
266 dnl The hardcoding into $LIBNAME is system dependent.
267 if test "$hardcode_direct" = yes; then
268 dnl Using DIR/libNAME.so during linking hardcodes DIR into the
269 dnl resulting binary.
270 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
272 if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
273 dnl Use an explicit option to hardcode DIR into the resulting
275 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
276 dnl Potentially add DIR to rpathdirs.
277 dnl The rpathdirs will be appended to $LIBNAME at the end.
279 for x in $rpathdirs; do
280 if test "X$x" = "X$found_dir"; then
285 if test -z "$haveit"; then
286 rpathdirs="$rpathdirs $found_dir"
289 dnl Rely on "-L$found_dir".
290 dnl But don't add it if it's already contained in the LDFLAGS
291 dnl or the already constructed $LIBNAME
293 for x in $LDFLAGS $LIB[]NAME; do
294 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
295 if test "X$x" = "X-L$found_dir"; then
300 if test -z "$haveit"; then
301 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
303 if test "$hardcode_minus_L" != no; then
304 dnl FIXME: Not sure whether we should use
305 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
307 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
309 dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
310 dnl here, because this doesn't fit in flags passed to the
311 dnl compiler. So give up. No hardcoding. This affects only
312 dnl very old systems.
313 dnl FIXME: Not sure whether we should use
314 dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
316 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
322 if test "X$found_a" != "X"; then
323 dnl Linking with a static library.
324 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
326 dnl We shouldn't come here, but anyway it's good to have a
328 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
331 dnl Assume the include files are nearby.
332 additional_includedir=
335 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
336 additional_includedir="$basedir/include"
339 if test "X$additional_includedir" != "X"; then
340 dnl Potentially add $additional_includedir to $INCNAME.
342 dnl 1. if it's the standard /usr/include,
343 dnl 2. if it's /usr/local/include and we are using GCC on Linux,
344 dnl 3. if it's already present in $CPPFLAGS or the already
345 dnl constructed $INCNAME,
346 dnl 4. if it doesn't exist as a directory.
347 if test "X$additional_includedir" != "X/usr/include"; then
349 if test "X$additional_includedir" = "X/usr/local/include"; then
350 if test -n "$GCC"; then
356 if test -z "$haveit"; then
357 for x in $CPPFLAGS $INC[]NAME; do
358 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
359 if test "X$x" = "X-I$additional_includedir"; then
364 if test -z "$haveit"; then
365 if test -d "$additional_includedir"; then
366 dnl Really add $additional_includedir to $INCNAME.
367 INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
373 dnl Look for dependencies.
374 if test -n "$found_la"; then
375 dnl Read the .la file. It defines the variables
376 dnl dlname, library_names, old_library, dependency_libs, current,
377 dnl age, revision, installed, dlopen, dlpreopen, libdir.
378 save_libdir="$libdir"
380 */* | *\\*) . "$found_la" ;;
381 *) . "./$found_la" ;;
383 libdir="$save_libdir"
384 dnl We use only dependency_libs.
385 for dep in $dependency_libs; do
388 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
389 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
391 dnl 1. if it's the standard /usr/lib,
392 dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
393 dnl 3. if it's already present in $LDFLAGS or the already
394 dnl constructed $LIBNAME,
395 dnl 4. if it doesn't exist as a directory.
396 if test "X$additional_libdir" != "X/usr/lib"; then
398 if test "X$additional_libdir" = "X/usr/local/lib"; then
399 if test -n "$GCC"; then
405 if test -z "$haveit"; then
407 for x in $LDFLAGS $LIB[]NAME; do
408 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
409 if test "X$x" = "X-L$additional_libdir"; then
414 if test -z "$haveit"; then
415 if test -d "$additional_libdir"; then
416 dnl Really add $additional_libdir to $LIBNAME.
417 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
421 for x in $LDFLAGS $LTLIB[]NAME; do
422 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
423 if test "X$x" = "X-L$additional_libdir"; then
428 if test -z "$haveit"; then
429 if test -d "$additional_libdir"; then
430 dnl Really add $additional_libdir to $LTLIBNAME.
431 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
438 dnl Handle this in the next round.
439 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
442 dnl Handle this in the next round. Throw away the .la's
443 dnl directory; it is already contained in a preceding -L
445 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
448 dnl Most likely an immediate library name.
449 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
450 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
456 dnl Didn't find the library; assume it is in the system directories
457 dnl known to the linker and runtime loader. (All the system
458 dnl directories known to the linker should also be known to the
459 dnl runtime loader, otherwise the system is severely misconfigured.)
460 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
461 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
467 if test "X$rpathdirs" != "X"; then
468 if test -n "$hardcode_libdir_separator"; then
469 dnl Weird platform: only the last -rpath option counts, the user must
470 dnl pass all path elements in one option. We can arrange that for a
471 dnl single library, but not when more than one $LIBNAMEs are used.
473 for found_dir in $rpathdirs; do
474 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
476 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
477 acl_save_libdir="$libdir"
479 eval flag=\"$hardcode_libdir_flag_spec\"
480 libdir="$acl_save_libdir"
481 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
483 dnl The -rpath options are cumulative.
484 for found_dir in $rpathdirs; do
485 acl_save_libdir="$libdir"
487 eval flag=\"$hardcode_libdir_flag_spec\"
488 libdir="$acl_save_libdir"
489 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
493 if test "X$ltrpathdirs" != "X"; then
494 dnl When using libtool, the option that works for both libraries and
495 dnl executables is -R. The -R options are cumulative.
496 for found_dir in $ltrpathdirs; do
497 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
502 dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
503 dnl unless already present in VAR.
504 dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
505 dnl contains two or three consecutive elements that belong together.
506 AC_DEFUN([AC_LIB_APPENDTOVAR],
508 for element in [$2]; do
511 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
512 if test "X$x" = "X$element"; then
517 if test -z "$haveit"; then
518 [$1]="${[$1]}${[$1]:+ }$element"