lib-link.m4 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  1. # lib-link.m4 serial 33
  2. dnl Copyright (C) 2001-2022 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.
  6. dnl From Bruno Haible.
  7. AC_PREREQ([2.61])
  8. dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
  9. dnl the libraries corresponding to explicit and implicit dependencies.
  10. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
  11. dnl augments the CPPFLAGS variable.
  12. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
  13. dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
  14. AC_DEFUN([AC_LIB_LINKFLAGS],
  15. [
  16. AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
  17. AC_REQUIRE([AC_LIB_RPATH])
  18. pushdef([Name],[m4_translit([$1],[./+-], [____])])
  19. pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
  20. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  21. AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
  22. AC_LIB_LINKFLAGS_BODY([$1], [$2])
  23. ac_cv_lib[]Name[]_libs="$LIB[]NAME"
  24. ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
  25. ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
  26. ac_cv_lib[]Name[]_prefix="$LIB[]NAME[]_PREFIX"
  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. LIB[]NAME[]_PREFIX="$ac_cv_lib[]Name[]_prefix"
  32. AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
  33. AC_SUBST([LIB]NAME)
  34. AC_SUBST([LTLIB]NAME)
  35. AC_SUBST([LIB]NAME[_PREFIX])
  36. dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
  37. dnl results of this search when this library appears as a dependency.
  38. HAVE_LIB[]NAME=yes
  39. popdef([NAME])
  40. popdef([Name])
  41. ])
  42. dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode, [missing-message])
  43. dnl searches for libname and the libraries corresponding to explicit and
  44. dnl implicit dependencies, together with the specified include files and
  45. dnl the ability to compile and link the specified testcode. The missing-message
  46. dnl defaults to 'no' and may contain additional hints for the user.
  47. dnl If found, it sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME}
  48. dnl and LTLIB${NAME} variables and augments the CPPFLAGS variable, and
  49. dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
  50. dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
  51. dnl Sets and AC_SUBSTs the LIB${NAME}_PREFIX variable to nonempty if libname
  52. dnl was found in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
  53. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
  54. [
  55. AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
  56. AC_REQUIRE([AC_LIB_RPATH])
  57. pushdef([Name],[m4_translit([$1],[./+-], [____])])
  58. pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
  59. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  60. dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
  61. dnl accordingly.
  62. AC_LIB_LINKFLAGS_BODY([$1], [$2])
  63. dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
  64. dnl because if the user has installed lib[]Name and not disabled its use
  65. dnl via --without-lib[]Name-prefix, he wants to use it.
  66. ac_save_CPPFLAGS="$CPPFLAGS"
  67. AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
  68. AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
  69. ac_save_LIBS="$LIBS"
  70. dnl If $LIB[]NAME contains some -l options, add it to the end of LIBS,
  71. dnl because these -l options might require -L options that are present in
  72. dnl LIBS. -l options benefit only from the -L options listed before it.
  73. dnl Otherwise, add it to the front of LIBS, because it may be a static
  74. dnl library that depends on another static library that is present in LIBS.
  75. dnl Static libraries benefit only from the static libraries listed after
  76. dnl it.
  77. case " $LIB[]NAME" in
  78. *" -l"*) LIBS="$LIBS $LIB[]NAME" ;;
  79. *) LIBS="$LIB[]NAME $LIBS" ;;
  80. esac
  81. AC_LINK_IFELSE(
  82. [AC_LANG_PROGRAM([[$3]], [[$4]])],
  83. [ac_cv_lib[]Name=yes],
  84. [ac_cv_lib[]Name='m4_if([$5], [], [no], [[$5]])'])
  85. LIBS="$ac_save_LIBS"
  86. ])
  87. if test "$ac_cv_lib[]Name" = yes; then
  88. HAVE_LIB[]NAME=yes
  89. AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the lib][$1 library.])
  90. AC_MSG_CHECKING([how to link with lib[]$1])
  91. AC_MSG_RESULT([$LIB[]NAME])
  92. else
  93. HAVE_LIB[]NAME=no
  94. dnl If $LIB[]NAME didn't lead to a usable library, we don't need
  95. dnl $INC[]NAME either.
  96. CPPFLAGS="$ac_save_CPPFLAGS"
  97. LIB[]NAME=
  98. LTLIB[]NAME=
  99. LIB[]NAME[]_PREFIX=
  100. fi
  101. AC_SUBST([HAVE_LIB]NAME)
  102. AC_SUBST([LIB]NAME)
  103. AC_SUBST([LTLIB]NAME)
  104. AC_SUBST([LIB]NAME[_PREFIX])
  105. popdef([NAME])
  106. popdef([Name])
  107. ])
  108. dnl Determine the platform dependent parameters needed to use rpath:
  109. dnl acl_libext,
  110. dnl acl_shlibext,
  111. dnl acl_libname_spec,
  112. dnl acl_library_names_spec,
  113. dnl acl_hardcode_libdir_flag_spec,
  114. dnl acl_hardcode_libdir_separator,
  115. dnl acl_hardcode_direct,
  116. dnl acl_hardcode_minus_L.
  117. AC_DEFUN([AC_LIB_RPATH],
  118. [
  119. dnl Complain if config.rpath is missing.
  120. AC_REQUIRE_AUX_FILE([config.rpath])
  121. AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
  122. AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
  123. AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
  124. AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
  125. AC_CACHE_CHECK([for shared library run path origin], [acl_cv_rpath], [
  126. CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
  127. ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
  128. . ./conftest.sh
  129. rm -f ./conftest.sh
  130. acl_cv_rpath=done
  131. ])
  132. wl="$acl_cv_wl"
  133. acl_libext="$acl_cv_libext"
  134. acl_shlibext="$acl_cv_shlibext"
  135. acl_libname_spec="$acl_cv_libname_spec"
  136. acl_library_names_spec="$acl_cv_library_names_spec"
  137. acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
  138. acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
  139. acl_hardcode_direct="$acl_cv_hardcode_direct"
  140. acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
  141. dnl Determine whether the user wants rpath handling at all.
  142. AC_ARG_ENABLE([rpath],
  143. [ --disable-rpath do not hardcode runtime library paths],
  144. :, enable_rpath=yes)
  145. ])
  146. dnl AC_LIB_FROMPACKAGE(name, package)
  147. dnl declares that libname comes from the given package. The configure file
  148. dnl will then not have a --with-libname-prefix option but a
  149. dnl --with-package-prefix option. Several libraries can come from the same
  150. dnl package. This declaration must occur before an AC_LIB_LINKFLAGS or similar
  151. dnl macro call that searches for libname.
  152. AC_DEFUN([AC_LIB_FROMPACKAGE],
  153. [
  154. pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
  155. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  156. define([acl_frompackage_]NAME, [$2])
  157. popdef([NAME])
  158. pushdef([PACK],[$2])
  159. pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
  160. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  161. define([acl_libsinpackage_]PACKUP,
  162. m4_ifdef([acl_libsinpackage_]PACKUP, [m4_defn([acl_libsinpackage_]PACKUP)[, ]],)[lib$1])
  163. popdef([PACKUP])
  164. popdef([PACK])
  165. ])
  166. dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
  167. dnl the libraries corresponding to explicit and implicit dependencies.
  168. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
  169. dnl Also, sets the LIB${NAME}_PREFIX variable to nonempty if libname was found
  170. dnl in ${LIB${NAME}_PREFIX}/$acl_libdirstem.
  171. AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
  172. [
  173. AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
  174. pushdef([NAME],[m4_translit([$1],[abcdefghijklmnopqrstuvwxyz./+-],
  175. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  176. pushdef([PACK],[m4_ifdef([acl_frompackage_]NAME, [acl_frompackage_]NAME, lib[$1])])
  177. pushdef([PACKUP],[m4_translit(PACK,[abcdefghijklmnopqrstuvwxyz./+-],
  178. [ABCDEFGHIJKLMNOPQRSTUVWXYZ____])])
  179. pushdef([PACKLIBS],[m4_ifdef([acl_frompackage_]NAME, [acl_libsinpackage_]PACKUP, lib[$1])])
  180. dnl By default, look in $includedir and $libdir.
  181. use_additional=yes
  182. AC_LIB_WITH_FINAL_PREFIX([
  183. eval additional_includedir=\"$includedir\"
  184. eval additional_libdir=\"$libdir\"
  185. eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
  186. eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
  187. ])
  188. AC_ARG_WITH(PACK[-prefix],
  189. [[ --with-]]PACK[[-prefix[=DIR] search for ]]PACKLIBS[[ in DIR/include and DIR/lib
  190. --without-]]PACK[[-prefix don't search for ]]PACKLIBS[[ in includedir and libdir]],
  191. [
  192. if test "X$withval" = "Xno"; then
  193. use_additional=no
  194. else
  195. if test "X$withval" = "X"; then
  196. AC_LIB_WITH_FINAL_PREFIX([
  197. eval additional_includedir=\"$includedir\"
  198. eval additional_libdir=\"$libdir\"
  199. eval additional_libdir2=\"$exec_prefix/$acl_libdirstem2\"
  200. eval additional_libdir3=\"$exec_prefix/$acl_libdirstem3\"
  201. ])
  202. else
  203. additional_includedir="$withval/include"
  204. additional_libdir="$withval/$acl_libdirstem"
  205. additional_libdir2="$withval/$acl_libdirstem2"
  206. additional_libdir3="$withval/$acl_libdirstem3"
  207. fi
  208. fi
  209. ])
  210. if test "X$additional_libdir2" = "X$additional_libdir"; then
  211. additional_libdir2=
  212. fi
  213. if test "X$additional_libdir3" = "X$additional_libdir"; then
  214. additional_libdir3=
  215. fi
  216. dnl Search the library and its dependencies in $additional_libdir and
  217. dnl $LDFLAGS. Using breadth-first-seach.
  218. LIB[]NAME=
  219. LTLIB[]NAME=
  220. INC[]NAME=
  221. LIB[]NAME[]_PREFIX=
  222. dnl HAVE_LIB${NAME} is an indicator that LIB${NAME}, LTLIB${NAME} have been
  223. dnl computed. So it has to be reset here.
  224. HAVE_LIB[]NAME=
  225. rpathdirs=
  226. ltrpathdirs=
  227. names_already_handled=
  228. names_next_round='$1 $2'
  229. while test -n "$names_next_round"; do
  230. names_this_round="$names_next_round"
  231. names_next_round=
  232. for name in $names_this_round; do
  233. already_handled=
  234. for n in $names_already_handled; do
  235. if test "$n" = "$name"; then
  236. already_handled=yes
  237. break
  238. fi
  239. done
  240. if test -z "$already_handled"; then
  241. names_already_handled="$names_already_handled $name"
  242. dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
  243. dnl or AC_LIB_HAVE_LINKFLAGS call.
  244. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'`
  245. eval value=\"\$HAVE_LIB$uppername\"
  246. if test -n "$value"; then
  247. if test "$value" = yes; then
  248. eval value=\"\$LIB$uppername\"
  249. test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
  250. eval value=\"\$LTLIB$uppername\"
  251. test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
  252. else
  253. dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
  254. dnl that this library doesn't exist. So just drop it.
  255. :
  256. fi
  257. else
  258. dnl Search the library lib$name in $additional_libdir and $LDFLAGS
  259. dnl and the already constructed $LIBNAME/$LTLIBNAME.
  260. found_dir=
  261. found_la=
  262. found_so=
  263. found_a=
  264. eval libname=\"$acl_libname_spec\" # typically: libname=lib$name
  265. if test -n "$acl_shlibext"; then
  266. shrext=".$acl_shlibext" # typically: shrext=.so
  267. else
  268. shrext=
  269. fi
  270. if test $use_additional = yes; then
  271. for additional_libdir_variable in additional_libdir additional_libdir2 additional_libdir3; do
  272. if test "X$found_dir" = "X"; then
  273. eval dir=\$$additional_libdir_variable
  274. if test -n "$dir"; then
  275. dnl The same code as in the loop below:
  276. dnl First look for a shared library.
  277. if test -n "$acl_shlibext"; then
  278. if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
  279. found_dir="$dir"
  280. found_so="$dir/$libname$shrext"
  281. else
  282. if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
  283. ver=`(cd "$dir" && \
  284. for f in "$libname$shrext".*; do echo "$f"; done \
  285. | sed -e "s,^$libname$shrext\\\\.,," \
  286. | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
  287. | sed 1q ) 2>/dev/null`
  288. if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
  289. found_dir="$dir"
  290. found_so="$dir/$libname$shrext.$ver"
  291. fi
  292. else
  293. eval library_names=\"$acl_library_names_spec\"
  294. for f in $library_names; do
  295. if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
  296. found_dir="$dir"
  297. found_so="$dir/$f"
  298. break
  299. fi
  300. done
  301. fi
  302. fi
  303. fi
  304. dnl Then look for a static library.
  305. if test "X$found_dir" = "X"; then
  306. if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
  307. found_dir="$dir"
  308. found_a="$dir/$libname.$acl_libext"
  309. fi
  310. fi
  311. if test "X$found_dir" != "X"; then
  312. if test -f "$dir/$libname.la"; then
  313. found_la="$dir/$libname.la"
  314. fi
  315. fi
  316. fi
  317. fi
  318. done
  319. fi
  320. if test "X$found_dir" = "X"; then
  321. for x in $LDFLAGS $LTLIB[]NAME; do
  322. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  323. case "$x" in
  324. -L*)
  325. dir=`echo "X$x" | sed -e 's/^X-L//'`
  326. dnl First look for a shared library.
  327. if test -n "$acl_shlibext"; then
  328. if test -f "$dir/$libname$shrext" && acl_is_expected_elfclass < "$dir/$libname$shrext"; then
  329. found_dir="$dir"
  330. found_so="$dir/$libname$shrext"
  331. else
  332. if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
  333. ver=`(cd "$dir" && \
  334. for f in "$libname$shrext".*; do echo "$f"; done \
  335. | sed -e "s,^$libname$shrext\\\\.,," \
  336. | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
  337. | sed 1q ) 2>/dev/null`
  338. if test -n "$ver" && test -f "$dir/$libname$shrext.$ver" && acl_is_expected_elfclass < "$dir/$libname$shrext.$ver"; then
  339. found_dir="$dir"
  340. found_so="$dir/$libname$shrext.$ver"
  341. fi
  342. else
  343. eval library_names=\"$acl_library_names_spec\"
  344. for f in $library_names; do
  345. if test -f "$dir/$f" && acl_is_expected_elfclass < "$dir/$f"; then
  346. found_dir="$dir"
  347. found_so="$dir/$f"
  348. break
  349. fi
  350. done
  351. fi
  352. fi
  353. fi
  354. dnl Then look for a static library.
  355. if test "X$found_dir" = "X"; then
  356. if test -f "$dir/$libname.$acl_libext" && ${AR-ar} -p "$dir/$libname.$acl_libext" | acl_is_expected_elfclass; then
  357. found_dir="$dir"
  358. found_a="$dir/$libname.$acl_libext"
  359. fi
  360. fi
  361. if test "X$found_dir" != "X"; then
  362. if test -f "$dir/$libname.la"; then
  363. found_la="$dir/$libname.la"
  364. fi
  365. fi
  366. ;;
  367. esac
  368. if test "X$found_dir" != "X"; then
  369. break
  370. fi
  371. done
  372. fi
  373. if test "X$found_dir" != "X"; then
  374. dnl Found the library.
  375. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
  376. if test "X$found_so" != "X"; then
  377. dnl Linking with a shared library. We attempt to hardcode its
  378. dnl directory into the executable's runpath, unless it's the
  379. dnl standard /usr/lib.
  380. if test "$enable_rpath" = no \
  381. || test "X$found_dir" = "X/usr/$acl_libdirstem" \
  382. || test "X$found_dir" = "X/usr/$acl_libdirstem2" \
  383. || test "X$found_dir" = "X/usr/$acl_libdirstem3"; then
  384. dnl No hardcoding is needed.
  385. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
  386. else
  387. dnl Use an explicit option to hardcode DIR into the resulting
  388. dnl binary.
  389. dnl Potentially add DIR to ltrpathdirs.
  390. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
  391. haveit=
  392. for x in $ltrpathdirs; do
  393. if test "X$x" = "X$found_dir"; then
  394. haveit=yes
  395. break
  396. fi
  397. done
  398. if test -z "$haveit"; then
  399. ltrpathdirs="$ltrpathdirs $found_dir"
  400. fi
  401. dnl The hardcoding into $LIBNAME is system dependent.
  402. if test "$acl_hardcode_direct" = yes; then
  403. dnl Using DIR/libNAME.so during linking hardcodes DIR into the
  404. dnl resulting binary.
  405. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
  406. else
  407. if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
  408. dnl Use an explicit option to hardcode DIR into the resulting
  409. dnl binary.
  410. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
  411. dnl Potentially add DIR to rpathdirs.
  412. dnl The rpathdirs will be appended to $LIBNAME at the end.
  413. haveit=
  414. for x in $rpathdirs; do
  415. if test "X$x" = "X$found_dir"; then
  416. haveit=yes
  417. break
  418. fi
  419. done
  420. if test -z "$haveit"; then
  421. rpathdirs="$rpathdirs $found_dir"
  422. fi
  423. else
  424. dnl Rely on "-L$found_dir".
  425. dnl But don't add it if it's already contained in the LDFLAGS
  426. dnl or the already constructed $LIBNAME
  427. haveit=
  428. for x in $LDFLAGS $LIB[]NAME; do
  429. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  430. if test "X$x" = "X-L$found_dir"; then
  431. haveit=yes
  432. break
  433. fi
  434. done
  435. if test -z "$haveit"; then
  436. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
  437. fi
  438. if test "$acl_hardcode_minus_L" != no; then
  439. dnl FIXME: Not sure whether we should use
  440. dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
  441. dnl here.
  442. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
  443. else
  444. dnl We cannot use $acl_hardcode_runpath_var and LD_RUN_PATH
  445. dnl here, because this doesn't fit in flags passed to the
  446. dnl compiler. So give up. No hardcoding. This affects only
  447. dnl very old systems.
  448. dnl FIXME: Not sure whether we should use
  449. dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
  450. dnl here.
  451. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
  452. fi
  453. fi
  454. fi
  455. fi
  456. else
  457. if test "X$found_a" != "X"; then
  458. dnl Linking with a static library.
  459. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
  460. else
  461. dnl We shouldn't come here, but anyway it's good to have a
  462. dnl fallback.
  463. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
  464. fi
  465. fi
  466. dnl Assume the include files are nearby.
  467. additional_includedir=
  468. case "$found_dir" in
  469. */$acl_libdirstem | */$acl_libdirstem/)
  470. basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
  471. if test "$name" = '$1'; then
  472. LIB[]NAME[]_PREFIX="$basedir"
  473. fi
  474. additional_includedir="$basedir/include"
  475. ;;
  476. */$acl_libdirstem2 | */$acl_libdirstem2/)
  477. basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'`
  478. if test "$name" = '$1'; then
  479. LIB[]NAME[]_PREFIX="$basedir"
  480. fi
  481. additional_includedir="$basedir/include"
  482. ;;
  483. */$acl_libdirstem3 | */$acl_libdirstem3/)
  484. basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem3/"'*$,,'`
  485. if test "$name" = '$1'; then
  486. LIB[]NAME[]_PREFIX="$basedir"
  487. fi
  488. additional_includedir="$basedir/include"
  489. ;;
  490. esac
  491. if test "X$additional_includedir" != "X"; then
  492. dnl Potentially add $additional_includedir to $INCNAME.
  493. dnl But don't add it
  494. dnl 1. if it's the standard /usr/include,
  495. dnl 2. if it's /usr/local/include and we are using GCC on Linux,
  496. dnl 3. if it's already present in $CPPFLAGS or the already
  497. dnl constructed $INCNAME,
  498. dnl 4. if it doesn't exist as a directory.
  499. if test "X$additional_includedir" != "X/usr/include"; then
  500. haveit=
  501. if test "X$additional_includedir" = "X/usr/local/include"; then
  502. if test -n "$GCC"; then
  503. case $host_os in
  504. linux* | gnu* | k*bsd*-gnu) haveit=yes;;
  505. esac
  506. fi
  507. fi
  508. if test -z "$haveit"; then
  509. for x in $CPPFLAGS $INC[]NAME; do
  510. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  511. if test "X$x" = "X-I$additional_includedir"; then
  512. haveit=yes
  513. break
  514. fi
  515. done
  516. if test -z "$haveit"; then
  517. if test -d "$additional_includedir"; then
  518. dnl Really add $additional_includedir to $INCNAME.
  519. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
  520. fi
  521. fi
  522. fi
  523. fi
  524. fi
  525. dnl Look for dependencies.
  526. if test -n "$found_la"; then
  527. dnl Read the .la file. It defines the variables
  528. dnl dlname, library_names, old_library, dependency_libs, current,
  529. dnl age, revision, installed, dlopen, dlpreopen, libdir.
  530. save_libdir="$libdir"
  531. case "$found_la" in
  532. */* | *\\*) . "$found_la" ;;
  533. *) . "./$found_la" ;;
  534. esac
  535. libdir="$save_libdir"
  536. dnl We use only dependency_libs.
  537. for dep in $dependency_libs; do
  538. case "$dep" in
  539. -L*)
  540. dependency_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
  541. dnl Potentially add $dependency_libdir to $LIBNAME and $LTLIBNAME.
  542. dnl But don't add it
  543. dnl 1. if it's the standard /usr/lib,
  544. dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
  545. dnl 3. if it's already present in $LDFLAGS or the already
  546. dnl constructed $LIBNAME,
  547. dnl 4. if it doesn't exist as a directory.
  548. if test "X$dependency_libdir" != "X/usr/$acl_libdirstem" \
  549. && test "X$dependency_libdir" != "X/usr/$acl_libdirstem2" \
  550. && test "X$dependency_libdir" != "X/usr/$acl_libdirstem3"; then
  551. haveit=
  552. if test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem" \
  553. || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem2" \
  554. || test "X$dependency_libdir" = "X/usr/local/$acl_libdirstem3"; then
  555. if test -n "$GCC"; then
  556. case $host_os in
  557. linux* | gnu* | k*bsd*-gnu) haveit=yes;;
  558. esac
  559. fi
  560. fi
  561. if test -z "$haveit"; then
  562. haveit=
  563. for x in $LDFLAGS $LIB[]NAME; do
  564. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  565. if test "X$x" = "X-L$dependency_libdir"; then
  566. haveit=yes
  567. break
  568. fi
  569. done
  570. if test -z "$haveit"; then
  571. if test -d "$dependency_libdir"; then
  572. dnl Really add $dependency_libdir to $LIBNAME.
  573. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$dependency_libdir"
  574. fi
  575. fi
  576. haveit=
  577. for x in $LDFLAGS $LTLIB[]NAME; do
  578. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  579. if test "X$x" = "X-L$dependency_libdir"; then
  580. haveit=yes
  581. break
  582. fi
  583. done
  584. if test -z "$haveit"; then
  585. if test -d "$dependency_libdir"; then
  586. dnl Really add $dependency_libdir to $LTLIBNAME.
  587. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$dependency_libdir"
  588. fi
  589. fi
  590. fi
  591. fi
  592. ;;
  593. -R*)
  594. dir=`echo "X$dep" | sed -e 's/^X-R//'`
  595. if test "$enable_rpath" != no; then
  596. dnl Potentially add DIR to rpathdirs.
  597. dnl The rpathdirs will be appended to $LIBNAME at the end.
  598. haveit=
  599. for x in $rpathdirs; do
  600. if test "X$x" = "X$dir"; then
  601. haveit=yes
  602. break
  603. fi
  604. done
  605. if test -z "$haveit"; then
  606. rpathdirs="$rpathdirs $dir"
  607. fi
  608. dnl Potentially add DIR to ltrpathdirs.
  609. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
  610. haveit=
  611. for x in $ltrpathdirs; do
  612. if test "X$x" = "X$dir"; then
  613. haveit=yes
  614. break
  615. fi
  616. done
  617. if test -z "$haveit"; then
  618. ltrpathdirs="$ltrpathdirs $dir"
  619. fi
  620. fi
  621. ;;
  622. -l*)
  623. dnl Handle this in the next round.
  624. dnl But on GNU systems, ignore -lc options, because
  625. dnl - linking with libc is the default anyway,
  626. dnl - linking with libc.a may produce an error
  627. dnl "/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `/usr/lib/libc.a(strcmp.o)' can not be used when making an executable; recompile with -fPIE and relink with -pie"
  628. dnl or may produce an executable that always crashes, see
  629. dnl <https://lists.gnu.org/archive/html/grep-devel/2020-09/msg00052.html>.
  630. dep=`echo "X$dep" | sed -e 's/^X-l//'`
  631. if test "X$dep" != Xc \
  632. || case $host_os in
  633. linux* | gnu* | k*bsd*-gnu) false ;;
  634. *) true ;;
  635. esac; then
  636. names_next_round="$names_next_round $dep"
  637. fi
  638. ;;
  639. *.la)
  640. dnl Handle this in the next round. Throw away the .la's
  641. dnl directory; it is already contained in a preceding -L
  642. dnl option.
  643. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
  644. ;;
  645. *)
  646. dnl Most likely an immediate library name.
  647. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
  648. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
  649. ;;
  650. esac
  651. done
  652. fi
  653. else
  654. dnl Didn't find the library; assume it is in the system directories
  655. dnl known to the linker and runtime loader. (All the system
  656. dnl directories known to the linker should also be known to the
  657. dnl runtime loader, otherwise the system is severely misconfigured.)
  658. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
  659. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
  660. fi
  661. fi
  662. fi
  663. done
  664. done
  665. if test "X$rpathdirs" != "X"; then
  666. if test -n "$acl_hardcode_libdir_separator"; then
  667. dnl Weird platform: only the last -rpath option counts, the user must
  668. dnl pass all path elements in one option. We can arrange that for a
  669. dnl single library, but not when more than one $LIBNAMEs are used.
  670. alldirs=
  671. for found_dir in $rpathdirs; do
  672. alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
  673. done
  674. dnl Note: acl_hardcode_libdir_flag_spec uses $libdir and $wl.
  675. acl_save_libdir="$libdir"
  676. libdir="$alldirs"
  677. eval flag=\"$acl_hardcode_libdir_flag_spec\"
  678. libdir="$acl_save_libdir"
  679. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
  680. else
  681. dnl The -rpath options are cumulative.
  682. for found_dir in $rpathdirs; do
  683. acl_save_libdir="$libdir"
  684. libdir="$found_dir"
  685. eval flag=\"$acl_hardcode_libdir_flag_spec\"
  686. libdir="$acl_save_libdir"
  687. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
  688. done
  689. fi
  690. fi
  691. if test "X$ltrpathdirs" != "X"; then
  692. dnl When using libtool, the option that works for both libraries and
  693. dnl executables is -R. The -R options are cumulative.
  694. for found_dir in $ltrpathdirs; do
  695. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
  696. done
  697. fi
  698. popdef([PACKLIBS])
  699. popdef([PACKUP])
  700. popdef([PACK])
  701. popdef([NAME])
  702. ])
  703. dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
  704. dnl unless already present in VAR.
  705. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
  706. dnl contains two or three consecutive elements that belong together.
  707. AC_DEFUN([AC_LIB_APPENDTOVAR],
  708. [
  709. for element in [$2]; do
  710. haveit=
  711. for x in $[$1]; do
  712. AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
  713. if test "X$x" = "X$element"; then
  714. haveit=yes
  715. break
  716. fi
  717. done
  718. if test -z "$haveit"; then
  719. [$1]="${[$1]}${[$1]:+ }$element"
  720. fi
  721. done
  722. ])
  723. dnl For those cases where a variable contains several -L and -l options
  724. dnl referring to unknown libraries and directories, this macro determines the
  725. dnl necessary additional linker options for the runtime path.
  726. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL])
  727. dnl sets LDADDVAR to linker options needed together with LIBSVALUE.
  728. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed,
  729. dnl otherwise linking without libtool is assumed.
  730. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS],
  731. [
  732. AC_REQUIRE([AC_LIB_RPATH])
  733. AC_REQUIRE([AC_LIB_PREPARE_MULTILIB])
  734. $1=
  735. if test "$enable_rpath" != no; then
  736. if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
  737. dnl Use an explicit option to hardcode directories into the resulting
  738. dnl binary.
  739. rpathdirs=
  740. next=
  741. for opt in $2; do
  742. if test -n "$next"; then
  743. dir="$next"
  744. dnl No need to hardcode the standard /usr/lib.
  745. if test "X$dir" != "X/usr/$acl_libdirstem" \
  746. && test "X$dir" != "X/usr/$acl_libdirstem2" \
  747. && test "X$dir" != "X/usr/$acl_libdirstem3"; then
  748. rpathdirs="$rpathdirs $dir"
  749. fi
  750. next=
  751. else
  752. case $opt in
  753. -L) next=yes ;;
  754. -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'`
  755. dnl No need to hardcode the standard /usr/lib.
  756. if test "X$dir" != "X/usr/$acl_libdirstem" \
  757. && test "X$dir" != "X/usr/$acl_libdirstem2" \
  758. && test "X$dir" != "X/usr/$acl_libdirstem3"; then
  759. rpathdirs="$rpathdirs $dir"
  760. fi
  761. next= ;;
  762. *) next= ;;
  763. esac
  764. fi
  765. done
  766. if test "X$rpathdirs" != "X"; then
  767. if test -n ""$3""; then
  768. dnl libtool is used for linking. Use -R options.
  769. for dir in $rpathdirs; do
  770. $1="${$1}${$1:+ }-R$dir"
  771. done
  772. else
  773. dnl The linker is used for linking directly.
  774. if test -n "$acl_hardcode_libdir_separator"; then
  775. dnl Weird platform: only the last -rpath option counts, the user
  776. dnl must pass all path elements in one option.
  777. alldirs=
  778. for dir in $rpathdirs; do
  779. alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$dir"
  780. done
  781. acl_save_libdir="$libdir"
  782. libdir="$alldirs"
  783. eval flag=\"$acl_hardcode_libdir_flag_spec\"
  784. libdir="$acl_save_libdir"
  785. $1="$flag"
  786. else
  787. dnl The -rpath options are cumulative.
  788. for dir in $rpathdirs; do
  789. acl_save_libdir="$libdir"
  790. libdir="$dir"
  791. eval flag=\"$acl_hardcode_libdir_flag_spec\"
  792. libdir="$acl_save_libdir"
  793. $1="${$1}${$1:+ }$flag"
  794. done
  795. fi
  796. fi
  797. fi
  798. fi
  799. fi
  800. AC_SUBST([$1])
  801. ])