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