1dnl @synopsis GP_CHECK_LIBRARY([VARNAMEPART],[libname],[VERSION-REQUIREMENT], 2dnl [headername],[functionname], 3dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], 4dnl [OPTIONAL-REQUIRED-ETC],[WHERE-TO-GET-IT]) 5dnl 6dnl Checks for the presence of a certain library. 7dnl 8dnl Parameters: 9dnl 10dnl VARNAMEPART partial variable name for variable definitions 11dnl libname name of library 12dnl VERSION-REQUIREMENT check for the version using pkg-config. 13dnl default: [] 14dnl headername name of header file 15dnl default: [] 16dnl functionname name of function name in library 17dnl default: [] 18dnl ACTION-IF-FOUND shell action to execute if found 19dnl default: [] 20dnl ACTION-IF-NOT-FOUND shell action to execute if not found 21dnl default: [] 22dnl OPTIONAL-REQUIRED-ETC one of "mandatory", "default-on", "default-off" 23dnl "disable-explicitly" 24dnl default: [mandatory] 25dnl WHERE-TO-GET-IT place where to find the library, e.g. a URL 26dnl default: [] 27dnl 28dnl What the ACTION-IFs can do: 29dnl 30dnl * change the variable have_[$1] to "yes" or "no" and thus change 31dnl the outcome of the test 32dnl * execute additional checks to define more specific variables, e.g. 33dnl for different API versions 34dnl 35dnl What the OPTIONAL-REQUIRED-ETC options mean: 36dnl 37dnl mandatory Absolute requirement, cannot be disabled. 38dnl default-on If found, it is used. If not found, it is not used. 39dnl default-off In case of --with-libfoo, detect it. Without 40dnl --with-libfoo, do not look for and use it. 41dnl disable-explicitly Required by default, but can be disabled by 42dnl explicitly giving --without-libfoo. 43dnl 44dnl These results have happened after calling GP_CHECK_LIBRARY: 45dnl 46dnl AM_CONDITIONAL([HAVE_VARPREFIX],[ if found ]) 47dnl AM_SUBST([have_VARPREFIX], [ "yes" if found, "no" if not found ]) 48dnl AM_SUBST([VARPREFIX_CFLAGS],[ -I, -D and stuff ]) 49dnl AM_SUBST([VARPREFIX_LIBS], [ /path/to/libname.la -L/path -lfoo ]) 50dnl 51dnl Parameters to ./configure which influence the GP_CHECK_LIBRARY results: 52dnl 53dnl * VARNAMEPART_LIBS=/foobar/arm-palmos/lib/libname.la 54dnl VARNAMEPART_CFLAGS=-I/foobar/include 55dnl * --without-libfoo 56dnl * --with-libfoo=/usr/local 57dnl * --with-libfoo-include-dir=/foobar/include 58dnl * --with-libfoo-lib=/foobar/arm-palmos/lib 59dnl * --with-libfoo=autodetect 60dnl 61dnl Examples: 62dnl GP_CHECK_LIBRARY([LIBEXIF], [libexif])dnl 63dnl GP_CHECK_LIBRARY([LIBEXIF], [libexif-gtk], [>= 0.3.3])dnl 64dnl note the space! ^ 65dnl 66dnl Possible enhancements: 67dnl 68dnl * Derive VAR_PREFIX directly from libname 69dnl This will change the calling conventions, so be aware of that. 70dnl * Give names of a header file and function name and to a test 71dnl compilation. 72dnl 73AC_DEFUN([_GP_CHECK_LIBRARY_SOEXT],[dnl 74AC_MSG_CHECKING([for dynamic library extension]) 75soext="" 76case "$host" in 77 *linux*) soext=".so" ;; 78 *sunos*) soext=".so" ;; 79 *solaris*) soext=".so" ;; 80 *bsd*) soext=".so" ;; 81 *darwin*) soext=".dylib" ;; 82 *w32*) soext=".dll" ;; 83esac 84if test "x$soext" = "x"; then 85 soext=".so" 86 AC_MSG_RESULT([${soext}]) 87 AC_MSG_WARN([ 88Host system "${host}" not recognized, defaulting to "${soext}". 89]) 90else 91 AC_MSG_RESULT([${soext}]) 92fi 93])dnl 94dnl 95AC_DEFUN([_GP_CHECK_LIBRARY],[ 96# ---------------------------------------------------------------------- 97# [GP_CHECK_LIBRARY]([$1],[$2],[$3], 98# [$4],[$5], 99# [...],[...],[$8]) 100m4_ifval([$9],[dnl 101# $9 102])dnl 103# ---------------------------------------------------------------------- 104dnl 105AC_REQUIRE([GP_CONFIG_MSG])dnl 106AC_REQUIRE([GP_PKG_CONFIG])dnl 107AC_REQUIRE([_GP_CHECK_LIBRARY_SOEXT])dnl 108# Use _CFLAGS and _LIBS given to configure. 109# This makes it possible to set these vars in a configure script 110# and AC_CONFIG_SUBDIRS this configure. 111AC_ARG_VAR([$1][_CFLAGS], [CFLAGS for compiling with ][$2])dnl 112AC_ARG_VAR([$1][_LIBS], [LIBS to add for linking against ][$2])dnl 113dnl 114AC_MSG_CHECKING([for ][$2][ to use]) 115m4_ifval([$3],[REQUIREMENTS_FOR_][$1][="][$2][ $3]["], 116 [REQUIREMENTS_FOR_][$1][="][$2]["]) 117userdef_[$1]=no 118have_[$1]=no 119if test "x${[$1][_LIBS]}" = "x" && test "x${[$1][_CFLAGS]}" = "x"; then 120 # define --with/--without argument 121 m4_if([$8], [default-off], 122 [m4_pushdef([gp_lib_arg],[--without-][$2])dnl 123 try_[$1]=no 124 ], 125 [m4_pushdef([gp_lib_arg],[--with-][$2])dnl 126 try_[$1]=auto 127 ])dnl 128 AC_ARG_WITH([$2],[AS_HELP_STRING([gp_lib_arg][=PREFIX],[where to find ][$2][, "no" or "auto"])],[try_][$1][="$withval"]) 129 if test "x${[try_][$1]}" = "xno"; then 130 [REQUIREMENTS_FOR_][$1][=] 131 fi 132 if test "x${[try_][$1]}" = "xauto"; then [try_][$1]=autodetect; fi 133 AC_MSG_RESULT([${try_][$1][}]) 134 m4_popdef([gp_lib_arg])dnl 135 if test "x${[try_][$1]}" = "xautodetect"; then 136 # OK, we have to autodetect. 137 # We start autodetection with the cleanest known method: pkg-config 138 if test "x${[have_][$1]}" = "xno"; then 139 # we need that line break after the PKG_CHECK_MODULES 140 m4_ifval([$3], 141 [PKG_CHECK_MODULES([$1],[$2][ $3],[have_][$1][=yes],[:])], 142 [PKG_CHECK_MODULES([$1],[$2], [have_][$1][=yes],[:])] 143 ) 144 fi 145 # If pkg-config didn't find anything, try the libfoo-config program 146 # certain known libraries ship with. 147 if test "x${[have_][$1]}" = "xno"; then 148 AC_MSG_CHECKING([$2][ config program]) 149 m4_pushdef([gp_lib_config],[m4_if([$2],[libusb],[libusb-config], 150 [$2],[libgphoto2],[gphoto2-config], 151 [$2],[libgphoto2_port],[gphoto2-port-config], 152 [none])])dnl 153 AC_MSG_RESULT([gp_lib_config]) 154 AC_PATH_PROG([$1][_CONFIG_PROG],[gp_lib_config]) 155 if test -n "${[$1][_CONFIG_PROG]}" && 156 test "${[$1][_CONFIG_PROG]}" != "none"; then 157 m4_ifval([$3],[ 158 AC_MSG_CHECKING([for ][$2][ version according to ][gp_lib_config]) 159 m4_pushdef([gp_lib_compop],[regexp([$3], [\(>=\|>\|<\|<=\|=\)[ \t]*.*], [\1])])dnl comparison operator 160 m4_if( gp_lib_compop,[>=],[_][$1][_COMPN="-lt"], 161 gp_lib_compop,[>], [_][$1][_COMPN="-le"], 162 gp_lib_compop,[<], [_][$1][_COMPN="-ge"], 163 gp_lib_compop,[<=],[_][$1][_COMPN="-gt"], 164 gp_lib_compop,[=], [_][$1][_COMPN="-ne"], 165 [m4_errprint(__file__:__line__:[ Error: 166Illegal version comparison operator: `gp_lib_compop' 167It must be one of ">=", ">", "<", "<=", "=". 168])m4_exit(1)]) 169 m4_popdef([gp_lib_compop])dnl 170 # split requested version number using m4 regexps 171 _[$1]_REQ_1="regexp([$3], [\(>=\|>\|<\|<=\|=\)[ \t]*\([0-9]+\).*], [\2])" 172 _[$1]_REQ_2="regexp([$3], [\(>=\|>\|<\|<=\|=\)[ \t]*\([0-9]+\)\.\([0-9]+\).*], [\3])" 173 _[$1]_REQ_3="regexp([$3], [\(>=\|>\|<\|<=\|=\)[ \t]*\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\).*], [\4])" 174 _[$1]_REQ_4="regexp([$3], [\(>=\|>\|<\|<=\|=\)[ \t]*\([0-9]+\)\.\([0-9]+\)\.\([0-9]+\)\(.*\)], [\5])" 175 # split installed version number via shell and sed 176 _[$1]_VERSION="$("${[$1][_CONFIG_PROG]}" --version | sed 's/^.* //')" 177 _[$1]_VER_1="$(echo "${_[$1]_VERSION}" | sed 's/\([[0-9]]*\).*/\1/g')" 178 _[$1]_VER_2="$(echo "${_[$1]_VERSION}" | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/g')" 179 _[$1]_VER_3="$(echo "${_[$1]_VERSION}" | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/g')" 180 _[$1]_VER_4="$(echo "${_[$1]_VERSION}" | sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)\(.*\)/\4/g')" 181 AC_MSG_RESULT([${_][$1][_VERSION}]) 182 _tmp=false 183 if test "${_[$1]_VER_1}" "${_[$1]_COMPN}" "${_[$1]_REQ_1}"; then _tmp=true; 184 elif test "${_[$1]_VER_2}" "${_[$1]_COMPN}" "${_[$1]_REQ_2}"; then _tmp=true; 185 elif test "${_[$1]_VER_3}" "${_[$1]_COMPN}" "${_[$1]_REQ_3}"; then _tmp=true; 186 elif test "x${_[$1]_VER_4}" = "x" && test "x${_[$1]_REQ_4}" != "x"; then _tmp=true; 187 elif test "${_[$1]_VER_4}" "${_[$1]_COMPN}" "${_[$1]_REQ_4}"; then _tmp=true; 188 fi 189 AC_MSG_CHECKING([if ][$2][ version is matching requirement ][$3]) 190 if "${_tmp}"; then 191 AC_MSG_RESULT([no]) 192 AC_MSG_ERROR([Version requirement ][$2][ ][$3][ not met. Found: ${_][$1][_VERSION}]) 193 else 194 AC_MSG_RESULT([yes]) 195 fi 196 ])dnl if version requirement given 197 AC_MSG_CHECKING([for ][$2][ parameters from ][gp_lib_config]) 198 [$1]_LIBS="$(${[$1][_CONFIG_PROG]} --libs || echo "*error*")" 199 [$1]_CFLAGS="$(${[$1][_CONFIG_PROG]} --cflags || echo "*error*")" 200 if test "x${[$1]_LIBS}" = "*error*" || 201 test "x${[$1]_CFLAGS}" = "*error*"; then 202 AC_MSG_RESULT([error]) 203 else 204 have_[$1]=yes 205 AC_MSG_RESULT([ok]) 206 fi 207 fi 208 m4_popdef([gp_lib_config])dnl 209 fi 210 m4_ifval([$3],[# Version requirement given, so we do not rely on probing.],[ 211 # Neither pkg-config, nor the libfoo-config program have found anything. 212 # So let's just probe the system. 213 AC_MSG_WARN([The `$2' library could not be found using pkg-config or its known config program. 214No version checks will be performed if it is found using any other method.]) 215 if test "x${[have_][$1]}" = "xno"; then 216 ifs="$IFS" 217 IFS=":" # FIXME: for W32 and OS/2 we may need ";" here 218 for _libdir_ in \ 219 ${LD_LIBRARY_PATH} \ 220 "${libdir}" \ 221 "${prefix}/lib64" "${prefix}/lib" \ 222 /usr/lib64 /usr/lib \ 223 /usr/local/lib64 /usr/local/lib \ 224 /opt/lib64 /opt/lib 225 do 226 IFS="$ifs" 227 for _soext_ in .la ${soext} .a; do 228 if test -f "${_libdir_}/[$2]${_soext_}" 229 then 230 if test "x${_soext_}" = "x.la" || 231 test "x${_soext_}" = "x.a"; then 232 [$1]_LIBS="${_libdir_}/[$2]${_soext_}" 233 else 234 [$1]_LIBS="-L${_libdir_} -l$(echo "$2" | sed 's/^lib//')" 235 fi 236 break 237 fi 238 done 239 if test "x${[$1][_LIBS]}" != "x"; then 240 break 241 fi 242 done 243 IFS="$ifs" 244 if test "x${[$1][_LIBS]}" != "x"; then 245 have_[$1]=yes 246 fi 247 fi 248 ]) 249 elif test "x${[try_][$1]}" = "xno"; then 250 : 251 else 252 # We've been given a prefix to look in for library $2. 253 # We start looking for $2.la files first. 254 AC_MSG_CHECKING([for ][$2][.la file in ${[try_][$1]}]) 255 if test -f "${[try_][$1]}/lib/[$2].la"; then 256 [$1][_LIBS]="${[try_][$1]}/lib/[$2].la" 257 [$1][_CFLAGS]="-I${[try_][$1]}/include" 258 AC_MSG_RESULT([libtool file $][$1][_LIBS (good)]) 259 have_[$1]=yes 260 elif test -f "${[try_][$1]}/lib64/[$2].la"; then # HACK 261 [$1][_LIBS]="${[try_][$1]}/lib64/[$2].la" 262 [$1][_CFLAGS]="-I${[try_][$1]}/include" 263 AC_MSG_RESULT([libtool file $][$1][_LIBS (good)]) 264 have_[$1]=yes 265 else 266 AC_MSG_RESULT([wild guess that something is in $try_][$1]) 267 [$1][_LIBS]="-L${[try_][$1]}/lib -l$(echo "$2" | sed 's/^lib//')" 268 [$1][_CFLAGS]="-I${[try_][$1]}/include" 269 have_[$1]=yes 270 AC_MSG_WARN([ 271* Warning: 272* libtool file $2.la could not be found. 273* We may be linking against the WRONG library. 274]) 275 fi 276 fi 277elif test "x${[$1][_LIBS]}" != "x" && test "x${[$1][_CFLAGS]}" != "x"; then 278 AC_MSG_RESULT([user-defined]) 279 userdef_[$1]=yes 280 have_[$1]=yes 281else 282 AC_MSG_RESULT([broken call]) 283 AC_MSG_ERROR([ 284* Fatal: 285* When calling configure for ${PACKAGE_TARNAME} 286* ${PACKAGE_NAME} 287* either set both [$1][_LIBS] *and* [$1][_CFLAGS] 288* or neither. 289]) 290fi 291AC_SUBST([REQUIREMENTS_FOR_][$1]) 292dnl 293dnl ACTION-IF-FOUND 294dnl 295m4_ifval([$6],[dnl 296if test "x${[have_][$1]}" = "xyes"; then 297# ACTION-IF-FOUND 298$6 299fi 300])dnl 301dnl 302dnl ACTION-IF-NOT-FOUND 303dnl 304m4_ifval([$7],[dnl 305if test "x${[have_][$1]}" = "xno"; then 306# ACTION-IF-NOT-FOUND 307$7 308fi 309])dnl 310dnl 311dnl Run our own test compilation 312dnl 313m4_ifval([$4],[dnl 314if test "x${[have_][$1]}" = "xyes"; then 315dnl AC_MSG_CHECKING([whether ][$2][ test compile succeeds]) 316dnl AC_MSG_RESULT([${[have_][$1]}]) 317CPPFLAGS_save="$CPPFLAGS" 318CPPFLAGS="${[$1]_CFLAGS}" 319AC_CHECK_HEADER([$4],[have_][$1][=yes],[have_][$1][=no]) 320CPPFLAGS="$CPPFLAGS_save" 321fi 322])dnl 323dnl 324dnl Run our own test link 325dnl Does not work for libraries which be built after configure time, 326dnl so we deactivate it for them (userdef_). 327dnl 328m4_ifval([$5],[dnl 329if test "x${[userdef_][$1]}" = "xno" && test "x${[have_][$1]}" = "xyes"; then 330 AC_MSG_CHECKING([for function ][$5][ in ][$2]) 331 LIBS_save="$LIBS" 332 LIBS="${[$1]_LIBS}" 333 AC_TRY_LINK_FUNC([$5],[],[have_][$1][=no]) 334 LIBS="$LIBS_save" 335 AC_MSG_RESULT([${[have_][$1]}]) 336fi 337])dnl 338dnl 339dnl Abort configure script if mandatory, but not found 340dnl 341m4_if([$8],[mandatory],[ 342if test "x${[have_][$1]}" = "xno"; then 343 AC_MSG_ERROR([ 344PKG_CONFIG_PATH=${PKG_CONFIG_PATH} 345[$1][_LIBS]=${[$1][_LIBS]} 346[$1][_CFLAGS]=${[$1][_CFLAGS]} 347 348* Fatal: ${PACKAGE_NAME} requires $2 $3 to build. 349* 350* Possible solutions: 351* - set PKG_CONFIG_PATH to adequate value 352* - call configure with [$1][_LIBS]=.. and [$1][_CFLAGS]=.. 353* - call configure with one of the --with-$2 parameters 354][m4_ifval([$9],[dnl 355* - get $2 and install it: 356* $9],[dnl 357* - get $2 and install it])]) 358fi 359])dnl 360dnl 361dnl Abort configure script if not found and not explicitly disabled 362dnl 363m4_if([$8],[disable-explicitly],[ 364if test "x${[try_][$1]}" != "xno" && test "x${[have_][$1]}" = "xno"; then 365 AC_MSG_ERROR([ 366PKG_CONFIG_PATH=${PKG_CONFIG_PATH} 367[$1][_LIBS]=${[$1][_LIBS]} 368[$1][_CFLAGS]=${[$1][_CFLAGS]} 369 370* Fatal: ${PACKAGE_NAME} by default requires $2 $3 to build. 371* You must explicitly disable $2 to build ${PACKAGE_TARNAME} without it. 372* 373* Possible solutions: 374* - call configure with --with-$2=no or --without-$2 375* - set PKG_CONFIG_PATH to adequate value 376* - call configure with [$1][_LIBS]=.. and [$1][_CFLAGS]=.. 377* - call configure with one of the --with-$2 parameters 378][m4_ifval([$9],[dnl 379* - get $2 and install it: 380* $9],[dnl 381* - get $2 and install it 382])][m4_if([$2],[libusb],[dnl 383* - if you have libusb >= 1.0 installed, you must also install 384* either the libusb0 compat library or a libusb 0.x version 385])]) 386fi 387])dnl 388AM_CONDITIONAL([HAVE_][$1], [test "x$have_[$1]" = "xyes"]) 389if test "x$have_[$1]" = "xyes"; then 390 AC_DEFINE([HAVE_][$1], 1, [whether we compile with ][$2][ support]) 391 GP_CONFIG_MSG([$2],[yes])dnl 392 AC_MSG_CHECKING([$2][ library flags]) 393 AC_MSG_RESULT(["${[$1][_LIBS]}"]) 394 AC_MSG_CHECKING([$2][ cpp flags]) 395 AC_MSG_RESULT(["${[$1][_CFLAGS]}"]) 396else 397 GP_CONFIG_MSG([$2],[no])dnl 398fi 399dnl AC_SUBST is done implicitly by AC_ARG_VAR above. 400dnl AC_SUBST([$1][_LIBS]) 401dnl AC_SUBST([$1][_CFLAGS]) 402])dnl 403dnl 404dnl #################################################################### 405dnl 406AC_DEFUN([_GP_CHECK_LIBRARY_SYNTAX_ERROR],[dnl 407m4_errprint(__file__:__line__:[ Error: 408*** Calling $0 macro with old syntax 409*** Aborting. 410])dnl 411m4_exit(1)dnl 412])dnl 413dnl 414dnl #################################################################### 415dnl 416AC_DEFUN([GP_CHECK_LIBRARY],[dnl 417m4_if([$4], [mandatory], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)], 418 [$4], [default-enabled], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)], 419 [$4], [default-disabled], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)])dnl 420m4_if([$8], [], [dnl 421 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[mandatory],[$9])], 422 [$8], [default-on], [dnl 423 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 424 [$8], [disable-explicitly], [dnl 425 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 426 [$8], [default-off], [dnl 427 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 428 [$8], [mandatory], [dnl 429 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 430 [m4_errprint(__file__:__line__:[ Error: 431Illegal argument 6 to $0: `$6' 432It must be one of "default-on", "default-off", "mandatory". 433])m4_exit(1)])dnl 434])dnl 435dnl 436m4_pattern_disallow([GP_CHECK_LIBRARY]) 437m4_pattern_disallow([_GP_CHECK_LIBRARY]) 438m4_pattern_disallow([_GP_CHECK_LIBRARY_SYNTAX_ERROR]) 439m4_pattern_disallow([_GP_CHECK_LIBRARY_SOEXT]) 440dnl 441dnl #################################################################### 442dnl 443dnl Please do not remove this: 444dnl filetype: 6e60b4f0-acb2-4cd5-8258-42014f92bd2c 445dnl I use this to find all the different instances of this file which 446dnl are supposed to be synchronized. 447dnl 448dnl Local Variables: 449dnl mode: autoconf 450dnl End: 451