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"