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. 8 9 dnl From Bruno Haible. 10 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], 16 [ 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" 27 ]) 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) 32 AC_SUBST([LIB]NAME) 33 AC_SUBST([LTLIB]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. 36 HAVE_LIB[]NAME=yes 37 undefine([Name]) 38 undefine([NAME]) 39 ]) 40 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], 50 [ 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___])]) 56 57 dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME 58 dnl accordingly. 59 AC_LIB_LINKFLAGS_BODY([$1], [$2]) 60 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) 66 67 AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ 68 ac_save_LIBS="$LIBS" 69 LIBS="$LIBS $LIB[]NAME" 70 AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) 71 LIBS="$ac_save_LIBS" 72 ]) 73 if test "$ac_cv_lib[]Name" = yes; then 74 HAVE_LIB[]NAME=yes 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]) 78 else 79 HAVE_LIB[]NAME=no 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" 83 LIB[]NAME= 84 LTLIB[]NAME= 85 fi 86 AC_SUBST([HAVE_LIB]NAME) 87 AC_SUBST([LIB]NAME) 88 AC_SUBST([LTLIB]NAME) 89 undefine([Name]) 90 undefine([NAME]) 91 ]) 92 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], 98 [ 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 106 . ./conftest.sh 107 rm -f ./conftest.sh 108 acl_cv_rpath=done 109 ]) 110 wl="$acl_cv_wl" 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" 119 ]) 120 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], 125 [ 126 define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], 127 [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) 128 dnl By default, look in $includedir and $libdir. 129 use_additional=yes 130 AC_LIB_WITH_FINAL_PREFIX([ 131 eval additional_includedir=\"$includedir\" 132 eval additional_libdir=\"$libdir\" 133 ]) 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], 137 [ 138 if test "X$withval" = "Xno"; then 139 use_additional=no 140 else 141 if test "X$withval" = "X"; then 142 AC_LIB_WITH_FINAL_PREFIX([ 143 eval additional_includedir=\"$includedir\" 144 eval additional_libdir=\"$libdir\" 145 ]) 146 else 147 additional_includedir="$withval/include" 148 additional_libdir="$withval/lib" 149 fi 150 fi 151 ]) 152 dnl Search the library and its dependencies in $additional_libdir and 153 dnl $LDFLAGS. Using breadth-first-seach. 154 LIB[]NAME= 155 LTLIB[]NAME= 156 INC[]NAME= 157 rpathdirs= 158 ltrpathdirs= 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" 163 names_next_round= 164 for name in $names_this_round; do 165 already_handled= 166 for n in $names_already_handled; do 167 if test "$n" = "$name"; then 168 already_handled=yes 169 break 170 fi 171 done 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" 184 else 185 dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined 186 dnl that this library doesn't exist. So just drop it. 187 : 188 fi 189 else 190 dnl Search the library lib$name in $additional_libdir and $LDFLAGS 191 dnl and the already constructed $LIBNAME/$LTLIBNAME. 192 found_dir= 193 found_la= 194 found_so= 195 found_a= 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" 202 fi 203 else 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" 209 fi 210 fi 211 fi 212 fi 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\"]) 216 case "$x" in 217 -L*) 218 dir=`echo "X$x" | sed -e 's/^X-L//'` 219 if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then 220 found_dir="$dir" 221 found_so="$dir/lib$name.$shlibext" 222 if test -f "$dir/lib$name.la"; then 223 found_la="$dir/lib$name.la" 224 fi 225 else 226 if test -f "$dir/lib$name.$libext"; then 227 found_dir="$dir" 228 found_a="$dir/lib$name.$libext" 229 if test -f "$dir/lib$name.la"; then 230 found_la="$dir/lib$name.la" 231 fi 232 fi 233 fi 234 ;; 235 esac 236 if test "X$found_dir" != "X"; then 237 break 238 fi 239 done 240 fi 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" 251 else 252 dnl Use an explicit option to hardcode DIR into the resulting 253 dnl binary. 254 dnl Potentially add DIR to ltrpathdirs. 255 dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. 256 haveit= 257 for x in $ltrpathdirs; do 258 if test "X$x" = "X$found_dir"; then 259 haveit=yes 260 break 261 fi 262 done 263 if test -z "$haveit"; then 264 ltrpathdirs="$ltrpathdirs $found_dir" 265 fi 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" 271 else 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 274 dnl binary. 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. 278 haveit= 279 for x in $rpathdirs; do 280 if test "X$x" = "X$found_dir"; then 281 haveit=yes 282 break 283 fi 284 done 285 if test -z "$haveit"; then 286 rpathdirs="$rpathdirs $found_dir" 287 fi 288 else 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 292 haveit= 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 296 haveit=yes 297 break 298 fi 299 done 300 if test -z "$haveit"; then 301 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" 302 fi 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" 306 dnl here. 307 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" 308 else 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" 315 dnl here. 316 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" 317 fi 318 fi 319 fi 320 fi 321 else 322 if test "X$found_a" != "X"; then 323 dnl Linking with a static library. 324 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" 325 else 326 dnl We shouldn't come here, but anyway it's good to have a 327 dnl fallback. 328 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" 329 fi 330 fi 331 dnl Assume the include files are nearby. 332 additional_includedir= 333 case "$found_dir" in 334 */lib | */lib/) 335 basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` 336 additional_includedir="$basedir/include" 337 ;; 338 esac 339 if test "X$additional_includedir" != "X"; then 340 dnl Potentially add $additional_includedir to $INCNAME. 341 dnl But don't add it 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 348 haveit= 349 if test "X$additional_includedir" = "X/usr/local/include"; then 350 if test -n "$GCC"; then 351 case $host_os in 352 linux*) haveit=yes;; 353 esac 354 fi 355 fi 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 360 haveit=yes 361 break 362 fi 363 done 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" 368 fi 369 fi 370 fi 371 fi 372 fi 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" 379 case "$found_la" in 380 */* | *\\*) . "$found_la" ;; 381 *) . "./$found_la" ;; 382 esac 383 libdir="$save_libdir" 384 dnl We use only dependency_libs. 385 for dep in $dependency_libs; do 386 case "$dep" in 387 -L*) 388 additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` 389 dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. 390 dnl But don't add it 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 397 haveit= 398 if test "X$additional_libdir" = "X/usr/local/lib"; then 399 if test -n "$GCC"; then 400 case $host_os in 401 linux*) haveit=yes;; 402 esac 403 fi 404 fi 405 if test -z "$haveit"; then 406 haveit= 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 410 haveit=yes 411 break 412 fi 413 done 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" 418 fi 419 fi 420 haveit= 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 424 haveit=yes 425 break 426 fi 427 done 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" 432 fi 433 fi 434 fi 435 fi 436 ;; 437 -l*) 438 dnl Handle this in the next round. 439 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` 440 ;; 441 *.la) 442 dnl Handle this in the next round. Throw away the .la's 443 dnl directory; it is already contained in a preceding -L 444 dnl option. 445 names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` 446 ;; 447 *) 448 dnl Most likely an immediate library name. 449 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" 450 LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" 451 ;; 452 esac 453 done 454 fi 455 else 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" 462 fi 463 fi 464 fi 465 done 466 done 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. 472 alldirs= 473 for found_dir in $rpathdirs; do 474 alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" 475 done 476 dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. 477 acl_save_libdir="$libdir" 478 libdir="$alldirs" 479 eval flag=\"$hardcode_libdir_flag_spec\" 480 libdir="$acl_save_libdir" 481 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" 482 else 483 dnl The -rpath options are cumulative. 484 for found_dir in $rpathdirs; do 485 acl_save_libdir="$libdir" 486 libdir="$found_dir" 487 eval flag=\"$hardcode_libdir_flag_spec\" 488 libdir="$acl_save_libdir" 489 LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" 490 done 491 fi 492 fi 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" 498 done 499 fi 500 ]) 501 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], 507 [ 508 for element in [$2]; do 509 haveit= 510 for x in $[$1]; do 511 AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) 512 if test "X$x" = "X$element"; then 513 haveit=yes 514 break 515 fi 516 done 517 if test -z "$haveit"; then 518 [$1]="${[$1]}${[$1]:+ }$element" 519 fi 520 done 521 ]) 522