Home | History | Annotate | Download | only in m4m
      1 dnl @synopsis GP_CHECK_LIBRARY([VARNAMEPART],[libname],[VERSION-REQUIREMENT],
      2 dnl                            [headername],[functionname],
      3 dnl                            [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND],
      4 dnl                            [OPTIONAL-REQUIRED-ETC],[WHERE-TO-GET-IT])
      5 dnl
      6 dnl Checks for the presence of a certain library.
      7 dnl
      8 dnl Parameters:
      9 dnl
     10 dnl    VARNAMEPART            partial variable name for variable definitions
     11 dnl    libname                name of library
     12 dnl    VERSION-REQUIREMENT    check for the version using pkg-config.
     13 dnl                           default: []
     14 dnl    headername             name of header file
     15 dnl                           default: []
     16 dnl    functionname           name of function name in library
     17 dnl                           default: []
     18 dnl    ACTION-IF-FOUND        shell action to execute if found
     19 dnl                           default: []
     20 dnl    ACTION-IF-NOT-FOUND    shell action to execute if not found
     21 dnl                           default: []
     22 dnl    OPTIONAL-REQUIRED-ETC  one of "mandatory", "default-on", "default-off"
     23 dnl                                  "disable-explicitly"
     24 dnl                           default: [mandatory]
     25 dnl    WHERE-TO-GET-IT        place where to find the library, e.g. a URL
     26 dnl                           default: []
     27 dnl
     28 dnl What the ACTION-IFs can do:
     29 dnl
     30 dnl   * change the variable have_[$1] to "yes" or "no" and thus change
     31 dnl     the outcome of the test
     32 dnl   * execute additional checks to define more specific variables, e.g.
     33 dnl     for different API versions
     34 dnl
     35 dnl What the OPTIONAL-REQUIRED-ETC options mean:
     36 dnl
     37 dnl   mandatory           Absolute requirement, cannot be disabled.
     38 dnl   default-on          If found, it is used. If not found, it is not used.
     39 dnl   default-off         In case of --with-libfoo, detect it. Without
     40 dnl                       --with-libfoo, do not look for and use it.
     41 dnl   disable-explicitly  Required by default, but can be disabled by
     42 dnl                       explicitly giving --without-libfoo.
     43 dnl
     44 dnl These results have happened after calling GP_CHECK_LIBRARY:
     45 dnl
     46 dnl    AM_CONDITIONAL([HAVE_VARPREFIX],[ if found ])
     47 dnl    AM_SUBST([have_VARPREFIX], [ "yes" if found, "no" if not found ])
     48 dnl    AM_SUBST([VARPREFIX_CFLAGS],[ -I, -D and stuff ])
     49 dnl    AM_SUBST([VARPREFIX_LIBS], [ /path/to/libname.la -L/path -lfoo ])
     50 dnl
     51 dnl Parameters to ./configure which influence the GP_CHECK_LIBRARY results:
     52 dnl
     53 dnl   * VARNAMEPART_LIBS=/foobar/arm-palmos/lib/libname.la
     54 dnl     VARNAMEPART_CFLAGS=-I/foobar/include
     55 dnl   * --without-libfoo
     56 dnl   * --with-libfoo=/usr/local
     57 dnl   * --with-libfoo-include-dir=/foobar/include
     58 dnl   * --with-libfoo-lib=/foobar/arm-palmos/lib
     59 dnl   * --with-libfoo=autodetect
     60 dnl
     61 dnl Examples:
     62 dnl    GP_CHECK_LIBRARY([LIBEXIF], [libexif])dnl
     63 dnl    GP_CHECK_LIBRARY([LIBEXIF], [libexif-gtk], [>= 0.3.3])dnl
     64 dnl                                  note the space! ^
     65 dnl
     66 dnl Possible enhancements:
     67 dnl
     68 dnl   * Derive VAR_PREFIX directly from libname
     69 dnl     This will change the calling conventions, so be aware of that.
     70 dnl   * Give names of a header file and function name and to a test
     71 dnl     compilation.
     72 dnl
     73 AC_DEFUN([_GP_CHECK_LIBRARY_SOEXT],[dnl
     74 AC_MSG_CHECKING([for dynamic library extension])
     75 soext=""
     76 case "$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" ;;
     83 esac
     84 if test "x$soext" = "x"; then
     85 	soext=".so"
     86 	AC_MSG_RESULT([${soext}])
     87 	AC_MSG_WARN([
     88 Host system "${host}" not recognized, defaulting to "${soext}".
     89 ])
     90 else
     91 	AC_MSG_RESULT([${soext}])
     92 fi
     93 ])dnl
     94 dnl
     95 AC_DEFUN([_GP_CHECK_LIBRARY],[
     96 # ----------------------------------------------------------------------
     97 # [GP_CHECK_LIBRARY]([$1],[$2],[$3],
     98 #                    [$4],[$5],
     99 #                    [...],[...],[$8])
    100 m4_ifval([$9],[dnl
    101 # $9
    102 ])dnl
    103 # ----------------------------------------------------------------------
    104 dnl
    105 AC_REQUIRE([GP_CONFIG_MSG])dnl
    106 AC_REQUIRE([GP_PKG_CONFIG])dnl
    107 AC_REQUIRE([_GP_CHECK_LIBRARY_SOEXT])dnl
    108 dnl Use _CFLAGS and _LIBS given to configure.
    109 dnl This makes it possible to set these vars in a configure script
    110 dnl and AC_CONFIG_SUBDIRS this configure.
    111 AC_ARG_VAR([$1][_CFLAGS], [CFLAGS for compiling with ][$2])dnl
    112 AC_ARG_VAR([$1][_LIBS],   [LIBS to add for linking against ][$2])dnl
    113 dnl
    114 AC_MSG_CHECKING([for ][$2][ to use])
    115 userdef_[$1]=no
    116 have_[$1]=no
    117 if 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.
    144 No 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
    208 elif 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
    212 else
    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 ])
    221 fi
    222 dnl
    223 dnl ACTION-IF-FOUND
    224 dnl
    225 m4_ifval([$6],[dnl
    226 if test "x${[have_][$1]}" = "xyes"; then
    227 # ACTION-IF-FOUND
    228 $6
    229 fi
    230 ])dnl
    231 dnl
    232 dnl ACTION-IF-NOT-FOUND
    233 dnl
    234 m4_ifval([$7],[dnl
    235 if test "x${[have_][$1]}" = "xno"; then
    236 # ACTION-IF-NOT-FOUND
    237 $7
    238 fi
    239 ])dnl
    240 dnl
    241 dnl Run our own test compilation
    242 dnl
    243 m4_ifval([$4],[dnl
    244 if test "x${[have_][$1]}" = "xyes"; then
    245 dnl AC_MSG_CHECKING([whether ][$2][ test compile succeeds])
    246 dnl AC_MSG_RESULT([${[have_][$1]}])
    247 CPPFLAGS_save="$CPPFLAGS"
    248 CPPFLAGS="${[$1]_CFLAGS}"
    249 AC_CHECK_HEADER([$4],[have_][$1][=yes],[have_][$1][=no])
    250 CPPFLAGS="$CPPFLAGS_save"
    251 fi
    252 ])dnl
    253 dnl
    254 dnl Run our own test link
    255 dnl    Does not work for libraries which be built after configure time,
    256 dnl    so we deactivate it for them (userdef_).
    257 dnl
    258 m4_ifval([$5],[dnl
    259 if 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]}])
    266 fi
    267 ])dnl
    268 dnl
    269 dnl Abort configure script if mandatory, but not found
    270 dnl
    271 m4_if([$8],[mandatory],[
    272 if test "x${[have_][$1]}" = "xno"; then
    273 	AC_MSG_ERROR([
    274 PKG_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]))
    289 fi
    290 ])dnl
    291 dnl
    292 dnl Abort configure script if not found and not explicitly disabled
    293 dnl
    294 m4_if([$8],[disable-explicitly],[
    295 if test "x${[try_][$1]}" != "xno" && test "x${[have_][$1]}" = "xno"; then
    296         AC_MSG_ERROR([
    297 PKG_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]))
    314 fi
    315 ])dnl
    316 AM_CONDITIONAL([HAVE_][$1], [test "x$have_[$1]" = "xyes"])
    317 if 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]}])
    324 else
    325 	GP_CONFIG_MSG([$2],[no])dnl
    326 fi
    327 dnl AC_SUBST is done implicitly by AC_ARG_VAR above.
    328 dnl AC_SUBST([$1][_LIBS])
    329 dnl AC_SUBST([$1][_CFLAGS])
    330 ])dnl
    331 dnl
    332 dnl ####################################################################
    333 dnl
    334 AC_DEFUN([_GP_CHECK_LIBRARY_SYNTAX_ERROR],[dnl
    335 m4_errprint(__file__:__line__:[ Error:
    336 *** Calling $0 macro with old syntax
    337 *** Aborting.
    338 ])dnl
    339 m4_exit(1)dnl
    340 ])dnl
    341 dnl
    342 dnl ####################################################################
    343 dnl
    344 AC_DEFUN([GP_CHECK_LIBRARY],[dnl
    345 m4_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
    348 m4_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:
    359 Illegal argument 6 to $0: `$6'
    360 It must be one of "default-on", "default-off", "mandatory".
    361 ])m4_exit(1)])dnl
    362 ])dnl
    363 dnl
    364 m4_pattern_disallow([GP_CHECK_LIBRARY])
    365 m4_pattern_disallow([_GP_CHECK_LIBRARY])
    366 m4_pattern_disallow([_GP_CHECK_LIBRARY_SYNTAX_ERROR])
    367 m4_pattern_disallow([_GP_CHECK_LIBRARY_SOEXT])
    368 dnl
    369 dnl ####################################################################
    370 dnl
    371 dnl Please do not remove this:
    372 dnl filetype: 6e60b4f0-acb2-4cd5-8258-42014f92bd2c
    373 dnl I use this to find all the different instances of this file which 
    374 dnl are supposed to be synchronized.
    375 dnl
    376 dnl Local Variables:
    377 dnl mode: autoconf
    378 dnl End:
    379