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 108dnl Use _CFLAGS and _LIBS given to configure. 109dnl This makes it possible to set these vars in a configure script 110dnl 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]) 115userdef_[$1]=no 116have_[$1]=no 117if test "x${[$1][_LIBS]}" = "x" && test "x${[$1][_CFLAGS]}" = "x"; then 118 dnl define --with/--without argument 119 m4_if([$8], [default-off], 120 [m4_pushdef([gp_lib_arg],[--without-][$2])dnl 121 try_[$1]=no 122 ], 123 [m4_pushdef([gp_lib_arg],[--with-][$2])dnl 124 try_[$1]=auto 125 ])dnl 126 AC_ARG_WITH([$2],[AS_HELP_STRING([gp_lib_arg][=PREFIX],[where to find ][$2][, "no" or "auto"])],[try_][$1][="$withval"]) 127 if test "x${[try_][$1]}" = "xauto"; then [try_][$1]=autodetect; fi 128 AC_MSG_RESULT([${try_][$1][}]) 129 m4_popdef([gp_lib_arg])dnl 130 if test "x${[try_][$1]}" = "xautodetect"; then 131 dnl OK, we have to autodetect. 132 dnl We start autodetection with the cleanest known method: pkg-config 133 if test "x${[have_][$1]}" = "xno"; then 134 dnl we need that line break after the PKG_CHECK_MODULES 135 m4_ifval([$3], 136 [PKG_CHECK_MODULES([$1],[$2][ $3],[have_][$1][=yes],[:])], 137 [PKG_CHECK_MODULES([$1],[$2], [have_][$1][=yes],[:])] 138 ) 139 fi 140 dnl If pkg-config didn't find anything, try the libfoo-config program 141 dnl certain known libraries ship with. 142 if test "x${[have_][$1]}" = "xno"; then 143 AC_MSG_WARN([The `$2' library could not be found using pkg-config. 144No version checks will be performed if it is found using any other method.]) 145 AC_MSG_CHECKING([$2][ config program]) 146 m4_pushdef([gp_lib_config],[m4_if([$2],[libusb],[libusb-config], 147 [$2],[libgphoto2],[gphoto2-config], 148 [$2],[libgphoto2_port],[gphoto2-port-config], 149 [none])])dnl 150 AC_MSG_RESULT([gp_lib_config]) 151 AC_PATH_PROG([$1][_CONFIG_PROG],[gp_lib_config]) 152 if test -n "${[$1][_CONFIG_PROG]}" && 153 test "${[$1][_CONFIG_PROG]}" != "none"; then 154 AC_MSG_CHECKING([for ][$2][ parameters from ][gp_lib_config]) 155 [$1]_LIBS="$(${[$1][_CONFIG_PROG]} --libs || echo "*error*")" 156 [$1]_CFLAGSS="$(${[$1][_CONFIG_PROG]} --cflags || echo "*error*")" 157 if test "x${[$1]_LIBS}" = "*error*" || 158 test "x${[$1]_CFLAGS}" = "*error*"; then 159 AC_MSG_RESULT([error]) 160 else 161 have_[$1]=yes 162 AC_MSG_RESULT([ok]) 163 fi 164 fi 165 m4_popdef([gp_lib_config])dnl 166 fi 167 dnl Neither pkg-config, nor the libfoo-config program have found anything. 168 dnl So let's just probe the system. 169 if test "x${[have_][$1]}" = "xno"; then 170 ifs="$IFS" 171 IFS=":" # FIXME: for W32 and OS/2 we may need ";" here 172 for _libdir_ in \ 173 ${LD_LIBRARY_PATH} \ 174 "${libdir}" \ 175 "${prefix}/lib64" "${prefix}/lib" \ 176 /usr/lib64 /usr/lib \ 177 /usr/local/lib64 /usr/local/lib \ 178 /opt/lib64 /opt/lib 179 do 180 IFS="$ifs" 181 for _soext_ in .la ${soext} .a; do 182 if test -f "${_libdir_}/[$2]${_soext_}" 183 then 184 if test "x${_soext_}" = "x.la" || 185 test "x${_soext_}" = "x.a"; then 186 [$1]_LIBS="${_libdir_}/[$2]${_soext_}" 187 else 188 [$1]_LIBS="-L${_libdir_} -l$(echo "$2" | sed 's/^lib//')" 189 fi 190 break 191 fi 192 done 193 if test "x${[$1][_LIBS]}" != "x"; then 194 break 195 fi 196 done 197 IFS="$ifs" 198 if test "x${[$1][_LIBS]}" != "x"; then 199 have_[$1]=yes 200 fi 201 fi 202 elif test "x${[try_][$1]}" = "xno"; then 203 : 204 else 205 [$1][_LIBS]="-L${[try_][$1]}/lib -l$(echo "$2" | sed 's/^lib//')" 206 [$1][_CFLAGS]="-I${[try_][$1]}/include" 207 fi 208elif test "x${[$1][_LIBS]}" != "x" && test "x${[$1][_CFLAGS]}" != "x"; then 209 AC_MSG_RESULT([user-defined]) 210 userdef_[$1]=yes 211 have_[$1]=yes 212else 213 AC_MSG_RESULT([broken call]) 214 AC_MSG_ERROR([ 215* Fatal: 216* When calling configure for ${PACKAGE_TARNAME} 217* ${PACKAGE_NAME} 218* either set both [$1][_LIBS] *and* [$1][_CFLAGS] 219* or neither. 220]) 221fi 222dnl 223dnl ACTION-IF-FOUND 224dnl 225m4_ifval([$6],[dnl 226if test "x${[have_][$1]}" = "xyes"; then 227# ACTION-IF-FOUND 228$6 229fi 230])dnl 231dnl 232dnl ACTION-IF-NOT-FOUND 233dnl 234m4_ifval([$7],[dnl 235if test "x${[have_][$1]}" = "xno"; then 236# ACTION-IF-NOT-FOUND 237$7 238fi 239])dnl 240dnl 241dnl Run our own test compilation 242dnl 243m4_ifval([$4],[dnl 244if test "x${[have_][$1]}" = "xyes"; then 245dnl AC_MSG_CHECKING([whether ][$2][ test compile succeeds]) 246dnl AC_MSG_RESULT([${[have_][$1]}]) 247CPPFLAGS_save="$CPPFLAGS" 248CPPFLAGS="${[$1]_CFLAGS}" 249AC_CHECK_HEADER([$4],[have_][$1][=yes],[have_][$1][=no]) 250CPPFLAGS="$CPPFLAGS_save" 251fi 252])dnl 253dnl 254dnl Run our own test link 255dnl Does not work for libraries which be built after configure time, 256dnl so we deactivate it for them (userdef_). 257dnl 258m4_ifval([$5],[dnl 259if test "x${[userdef_][$1]}" = "xno" && test "x${[have_][$1]}" = "xyes"; then 260 AC_MSG_CHECKING([for function ][$5][ in ][$2]) 261 LIBS_save="$LIBS" 262 LIBS="${[$1]_LIBS}" 263 AC_TRY_LINK_FUNC([$5],[],[have_][$1][=no]) 264 LIBS="$LIBS_save" 265 AC_MSG_RESULT([${[have_][$1]}]) 266fi 267])dnl 268dnl 269dnl Abort configure script if mandatory, but not found 270dnl 271m4_if([$8],[mandatory],[ 272if test "x${[have_][$1]}" = "xno"; then 273 AC_MSG_ERROR([ 274PKG_CONFIG_PATH=${PKG_CONFIG_PATH} 275[$1][_LIBS]=${[$1][_LIBS]} 276[$1][_CFLAGS]=${[$1][_CFLAGS]} 277 278* Fatal: ${PACKAGE_NAME} requires $2 to build. 279* 280* Possible solutions: 281* - set PKG_CONFIG_PATH to adequate value 282* - call configure with [$1][_LIBS]=.. and [$1][_CFLAGS]=.. 283* - call configure with one of the --with-$2 parameters 284]m4_ifval([$9],[dnl 285* - get $2 and install it 286],[dnl 287* - get $2 and install it: 288 $9])) 289fi 290])dnl 291dnl 292dnl Abort configure script if not found and not explicitly disabled 293dnl 294m4_if([$8],[disable-explicitly],[ 295if test "x${[try_][$1]}" != "xno" && test "x${[have_][$1]}" = "xno"; then 296 AC_MSG_ERROR([ 297PKG_CONFIG_PATH=${PKG_CONFIG_PATH} 298[$1][_LIBS]=${[$1][_LIBS]} 299[$1][_CFLAGS]=${[$1][_CFLAGS]} 300 301* Fatal: ${PACKAGE_NAME} by default requires $2 to build. 302* You must explicitly disable $2 to build ${PACKAGE_TARNAME} without it. 303* 304* Possible solutions: 305* - call configure with --with-$2=no or --without-$2 306* - set PKG_CONFIG_PATH to adequate value 307* - call configure with [$1][_LIBS]=.. and [$1][_CFLAGS]=.. 308* - call configure with one of the --with-$2 parameters 309]m4_ifval([$9],[dnl 310* - get $2 and install it 311],[dnl 312* - get $2 and install it: 313 $9])) 314fi 315])dnl 316AM_CONDITIONAL([HAVE_][$1], [test "x$have_[$1]" = "xyes"]) 317if test "x$have_[$1]" = "xyes"; then 318 AC_DEFINE([HAVE_][$1], 1, [whether we compile with ][$2][ support]) 319 GP_CONFIG_MSG([$2],[yes])dnl 320 AC_MSG_CHECKING([$2][ library flags]) 321 AC_MSG_RESULT([${[$1][_LIBS]}]) 322 AC_MSG_CHECKING([$2][ cpp flags]) 323 AC_MSG_RESULT([${[$1][_CFLAGS]}]) 324else 325 GP_CONFIG_MSG([$2],[no])dnl 326fi 327dnl AC_SUBST is done implicitly by AC_ARG_VAR above. 328dnl AC_SUBST([$1][_LIBS]) 329dnl AC_SUBST([$1][_CFLAGS]) 330])dnl 331dnl 332dnl #################################################################### 333dnl 334AC_DEFUN([_GP_CHECK_LIBRARY_SYNTAX_ERROR],[dnl 335m4_errprint(__file__:__line__:[ Error: 336*** Calling $0 macro with old syntax 337*** Aborting. 338])dnl 339m4_exit(1)dnl 340])dnl 341dnl 342dnl #################################################################### 343dnl 344AC_DEFUN([GP_CHECK_LIBRARY],[dnl 345m4_if([$4], [mandatory], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)], 346 [$4], [default-enabled], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)], 347 [$4], [default-disabled], [_GP_CHECK_LIBRARY_SYNTAX_ERROR($0)])dnl 348m4_if([$8], [], [dnl 349 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[mandatory],[$9])], 350 [$8], [default-on], [dnl 351 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 352 [$8], [disable-explicitly], [dnl 353 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 354 [$8], [default-off], [dnl 355 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 356 [$8], [mandatory], [dnl 357 _GP_CHECK_LIBRARY([$1],[$2],[$3],[$4],[$5],[$6],[$7],[$8],[$9])], 358 [m4_errprint(__file__:__line__:[ Error: 359Illegal argument 6 to $0: `$6' 360It must be one of "default-on", "default-off", "mandatory". 361])m4_exit(1)])dnl 362])dnl 363dnl 364m4_pattern_disallow([GP_CHECK_LIBRARY]) 365m4_pattern_disallow([_GP_CHECK_LIBRARY]) 366m4_pattern_disallow([_GP_CHECK_LIBRARY_SYNTAX_ERROR]) 367m4_pattern_disallow([_GP_CHECK_LIBRARY_SOEXT]) 368dnl 369dnl #################################################################### 370dnl 371dnl Please do not remove this: 372dnl filetype: 6e60b4f0-acb2-4cd5-8258-42014f92bd2c 373dnl I use this to find all the different instances of this file which 374dnl are supposed to be synchronized. 375dnl 376dnl Local Variables: 377dnl mode: autoconf 378dnl End: 379