c9dd1704c945d1777033147dc4f2a5ecced79194
[rrdtool.git] / configure.ac
1 dnl RRDtool AutoConf script ... 
2 dnl ---------------------------
3 dnl
4 dnl Created by Jeff Allen, Tobi Oetiker, Blair Zajac
5 dnl
6 dnl
7
8 dnl tell automake the this script is for rrdtool
9 AC_INIT([rrdtool],[1.1.0])
10 AM_INIT_AUTOMAKE
11 AC_CANONICAL_TARGET
12 AM_CONFIG_HEADER(config.h)
13 # AC_CONFIG_AUX_DIR(config)
14
15 dnl all our local stuff like install scripts and include files
16 dnl is in there
17
18
19 dnl determine the type of system we are running on
20
21
22 AC_SUBST(VERSION)
23
24 dnl where we install our stuff ...
25 AC_PREFIX_DEFAULT( /usr/local/rrdtool-1.1.0 )
26
27 dnl Minimum Autoconf version required.
28 AC_PREREQ(2.58)
29
30 dnl At the TOP of the HEADER
31
32 AH_TOP([
33
34 #ifndef CONFIG_H
35 #define CONFIG_H
36 /* IEEE can be prevented from raising signals with fpsetmask(0) */
37 #undef MUST_DISABLE_FPMASK
38
39 /* IEEE math only works if SIGFPE gets actively set to IGNORE */
40
41 #undef MUST_DISABLE_SIGFPE
42
43 /* realloc does not support NULL as argument */
44 #undef NO_NULL_REALLOC
45  ])
46
47 AH_BOTTOM([
48
49 /* define strrchr, strchr and memcpy, memmove in terms of bsd funcs
50    make sure you are NOT using bcopy, index or rindex in the code */
51       
52 #if STDC_HEADERS
53 # include <string.h>
54 #else
55 # ifndef HAVE_STRCHR
56 #  define strchr index
57 #  define strrchr rindex
58 # endif
59 char *strchr (), *strrchr ();
60 # ifndef HAVE_MEMMOVE
61 #  define memcpy(d, s, n) bcopy ((s), (d), (n))
62 #  define memmove(d, s, n) bcopy ((s), (d), (n))
63 # endif
64 #endif
65
66
67 #if NO_NULL_REALLOC
68 # define rrd_realloc(a,b) ( (a) == NULL ? malloc( (b) ) : realloc( (a) , (b) ))
69 #else
70 # define rrd_realloc(a,b) realloc((a), (b))
71 #endif      
72
73 #if HAVE_MATH_H
74 #  include <math.h>
75 #endif
76
77 #if HAVE_FLOAT_H
78 #  include <float.h>
79 #endif
80
81 #if HAVE_IEEEFP_H
82 #  include <ieeefp.h>
83 #endif
84
85 #if HAVE_FP_CLASS_H
86 #  include <fp_class.h>
87 #endif
88
89 /* for Solaris */
90 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASS))
91 #  define HAVE_ISINF 1
92 #  define isinf(a) (fpclass(a) == FP_NINF || fpclass(a) == FP_PINF)
93 #endif
94
95 /* for OSF1 Digital Unix */
96 #if (! defined(HAVE_ISINF) && defined(HAVE_FP_CLASS) && defined(HAVE_FP_CLASS_H))
97 #  define HAVE_ISINF 1
98 #  define isinf(a) (fp_class(a) == FP_NEG_INF || fp_class(a) == FP_POS_INF)
99 #endif
100
101 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_PLUS_INF) && defined(FP_MINUS_INF))
102 #  define HAVE_ISINF 1
103 #  define isinf(a) (fpclassify(a) == FP_MINUS_INF || fpclassify(a) == FP_PLUS_INF)
104 #endif
105
106 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_INFINITE))
107 #  define HAVE_ISINF 1
108 #  define isinf(a) (fpclassify(a) == FP_INFINITE)
109 #endif
110
111 /* for AIX */
112 #if (! defined(HAVE_ISINF) && defined(HAVE_CLASS))
113 #  define HAVE_ISINF 1
114 #  define isinf(a) (class(a) == FP_MINUS_INF || class(a) == FP_PLUS_INF)
115 #endif
116
117 #if (! defined (HAVE_FINITE) && defined (HAVE_ISFINITE))
118 #  define HAVE_FINITE 1
119 #  define finite(a) isfinite(a)
120 #endif
121
122 #if (! defined(HAVE_FINITE) && defined(HAVE_ISNAN) && defined(HAVE_ISINF))
123 #  define HAVE_FINITE 1
124 #  define finite(a) (! isnan(a) && ! isinf(a))
125 #endif
126
127 #ifndef HAVE_FINITE
128 #error "Can't compile without finite function"
129 #endif
130
131 #ifndef HAVE_ISINF
132 #error "Can't compile without isinf function"
133 #endif
134
135 #endif /* CONFIG_H */
136 ])
137
138
139
140 dnl Check for the compiler and static/shared library creation.
141 AC_PROG_CC
142 AC_PROG_CPP
143 AC_PROG_LIBTOOL
144
145 dnl Checks for header files.
146 AC_HEADER_STDC
147 AC_HEADER_DIRENT
148 AC_CHECK_HEADERS(sys/stat.h sys/types.h fcntl.h time.h locale.h fp_class.h malloc.h unistd.h ieeefp.h math.h sys/time.h sys/times.h sys/param.h sys/resource.h float.h)
149
150 dnl Checks for typedefs, structures, and compiler characteristics.
151 AC_C_CONST
152 AC_HEADER_TIME
153 AC_STRUCT_TM
154
155 dnl substitute them in all the files listed in AC_OUTPUT
156 AC_SUBST(PERLFLAGS)
157
158 dnl Checks for libraries.
159 AC_CHECK_FUNC(acos, , AC_CHECK_LIB(m, acos))
160
161 AC_DEFUN([EX_CHECK_ALL],
162 [ AC_CHECK_LIB($1,$2,
163   [ AC_CHECK_HEADER($3,[LIBS="-l$1 ${LIBS}"],[
164      [ $echo "#include <$3>" | $CC -E - > /dev/null ] 
165      AC_MSG_ERROR([Adjust CPPFLAGS so that the $4 header $3 AND its dependencies gets found])
166   ] ) ],
167   [ AC_MSG_ERROR([
168 ############################################################################
169 I could not find a working copy of $4. Check config.log for hints on why
170 this is the case. Maybe you need to set LDFLAGS appropriately so that the
171 linker can find lib$1. If you have not installed $4, you can get it
172 either from its original home on
173
174    $6
175
176 Or you can find an archive copy on
177
178    http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/pub/libs
179
180 The last tested version of $4 is $5.
181 ############################################################################
182 ])] )
183 ]
184 )
185  
186 EX_CHECK_ALL(cgi,        cgiInit,                   cgi.h,                  cgilib,      0.5,    http://www.infodrom.org/projects/cgilib)
187 EX_CHECK_ALL(art_lgpl_2, art_vpath_add_point,       libart_lgpl/libart.h,   libart_lgpl, 2.3.16, ftp://ftp.gnome.org/pub/GNOME/sources/libart_lgpl/2.3/)
188 EX_CHECK_ALL(z,          zlibVersion,               zlib.h,                 zlib,        1.2.1,  http://www.gzip.org/zlib/)
189 EX_CHECK_ALL(png,        png_access_version_number, png.h,                  libpng,      1.2.5,  http://prdownloads.sourceforge.net/libpng/)
190 EX_CHECK_ALL(freetype,   FT_Init_FreeType,          ft2build.h,             freetype,    2.1.5,  http://prdownloads.sourceforge.net/freetype/)
191
192 dnl How the vertical axis label is printed
193 AC_ARG_VAR(RRDGRAPH_YLEGEND_ANGLE, 
194  [Vertical label angle: 90.0 (default) or 270.0])
195 AC_DEFINE_UNQUOTED(RRDGRAPH_YLEGEND_ANGLE,${RRDGRAPH_YLEGEND_ANGLE:-90.0},
196  [Vertical label angle: 90.0 (default) or 270.0])
197
198
199 dnl Check for Perl.
200 AC_PATH_PROG(PERL, perl, no)
201 if test "x$PERL" = "xno"; then
202         COMP_PERL=
203 else
204         COMP_PERL="perl_piped perl_shared"
205         AC_MSG_CHECKING(for shared library extension)
206         SO_EXT=`$PERL -e 'use Config; if (defined $Config{so} and $Config{so} ne 'a') {print "$Config{so}\n"} else {print "so\n"};'`
207         AC_MSG_RESULT($SO_EXT)
208         AC_MSG_CHECKING(for the C compiler perl wants to use to build its modules)
209         PROBLEMCC=`$PERL -e 'use Config; ($cc = $Config{cc}) =~ s/\s.*//; exit 0 if -x $cc; map {if (-x "$_/$cc"){exit 0}} split /:/, $ENV{PATH};print $Config{cc}'`
210         if test x$PROBLEMCC != x; then
211                 AC_MSG_RESULT(no)
212                 echo Could not find the Compiler: '"'$PROBLEMCC'"'
213                 echo which has been used to build perl. You may have to compile
214                 echo your own copy of perl to make this work. Binary perls often
215                 echo exhibit this problem
216                 exit 1
217         else
218                 AC_MSG_RESULT(found)
219         fi
220 fi
221 AC_SUBST(COMP_PERL)
222 AC_SUBST(SO_EXT)
223
224 dnl Check for Tcl.
225 withval=""
226 AC_ARG_WITH(tcllib,[  --with-tcllib=DIR       location of the tclConfig.sh])
227 found=0
228 AC_MSG_CHECKING(for tclConfig.sh in $withval)
229 if test -f "$withval/tclConfig.sh" ; then
230         tcl_config=$withval/tclConfig.sh
231         found=1
232         AC_MSG_RESULT(yes)
233         break
234 else
235         AC_MSG_RESULT(no)
236 fi
237
238 if test $found -eq 0 ; then
239         AC_MSG_WARN([tclConfig.sh not found - Tcl interface won't be built])
240 else
241         . $tcl_config
242 fi
243
244 dnl Pass additional perl options when generating Makefile from Makefile.PL
245 # Options to pass when configuring perl module
246 AC_ARG_WITH(perl-options,
247 [  --with-perl-options=[OPTIONS]  options to pass on command-line when
248                           generating Makefile from Makefile.PL],
249 [PERL_MAKE_OPTIONS=$withval])
250 AC_SUBST(PERL_MAKE_OPTIONS)
251
252 AM_CONDITIONAL(COMP_TCL, test x$found = x1 )
253
254 AC_SUBST(TCL_PREFIX)
255 AC_SUBST(TCL_SHLIB_CFLAGS)
256 AC_SUBST(TCL_SHLIB_LD)
257 AC_SUBST(TCL_SHLIB_SUFFIX)
258 AC_SUBST(TCL_PACKAGE_PATH)
259 AC_SUBST(TCL_LD_SEARCH_FLAGS)
260
261
262
263 dnl Check for nroff
264 AC_PATH_PROGS(NROFF, gnroff nroff)
265 AC_PATH_PROGS(TROFF, groff troff)
266
267 dnl Does the compiler like -Wall and -pedantic?
268 if test "x$GCC" = "xyes"; then
269   oCFLAGS=$CFLAGS
270   CFLAGS="$CFLAGS -Wall -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -W"
271   AC_CACHE_CHECK(if we can use GCC-specific compiler options, rd_cv_gcc_opt,
272                 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[return 0 ]])],[rd_cv_gcc_opt=yes],[rd_cv_gcc_opt=no ])
273                ]
274         )
275   if test $rd_cv_gcc_opt = no; then
276          CFLAGS=$oCFLAGS
277   fi
278 fi
279
280 dnl add pic flag in any case this makes sure all our code is relocatable
281 CFLAGS="$CFLAGS "`grep pic_flag= libtool | head -1|sed -e 's/.*pic_flag=//' -e 's/"//g'`
282
283 ZLIB_CFLAGS=$CFLAGS
284 dnl it seems that hpux chockes on -fPIC for some reason
285 case $target_os in
286 *hpux*)
287         ZLIB_CFLAGS=`echo $CFLAGS|sed -e 's/-fPIC/-fpic/g'`
288 ;;
289 esac
290 AC_SUBST(ZLIB_CFLAGS)
291
292 dnl Checks for library functions.
293 AC_FUNC_STRFTIME
294 AC_FUNC_VPRINTF
295
296 dnl for each function found we get a definition in config.h 
297 dnl of the form HAVE_FUNCTION
298
299 AC_CHECK_FUNCS(tzset opendir readdir chdir chroot getuid setlocale strerror strerror_r snprintf vsnprintf fpclass class fp_class isnan memmove strchr mktime getrusage gettimeofday)
300
301 dnl HP-UX 11.00 does not have finite but does have isfinite as a macro
302 AC_CHECK_FUNCS(fpclassify, ,
303   [AC_MSG_CHECKING(for fpclassify with <math.h>)
304     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; fpclassify(f)]])],[AC_MSG_RESULT(yes)
305       AC_DEFINE(HAVE_FPCLASSIFY)],[AC_MSG_RESULT(no)])])
306 AC_CHECK_FUNCS(finite, ,
307   [AC_CHECK_FUNCS(isfinite, ,
308     [AC_MSG_CHECKING(for isfinite with <math.h>)
309     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; isfinite(f)]])],[AC_MSG_RESULT(yes)
310       AC_DEFINE(HAVE_ISFINITE)],[AC_MSG_RESULT(no)])])])
311 AC_CHECK_FUNCS(isinf, ,
312   [AC_MSG_CHECKING(for isinf with <math.h>)
313     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; isinf(f)]])],[AC_MSG_RESULT(yes)
314       AC_DEFINE(HAVE_ISINF)],[AC_MSG_RESULT(no)])])
315
316 dnl what does realloc do if it gets called with a NULL pointer
317
318 AC_CACHE_CHECK([if realloc can deal with NULL], rd_cv_null_realloc,
319 [AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
320               int main(void){
321               char *x = NULL;
322               x = realloc (x,10);
323               if (x==NULL) return 1;
324               return 0;
325              }]])],[rd_cv_null_realloc=yes],[rd_cv_null_realloc=nope],[:])])
326
327 if test x"$rd_cv_null_realloc" = xnope; then
328 AC_DEFINE(NO_NULL_REALLOC)
329 fi
330
331 dnl determine how to get IEEE math working
332 dnl AC_IEEE(MESSAGE, set rd_cv_ieee_[var] variable, INCLUDES,
333 dnl   FUNCTION-BODY, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])
334
335 AC_C_BIGENDIAN
336
337 AC_DEFUN([AC_IEEE], 
338 AC_MSG_CHECKING([if IEEE math works $1])
339 AC_CACHE_VAL([rd_cv_ieee_$2],
340 [AC_RUN_IFELSE([AC_LANG_SOURCE([[$3
341
342 #if HAVE_MATH_H
343 #  include <math.h>
344 #endif
345
346 #if HAVE_FLOAT_H
347 #  include <float.h>  
348 #endif
349
350 #if HAVE_IEEEFP_H
351 #  include <ieeefp.h>
352 #endif
353
354 #if HAVE_FP_CLASS_H
355 #  include <fp_class.h>
356 #endif
357
358 /* Solaris */
359 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASS))
360 #  define HAVE_ISINF 1
361 #  define isinf(a) (fpclass(a) == FP_NINF || fpclass(a) == FP_PINF)
362 #endif
363
364 /* Digital UNIX */
365 #if (! defined(HAVE_ISINF) && defined(HAVE_FP_CLASS) && defined(HAVE_FP_CLASS_H))
366 #  define HAVE_ISINF 1
367 #  define isinf(a) (fp_class(a) == FP_NEG_INF || fp_class(a) == FP_POS_INF)
368 #endif 
369
370 /* AIX */
371 #if (! defined(HAVE_ISINF) && defined(HAVE_CLASS))
372 #  define HAVE_ISINF 1
373 #  define isinf(a) (class(a) == FP_MINUS_INF || class(a) == FP_PLUS_INF)
374 #endif
375
376 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_PLUS_INF) && defined(FP_MINUS_INF))
377 #  define HAVE_ISINF 1
378 #  define isinf(a) (fpclassify(a) == FP_MINUS_INF || fpclassify(a) == FP_PLUS_INF)
379 #endif
380
381 #if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_INFINITE))
382 #  define HAVE_ISINF 1
383 #  define isinf(a) (fpclassify(a) == FP_INFINITE)
384 #endif
385
386 #include <stdio.h>
387 int main(void){
388     double nan,inf,c,zero;
389     $4;
390     /* some math to see if we get a floating point exception */
391     zero=sin(0.0); /* don't let the compiler optimize us away */
392     nan=0.0/zero; /* especially here */
393     inf=1.0/zero; /* and here. I want to know if it can do the magic */
394                   /* at run time without sig fpe */
395     c = inf + nan;
396     c = inf / nan;
397     if (! isnan(nan)) {printf ("not isnan(NaN) ... "); return 1;}
398     if (nan == nan) {printf ("nan == nan ... "); return 1;}
399     if (! isinf(inf)) {printf ("not isinf(oo) ... "); return 1;}
400     if (! isinf(-inf)) {printf ("not isinf(-oo) ... "); return 1;}
401     if (! inf > 0) {printf ("not inf > 0 ... "); return 1;}
402     if (! -inf < 0) {printf ("not -inf < 0 ... "); return 1;}
403     return 0;
404  }]])],[rd_cv_ieee_$2=yes],[rd_cv_ieee_$2=no],[:])])
405 dnl these we run regardles is cached or not
406 if test x${rd_cv_ieee_$2} = "xyes"; then
407  AC_MSG_RESULT(yes)
408  $5
409 else
410  AC_MSG_RESULT(no)
411  $6
412 fi
413
414 )
415
416 _cflags=${CFLAGS}
417 AC_IEEE([out of the box], works, , , ,
418   [CFLAGS="$_cflags -ieee"
419   AC_IEEE([with the -ieee switch], switch, , , ,
420     [CFLAGS="$_cflags -qfloat=nofold"
421     AC_IEEE([with the -qfloat=nofold switch], nofold, , , ,
422       [CFLAGS="$_cflags -w -qflttrap=enable:zerodivide"
423       AC_IEEE([with the -w -qflttrap=enable:zerodivide], flttrap, , , ,
424        [CFLAGS="$_cflags -mieee"
425        AC_IEEE([with the -mieee switch], mswitch, , , ,
426          [CFLAGS="$_cflags -q float=rndsngl"
427          AC_IEEE([with the -q float=rndsngl switch], qswitch, , , ,
428            [CFLAGS="$_cflags -OPT:IEEE_NaN_inf=ON"
429            AC_IEEE([with the -OPT:IEEE_NaN_inf=ON switch], ieeenaninfswitch, , , ,
430              [CFLAGS="$_cflags -OPT:IEEE_comparisons=ON"
431              AC_IEEE([with the -OPT:IEEE_comparisons=ON switch], ieeecmpswitch, , , ,
432                [CFLAGS=$_cflags
433                AC_IEEE([with fpsetmask(0)], mask,
434                  [#include <floatingpoint.h>], [fpsetmask(0)],
435                  [AC_DEFINE(MUST_DISABLE_FPMASK)
436                  PERLFLAGS="CCFLAGS=-DMUST_DISABLE_FPMASK"],
437                  [AC_IEEE([with signal(SIGFPE,SIG_IGN)], sigfpe,
438                    [#include <signal.h>], [signal(SIGFPE,SIG_IGN)],
439                    [AC_DEFINE(MUST_DISABLE_SIGFPE)
440                    PERLFLAGS="CCFLAGS=-DMUST_DISABLE_SIGFPE"],          
441                    AC_MSG_ERROR([
442 Your Compiler does not do propper IEEE math ... Please find out how to
443 make IEEE math work with your compiler and let me know (oetiker@ee.ethz.ch).
444 Check config.log to see what went wrong ...
445 ]))])])])])])])])])])
446
447
448 AC_CONFIG_FILES([examples/shared-demo.pl                        \
449           examples/piped-demo.pl                        \
450           examples/stripes.pl                           \
451           examples/bigtops.pl                           \
452           examples/minmax.pl                            \
453           examples/cgi-demo.cgi                         \
454           examples/Makefile                             \
455           doc/Makefile                                  \
456           src/Makefile                                  \
457           bindings/Makefile                             \
458           bindings/tcl/Makefile                         \
459           Makefile])
460 AC_CONFIG_COMMANDS([default],[[\
461           chmod +x examples/*.cgi examples/*.pl]],[[]])
462 AC_OUTPUT
463
464 AC_MSG_CHECKING(in)
465 AC_MSG_RESULT(and out again)
466
467 echo $ECHO_N "ordering CD from http://people.ee.ethz.ch/~oetiker/wish $ECHO_C" 1>&6
468 sleep 1
469 echo $ECHO_N ".$ECHO_C" 1>&6
470 sleep 1
471 echo $ECHO_N ".$ECHO_C" 1>&6
472 sleep 1
473 echo $ECHO_N ".$ECHO_C" 1>&6
474 sleep 1
475 echo $ECHO_N ".$ECHO_C" 1>&6
476 sleep 1
477 AC_MSG_RESULT([ just kidding ;-)])
478 echo
479 echo "----------------------------------------------------------------"
480 echo "Config is DONE!"
481 echo
482 echo "Type 'make' to compile the software and use 'make install' to "
483 echo "install everything to: $prefix."
484 echo
485 echo "If you want to install the perl"
486 echo "modules in site-perl, try 'make site-perl-install'."
487 echo 
488 echo "       ... that wishlist is NO JOKE. If you find RRDtool useful"
489 echo "make me happy. Go to http://people.ee.ethz.ch/~oetiker/wish and"
490 echo "place an order."
491 echo 
492 echo "                               -- Tobi Oetiker <tobi@oetiker.ch>"
493 echo "----------------------------------------------------------------"