Typo.
[adesklets.git] / configure.ac
blob177ea352f46aef7fb23bc46230da0fe70e0d836d
1 dnl Initialize autoconf and automake
2 AC_INIT
3 AC_CONFIG_SRCDIR(src/main.c)
4 AC_PREREQ(2.52)
5 AM_INIT_AUTOMAKE(adesklets,0.4.10)
7 dnl Language selection
8 AC_LANG(C)
10 dnl Locate required external software
11 AC_PROG_CPP
12 if test "x$CPP" != 'x'; then
14 AC_SUBST(CPP)
16 AC_PROG_CC
17 AM_PROG_LEX
18 if test "x$LEX" != 'xflex'; then
19 AC_MSG_WARN([
20 -----------------------------------------------------
21 `flex' was not found on your system. If you encounter
22 problems recompiling a `l' file, please try `flex' 
23 first. You can get it from any GNU archive site. 
24 You will not need `flex' as long as you do not 
25 modify `l' files.
26 ----------------------------------------------------])
28 AC_PROG_YACC
29 if test "x$YACC" != "xbison -y"; then
30 AC_MSG_WARN([
31 -----------------------------------------------------
32 Nor `byacc' or `yacc' parsers had been used
33 for developing adesklets. If you encounter problems
34 recompiling a `y' file, please try `bison' instead. 
35 You can get it from any GNU archive site. You will 
36 not need `bison' as long as you do not modify 
37 `y' files.
38 -----------------------------------------------------])
40 AC_PROG_INSTALL
42 dnl Check for python support
43 withval=
44 AC_ARG_WITH(python-support,
45 [  --without-python-support   
46                           do not install adesklets python package
47                           Do not set this option unless you have
48                           good reasons])
49 : ${withval:=yes}
50 if test x$withval = "xyes"; then
51 withval=
52 AC_ARG_WITH(python-force-detection,
53 [  --with-python-force-detection
54                           bypass all the python version check mechanism. 
55                           When using this, make sure you have a version
56                           greater or egal to python 2.3 installed 
57                           as 'python' in your path [default=no]])
58 : ${withval:=no}
59 if test x$withval = "xno"; then
60 AM_PATH_PYTHON([2.3])
61 else
62 AM_PATH_PYTHON()
64 AC_PYTHON_DEVEL
65 withval=
66 AC_ARG_WITH(python-install-submission-scripts,
67 [  --with-python-install-submission-scripts
68                           install in the path the submission-related scripts
69                           from submit/ in the $PREFIX/bin program path.
70                           Useful for desklets author [default=no]])
71 : ${withval:=no}
72 if test x$withval = "xyes"; then
73 AM_CONDITIONAL(PYTHON_INSTALL_SUBMISSION_SCRIPTS, true)
74 else
75 AM_CONDITIONAL(PYTHON_INSTALL_SUBMISSION_SCRIPTS, false)
77 AC_CHECK_FUNCS(sigprocmask,
78 [HAVE_SIGPROCMASK="#define HAVE_SIGPROCMASK 1", SIGPROC=yes],
79 [HAVE_SIGPROCMASK="#undef HAVE_SIGPROCMASK"])
80 else
81 HAVE_SIGPROCMASK="#undef HAVE_SIGPROCMASK"
83 AC_SUBST(HAVE_SIGPROCMASK)
84 AM_CONDITIONAL(PYTHON_SUPPORT, test "x$PYTHON" != "x")
85 AM_CONDITIONAL(PYTHON_INSTALL_SUBMISSION_SCRIPTS, true)
87 dnl help2man presence
88 AC_PATH_PROG(HELP2MAN, help2man)
89 AM_CONDITIONAL(HELP2MAN_SUPPORT, test "x$HELP2MAN" != "x")
91 dnl htmltidy presence
92 AC_PATH_PROG(TIDY,tidy)
94 dnl doxygen presence
95 AC_PATH_PROG(DOXYGEN,doxygen)
96 AM_CONDITIONAL(DOXYGEN_SUPPORT, test "x$DOXYGEN" != "x")
98 dnl makeinfo support:
99 dnl Also test the presence of the full documentation package
100 AM_CONDITIONAL(MAKEINFO_SUPPORT, 
101 test "x$MAKEINFO:" != "x" && test -f doc/Makefile.am)
103 dnl Try to enforce ISO C (iso9899 1999)
104 dnl This will more likely work
105 dnl only with gcc. In fact,
106 dnl expect for variadic macros, this program
107 dnl should be ansi C (ISO C90).
108 TMP_CFLAGS="$CFLAGS"
109 CFLAGS="$CFLAGS -std=c99 -pedantic -Wall"
110 AC_MSG_CHECKING([for ISO C99 warnings generation])
111 AC_TRY_COMPILE(
113 int 
114 main(void) 
116    return 0L;
118 AC_MSG_RESULT([yes]),
119 AC_MSG_RESULT([no])
120 CFLAGS="$TMP_CFLAGS"
123 dnl Define source to be BSD compliant (ISO C, POSIX, and 4.3BSD)
124 AC_DEFINE(_BSD_SOURCE,1,[Source is BSD compliant (ISO C, POSIX and 4.3BSD)])
125 if test "x`uname`" = xNetBSD; then
126 dnl NetBSD (at least version 1.6.1) is following the standard less closely than 
127 dnl the other... Hence, we declare the source specifically as _POSIX_SOURCE 
128 dnl instead of the newer _POSIX_C_SOURCE 199309
129 AC_DEFINE(_POSIX_SOURCE,1,[Source is POSIX 1 compliant (IEEE Std 1003.1)])
130 else
131 dnl For some unspecified reason, it as been reported than FreeBSD [5|6|7].x 
132 dnl doesn't like those POSIX keywords either
133 UNAME_REDUX=`uname -r -s | sed 's/\..*//' 2> /dev/null`
134 if test "$UNAME_REDUX" != 'FreeBSD 5' && \
135    test "$UNAME_REDUX" != 'FreeBSD 6' && \
136    test "$UNAME_REDUX" != 'FreeBSD 7'
137 then
138 AC_DEFINE(_POSIX_C_SOURCE,199309,[Source is POSIX 4 compliant (IEEE Std 1003.1b)])
142 dnl Check for system header files
143 AC_HEADER_STDC
144 AC_CHECK_HEADERS(stdio.h stdarg.h errno.h fcntl.h signal.h time.h math.h sys/time.h sys/types.h sys/stat.h grp.h pwd.h libgen.h dirent.h iconv.h)
146 dnl Enable debugging
147 dnl This will filter out optimisation switch (-O[s0-9]) 
148 dnl for gcc compiler
149 AC_ARG_ENABLE(
150   debug, [  --enable-debug        enable debugging symbols and supplementary 
151                           messages generation in final binary])
153 : ${enableval="no"}
154 AC_MSG_CHECKING([for debugging symbols generation])
155 if test x$enableval = "xyes"; then
156    AC_MSG_RESULT([yes])
157    AC_DEFINE(DEBUG, 1, [Debug mode is on if defined.])
158    CFLAGS="$CFLAGS -g"
159    DEBUG=yes
160 else
161    AC_MSG_RESULT([no])
162    CFLAGS=`echo "$CFLAGS" | sed 's/^-g$//; s/^-g@<:@@<:@:space:@:>@@:>@\+// ; s/@<:@@<:@:space:@:>@@:>@\+-g$//; s/@<:@@<:@:space:@:>@@:>@\+-g@<:@@<:@:space:@:>@@:>@\+/ /'`
165 dnl SIGKILL timeout setting
166 enableval=
167 AC_MSG_CHECKING([for sigkill timeout])
168 AC_ARG_ENABLE(sigkill-timeout,
169 [  --enable-sigkill-timeout=SEC
170                           timeout (in seconds) before sending `kill'
171                           signal to parent process in case of restart 
172                           if `term' has no effect [default=5]])
173 : ${enableval:=5}
174 test $enableval -gt 0 2> /dev/null || {
175 AC_MSG_RESULT([no])
176 AC_MSG_ERROR([Given sigkill timeout was not understood])
178 AC_MSG_RESULT([yes])
179 AC_DEFINE_UNQUOTED(SIGKILL_TIMEOUT,$enableval,
180 [Delay between SIGTERM ans SIGKILL to parent process in case of restart.])
182 dnl X polling frequency setting
183 enableval=
184 period=
185 AC_MSG_CHECKING([for polling frequency])
186 AC_ARG_ENABLE(x-polling-frequency,
187 [  --enable-x-polling-frequency=FREQ
188                           frequency (in hertz) for polling the X server
189                           for events. Lower values leads to less responsive,
190                           but less CPU hungry desklets [default=50]])
191 : ${enableval:=50}
192 test $enableval -gt 0 2> /dev/null || {
193 AC_MSG_RESULT([no])
194 AC_MSG_ERROR([Positive, integer value is required as x-polling-frequency])
197 AC_CHECK_PROG(EXISTS,bc,yes,no)
198 if test $enableval -ne 50; then
199 if test x$EXISTS = "xyes"; then
200    period=`echo "1000000 / $enableval" | bc`
201 else
202    AC_MSG_WARN([Could not find the `bc' calculator to perform arithmetic 
203 computation of X server polling period value. Default 50 Hz is assumed.])
206 : ${period:=20000}
207 AC_DEFINE_UNQUOTED(X_POLLING_PERIOD,$period,
208 [Polling period (in 10e-6 seconds) of stdin between two cycles of events loop.])
210 dnl Lock files directory setting
211 enableval=
212 AC_MSG_CHECKING([for lock files directory setting])
213 AC_ARG_ENABLE(lockfiles-dir,
214 [  --enable-lockfiles-dir=DIR
215                           directory to put lock files in [default=/tmp]])
216 : ${enableval:=/tmp}
217 test -d $enableval || {
218 AC_MSG_RESULT([no])
219 AC_MSG_ERROR([Given lock files directory does not exist on your system])
221 AC_MSG_RESULT([yes])
222 AC_DEFINE_UNQUOTED(LOCKFILES_DIR,"$enableval",
223 [Directory to put lock files in.])
224 LOCKFILES_DIR=$enableval
225 AC_SUBST(LOCKFILES_DIR)
227 dnl Control modifier on context menu
228 enableval=
229 AC_MSG_CHECKING([for control modifier on context menu])
230 AC_ARG_ENABLE(control-on-context-menu,
231 [  --enable-control-on-context-menu
232                           force CTRL to be pressed to fire context menu
233                           [default=no]])
234 : ${enableval:=no}
235 if test x$enableval != "xno" ; then
236 AC_MSG_RESULT([yes])
237 AC_DEFINE(CONTROL_ON_CONTEXT_MENU, 1,
238 [Force CTRL to be pressed to fire context menu])
239 else
240 AC_MSG_RESULT([no])
243 dnl Legacy Window Manager detection code
244 enableval=
245 AC_MSG_CHECKING([for legacy fake root window detection code])
246 AC_ARG_ENABLE(legacy-fake-root-window-detection,
247 [  --enable-legacy-fake-root-window-detection
248                           Use the old code to detect fake root windows
249                           [default=no]])
250 : ${enableval:=no}
251 if test x$enableval != "xno" ; then
252 AC_MSG_RESULT([yes])
253 AC_DEFINE(WM_DETECTION_OLD_STYLE, 1,
254 [Use former fake root window detection code])
255 else
256 AC_MSG_RESULT([no])
259 dnl Collect various system informations strings,
260 dnl for embedding into final executable
261 EXISTS=
262 WELCOME1="\"$PACKAGE $VERSION"
263 AC_CHECK_PROG(EXISTS,date,yes)
264 if test x$EXISTS = "xyes"; then
265    WELCOME1="$WELCOME1 ("`date | sed 's/@<:@@<:@:space:@:>@@:>@\+/ /g'`")"
266 else
267    WELCOME1="$WELCOME1 (unknown time)"
269 EXISTS=
270 AC_CHECK_PROG(EXISTS,uname,yes)
271 if test x$EXISTS = "xyes"; then
272    if uname -rs &> /dev/null; then
273       WELCOME1="$WELCOME1, on "`uname -rs`"\""
274    else
275       WELCOME1="$WELCOME1, on an unknown OS\""
276    fi
277 else
278    WELCOME1="$WELCOME1, on an unknown OS\""
280 AC_DEFINE_UNQUOTED(WELCOME_LINE_1, $WELCOME1, [Welcome message, first line.])
281 dnl Note: @<:@ and @:>@ are respective quadrigraphs for `[' and `]'
282 ${CC} --version &> /dev/null && \
283       WELCOME2="\"${CC} "`${CC} --version | sed -n '1 s/^@<:@^0-9@:>@*//p'`"\""
284 : ${WELCOME2:=\"${CC} unknown version\"}
285 AC_DEFINE_UNQUOTED(WELCOME_LINE_2, $WELCOME2, [Welcome message, second line.])
287 dnl Variables save: all changes to CFLAGS, LIBS and LDFLAGS beyond
288 dnl this point will be wiped
289 TMP_CFLAGS="$CFLAGS"
290 TMP_LIBS="$LIBS"
291 TMP_LDFLAGS="$LDFLAGS"
293 dnl Check for readline
294 AC_CHECK_LIB(ncurses, tputs, HaveLibTermcap=yes; LibTermcap=ncurses,
295    AC_CHECK_LIB(termcap, tputs, HaveLibTermcap=yes; LibTermcap=termcap,
296       AC_CHECK_LIB(curses, tputs, HaveLibTermcap=yes; LibTermcap=curses,
297                    HaveLibTermcap=no)))
298 if test $HaveLibTermcap = "yes" ; then
299    LIBS="$LIBS -l$LibTermcap"
300 else
301    AC_MSG_ERROR([Could not find terminal management library for readline
302 (either ncurses, termcap or curses).])
304 AC_CHECK_LIB(readline,readline,
305   READLINE_LIBS="-l$LibTermcap -lreadline",
306   AC_MSG_ERROR([Could not find the readline library]),
307   $LFLAGS)
308 LIBS="$TMP_LIBS"
310 dnl Check for libhistory support
311 withval=
312 AC_ARG_WITH(history,
313 [  --without-history       remove history support in interactive use
314                           of the interpreter])
315 : ${withval:=yes}
316 if test x$withval = "xyes"; then
317 AC_CHECK_LIB(history,add_history,
318         READLINE_LIBS="$READLINE_LIBS -lhistory";
319         AC_DEFINE(HAVE_READLINE_HISTORY_H,1,
320         [Define to 1 if you have the <readline/history.h> header file.])
321         HaveLibHistory=yes
322         AC_CHECK_LIB(history,free_history_entry,
323         AC_DEFINE(HAVE_FREE_HISTORY_ENTRY,1,
324         [Define to 1 if you have the `free_history_entry' function.])),
325         HaveLibHistory=no,
326         $LFLAGS)
327 if test $HaveLibHistory = "no"; then
328 AC_MSG_WARN([Could not find GNU history library in the system])
330 AC_MSG_CHECKING([for history max command lenght])
331 enableval=
332 AC_ARG_ENABLE(history-max-command-lenght,
333 [  --enable-history-max-command-lenght=LEN
334                           maximum string lenght (in characters) that a single
335                           command can have and still be kept in history 
336                           (a lenght of zero meaning no limits) [default=256]])
337 : ${enableval:=256}
339 if test $enableval -ge 0 ; then
340 AC_MSG_RESULT([yes])
341 AC_DEFINE_UNQUOTED(HISTORY_MAX_COMMAND_LENGHT,$enableval,
342 [maximum history string lenght.])
343 else
344 AC_MSG_RESULT([no])
345 AC_MSG_ERROR([history max command lenght must be positive or null])
349 AC_SUBST(READLINE_LIBS) 
351 dnl Check for 8 bit characters support forcing
352 enableval=
353 AC_ARG_ENABLE(force-extended-characters-input,
354 [  --enable-force-extended-characters-input
355                           force input and ouput of unescaped 
356                           height bits characters through GNU readline, 
357                           regardless of the inputrc settings [default=no]])
358 : ${enableval:=no}
359 if ! test x$enableval = "xno" ; then
360 AC_DEFINE(FORCE_EXTENDED_CHARACTERS_INPUT,1,
361 [force 8 bit characters support in GNU readline])
364 dnl Check for fontconfig
365 withval=
366 AC_ARG_WITH(fontconfig,
367 [  --without-fontconfig    remove fontconfig support enabling automatic 
368                           detection of all truetype fonts already available
369                           on the machine])
370 : ${withval:=yes}
371 if test x$withval = "xyes"; then
372 AC_PATH_PROG(PKG_CONFIG, pkg-config)
373 if ! test x$PKG_CONFIG = "x" ; then
374    if $PKG_CONFIG --exists fontconfig 2> /dev/null; then
375       FONTCONFIG_LIBS=`pkg-config --libs fontconfig`
376       FONTCONFIG_CFLAGS=`pkg-config --cflags fontconfig`
377    fi
379 if test x$FONTCONFIG_LIBS = "x"; then
380    FONTCONFIG_LIBS=-lfontconfig
382 LIBS="$LIBS $FONTCONFIG_LIBS"
383 CFLAGS="$CFLAGS $FONTCONFIG_CFLAGS"
384 AC_MSG_CHECKING([for fontconfig])
385 AC_TRY_LINK(
386 #include <fontconfig/fontconfig.h>
387 , FcInit(),
388 AC_MSG_RESULT([yes])
389 AC_DEFINE(HAVE_FONTCONFIG_FONTCONFIG_H,1,[Define to 1 if you have the <fontconfig/fontconfig.h> header file.]),
390 AC_MSG_RESULT([no])
391 FONTCONFIG_LIBS=
392 FONTCONFIG_CFLAGS=
393 AC_MSG_WARN([
394 -----------------------------------------------------
395 `fontconfig' was not found on your system. 
396 Although `adesklets' will work anyway system-wide 
397 automatic font detection will not occur: 
398 it is therefore quite possible that only the 
399 default font provided with the package will display.
400 -----------------------------------------------------]))
401 AC_SUBST(FONTCONFIG_LIBS)
402 AC_SUBST(FONTCONFIG_CFLAGS)
403 LIBS="$TMP_LIBS"
404 CFLAGS="$TMP_CFLAGS"
407 dnl Check for fork() system call
408 AC_CHECK_FUNCS(fork,,
409 AC_MSG_ERROR([Could not find the fork() system call]))
411 dnl Check for X headers and libraries
412 AC_PATH_X
413 AC_PATH_XTRA
415 if test x$no_x != "xyes"; then
417 test x$x_includes = "x" && x_includes="/usr/include"
418 test x$x_libraries = "x" && x_libraries="/usr/lib"
420 X_LIBS="$X_LIBS $X_EXTRA_LIBS"
421 LIBS="$LIBS $X_LIBS"
422 CFLAGS="$CFLAGS $X_CFLAGS"
423 LDFLAGS="$LDFLAGS $LIBS $X_PRE_LIBS"
424 dnl Check for required functions in -lX11
425 AC_CHECK_LIB(X11, XOpenDisplay,
426   X_LIBS="$X_LIBS -lX11"
427   LIBS="$LIBS -lX11",
428   AC_MSG_ERROR([Could not find XOpenDisplay in -lX11.])
430 AC_DEFINE(X_DISPLAY_SUPPORT,1,[Define to 1 if the X Window System is supported, 0 otherwise.])
431 else
432 AC_DEFINE(X_DISPLAY_SUPPORT,0,[Define to 1 if the X Window System is supported, 0 otherwise.])
433    X_CFLAGS=
434    X_LIBS=
435    X_PRE_LIBS=
437 AC_SUBST(X_CFLAGS)
438 AC_SUBST(X_LIBS)
439 AC_SUBST(X_PRE_LIBS)
441 dnl Imlib2 detection
442 withval=
443 AC_ARG_WITH(imlib2,
444         [  --with-imlib2=DIR       use imlib2 in <DIR>],
445         [CFLAGS="$CFLAGS -I$withval/include"
446         LIBS="-L$withval/lib $LIBS"])
448 AC_PATH_GENERIC_MODIFIED(imlib2, 1.1.2, 
449 [ AC_SUBST(IMLIB2_LIBS)
450   AC_SUBST(IMLIB2_CFLAGS) ],
451   AC_MSG_ERROR([Cannot find imlib2: Is imlib2-config in the path?]),
452   1.2.0,,
453   AC_MSG_WARN([
454 -----------------------------------------------------
455 $PACKAGE should work with your version of imlib2...
456 But for better results you are _warmly_ encouraged 
457 to try out version 1.2.0 or above;
458 known bugs are still lurking in dark corners 
459 with what you have installed: beware strange problems 
460 with dynamic image filters for instance!  
461 -----------------------------------------------------]))
462 LIBS="$LIBS $IMLIB2_LIBS"
463 CFLAGS="$CFLAGS $IMLIB2_CFLAGS"
465 AC_MSG_CHECKING([for imlib2 program linking])
466 AC_TRY_LINK(
467 #ifndef X_DISPLAY_MISSING
468         #include <X11/Xlib.h>
469         #include <X11/Xutil.h>
470         #include <X11/Xos.h>
471         #include <X11/Xatom.h>
472 #endif  
473         #include <Imlib2.h>
474 ,       Imlib_Image image;
475         image = imlib_load_image("toto.png");
476 #ifndef X_DISPLAY_MISSING
477         imlib_context_set_display(NULL);
478 #endif
480         AC_MSG_RESULT([yes]),
481         AC_MSG_RESULT([no])
482         AC_MSG_ERROR([Cannot link Imlib2 program. 
483 If you specified you did not want X support this can be caused 
484 by your Imlib2 installment being configured so it needs it
485 or conversely. In that case reinstall Imlib2 with proper 
486 --enable-x11-support parameter (as from enlightement CVS) 
487 before retrying to configure this package.]))
489 dnl Test for uint typedef
490 AC_MSG_CHECKING([for uint typedef in standard library])
491 AC_TRY_COMPILE(
492 #ifdef HAVE_SYS_TYPES_H
493         #include <sys/types.h>
494 #endif
495 #ifdef HAVE_UNISTD_H
496         #include <unistd.h>
497 #endif
498 ,       uint i,
499         AC_MSG_RESULT([yes]),
500         AC_MSG_RESULT([no])
501         AC_DEFINE(UINT_NOT_DEFINED,1,
502                   [Define to 1 if compability type uint is not detected.])      
505 dnl Important variables reset
506 CFLAGS="$TMP_CFLAGS"
507 LIBS="$TMP_LIBS"
508 LDFLAGS="$TMP_LDFLAGS"
510 dnl PKGDATADIR definition
511 dnl PKGDATADIR is only well constructed in make context,
512 dnl so let's put this AFTER all tests.
513 CFLAGS="$CFLAGS"' -DPKGDATADIR=\"$(pkgdatadir)\"'
515 dnl Output files
516 AM_CONFIG_HEADER(src/config.h)
517 AC_OUTPUT(Makefile
518 src/Makefile
519 data/Makefile
520 utils/Makefile
521 doc/Makefile
522 doc/adesklets_checkin.1
523 doc/adesklets_submit.1
524 doc/htmldoc.sh
525 doc/imlib2/Makefile
526 scripting/Makefile
527 scripting/protoize.sh
528 scripting/python/Makefile
529 scripting/python/config.h
530 scripting/python/setup.py
531 utils/adesklets_frontend.sh
534 dnl Change script(s) permissions
535 chmod +x scripting/protoize.sh doc/htmldoc.sh utils/adesklets_frontend.sh
537 dnl Final warning, if needed
538 if test x$DEBUG = "xyes"; then
539 AC_MSG_WARN([
540 -----------------------------------------------------
541 you choosed to make a `debug' compilation: this will
542 generate a significantly bigger executable
543 that produces on stderr (by default) a lot of outputs 
544 unwanted during normal use; set up the ADESKLETS_LOG 
545 environment variable to a filename the interpreter 
546 can safely suffix with a pid related extension
547 than truncate to collect all debug outputs 
548 there instead. Be also aware that all optimisation 
549 settings (-O flags in CFLAGS) are discarded when 
550 enabling this.
551 -----------------------------------------------------])
553 if test x$no_x = "xyes"; then
554 AC_MSG_WARN([
555 -----------------------------------------------------
556 you choosed to perform an `X Window less' build - 
557 which means you will eventually end up with 
558 a strictly command line program free of all
559 dependencies on xlib. If it is not what you intended 
560 please reconfigure. For this to work you do need first
561 to configure your Imlib2 incantation for not using
562 X Window itself.
563 -----------------------------------------------------
567 if test x$PYTHON != "x" ; then
568 if test x$SIGPROC != "xyes" ; then
569 AC_MSG_WARN([
570 -----------------------------------------------------
571 your system does not seem to support reliable POSIX
572 signal calls such as `sigprocmask', `sigpending' or
573 `sigsuspend'. Although this does not affect $PACKAGE
574 directly, it seriously impedes python ability
575 to handle things well through its package. 
576 To our knowledge, no modern UNIX platforms lack 
577 those system calls...
578 -----------------------------------------------------