MMAP support for rrdtool this is suposed to speed-up uptime 4 times.
[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 Inspiration from http://autoconf-archive.cryp.to
7
8 dnl tell automake the this script is for rrdtool
9 AC_INIT([rrdtool],[1.1.9901])
10 AC_CANONICAL_TARGET
11 AM_INIT_AUTOMAKE
12 AC_CONFIG_HEADERS([config.h])
13
14 dnl all our local stuff like install scripts and include files
15 dnl is in there
16
17
18 dnl determine the type of system we are running on
19
20
21 AC_SUBST(VERSION)
22
23 dnl where we install our stuff ...
24 AC_PREFIX_DEFAULT( /usr/local/rrdtool-$PACKAGE_VERSION )
25
26 dnl Minimum Autoconf version required.
27 AC_PREREQ(2.59)
28
29 dnl At the TOP of the HEADER
30
31 AH_TOP([
32
33 #ifndef CONFIG_H
34 #define CONFIG_H
35 /* IEEE can be prevented from raising signals with fpsetmask(0) */
36 #undef MUST_DISABLE_FPMASK
37
38 /* IEEE math only works if SIGFPE gets actively set to IGNORE */
39
40 #undef MUST_DISABLE_SIGFPE
41
42 /* realloc does not support NULL as argument */
43 #undef NO_NULL_REALLOC
44
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 Checks for libraries.
156 AC_CHECK_FUNC(acos, , AC_CHECK_LIB(m, acos))
157
158 dnl add pic flag in any case this makes sure all our code is relocatable
159 eval `./libtool --config | grep pic_flag`
160 CFLAGS="$CFLAGS $pic_flag"
161
162 dnl Checks for library functions.
163 AC_FUNC_STRFTIME
164 AC_FUNC_VPRINTF
165
166 AC_C_BIGENDIAN
167
168 dnl for each function found we get a definition in config.h 
169 dnl of the form HAVE_FUNCTION
170
171 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)
172
173 dnl Use mmap in rrd_update instead of seek+write
174 AC_ARG_ENABLE([mmap],
175 [  --disable-mmap          disable mmap in rrd_update, use seek+write instead],
176 [],
177 [enable_mmap=yes])
178
179 if test "x$enable_mmap" = xyes; then
180   AC_FUNC_MMAP
181 fi
182
183 dnl HP-UX 11.00 does not have finite but does have isfinite as a macro so we need
184 dnl actual code to check if this works
185 AC_CHECK_FUNCS(fpclassify, ,
186   [AC_MSG_CHECKING(for fpclassify with <math.h>)
187     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; fpclassify(f)]])],[AC_MSG_RESULT(yes)
188       AC_DEFINE(HAVE_FPCLASSIFY)],[AC_MSG_RESULT(no)])])
189 AC_CHECK_FUNCS(finite, ,
190   [AC_CHECK_FUNCS(isfinite, ,
191     [AC_MSG_CHECKING(for isfinite with <math.h>)
192     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; isfinite(f)]])],[AC_MSG_RESULT(yes)
193       AC_DEFINE(HAVE_ISFINITE)],[AC_MSG_RESULT(no)])])])
194 AC_CHECK_FUNCS(isinf, ,
195   [AC_MSG_CHECKING(for isinf with <math.h>)
196     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[float f = 0.0; isinf(f)]])],[AC_MSG_RESULT(yes)
197       AC_DEFINE(HAVE_ISINF)],[AC_MSG_RESULT(no)])])
198
199 AC_FULL_IEEE
200
201 dnl How the vertical axis label is printed
202 AC_ARG_VAR(RRDGRAPH_YLEGEND_ANGLE, 
203  [Vertical label angle: 90.0 (default) or 270.0])
204 AC_DEFINE_UNQUOTED(RRDGRAPH_YLEGEND_ANGLE,${RRDGRAPH_YLEGEND_ANGLE:-90.0},
205  [Vertical label angle: 90.0 (default) or 270.0])
206
207
208 AC_ARG_ENABLE(rrdcgi,[  --disable-rrdcgi        disable building of rrdcgi],
209 [],[enable_rrdcgi=yes])
210 AM_CONDITIONAL(BUILD_RRDCGI,[test $enable_rrdcgi != no])
211  
212 if test $enable_rrdcgi != no; then
213 EX_CHECK_ALL(cgi,        cgiInit,                   cgi.h,                  cgilib,      0.5,    http://www.infodrom.org/projects/cgilib)
214 fi
215 EX_CHECK_ALL(art_lgpl_2, art_vpath_add_point,       libart_lgpl/libart.h,   libart-2.0,  2.3.17, ftp://ftp.gnome.org/pub/GNOME/sources/libart_lgpl/2.3/)
216 EX_CHECK_ALL(z,          zlibVersion,               zlib.h,                 zlib,        1.2.1,  http://www.gzip.org/zlib/)
217 EX_CHECK_ALL(png,        png_access_version_number, png.h,                  libpng,      1.2.8,  http://prdownloads.sourceforge.net/libpng/)
218 EX_CHECK_ALL(freetype,   FT_Init_FreeType,          ft2build.h,              freetype2,   2.1.9,  http://prdownloads.sourceforge.net/freetype/)
219
220 if test "$EX_CHECK_ALL_ERR" = "YES"; then
221   AC_MSG_ERROR([Please fix the library issues listed above and try again.])
222 fi
223
224 AC_LANG_PUSH(C)
225 dnl solaris has some odd defines it needs in order to propperly compile ctime_r
226 AC_MSG_CHECKING([if ctime_r need special care to act posixly correct])
227 AC_LINK_IFELSE(
228     AC_LANG_PROGRAM(
229            [[#include <time.h>]],
230            [[ctime_r(NULL,NULL,0)]]
231                    ),
232     [ CPPFLAGS="$CPPFLAGS -D_POSIX_PTHREAD_SEMANTICS"
233       AC_LINK_IFELSE(
234           AC_LANG_PROGRAM(
235                 [[#include <time.h>]],
236                 [[ctime_r(NULL,NULL)]]
237                          ),
238           [AC_MSG_RESULT([yes, this seems to be solaris style])],
239           [AC_MSG_ERROR([Can't figure how to compile ctime_r])]
240       )
241     ],  
242     [ AC_LINK_IFELSE(
243           AC_LANG_PROGRAM(
244                 [[#include <time.h>]],
245                 [[ctime_r(NULL,NULL)]]
246                          ),
247           [AC_MSG_RESULT(yes)],
248           [AC_MSG_ERROR([Can't figure how to compile ctime_r])]
249       )
250     ]  
251 )
252 AC_LANG_POP(C)
253
254 dnl Check for pthreads
255 dnl http://autoconf-archive.cryp.to/acx_pthread.m4
256  
257 AC_SUBST(MULTITHREAD_CFLAGS)
258 AC_SUBST(MULTITHREAD_LDFLAGS)
259
260  
261 AC_ARG_ENABLE(pthread,[  --disable-pthread       disable multithread support],
262 [],[enable_pthread=yes])
263
264
265 if test $enable_pthread != no; then 
266  ACX_PTHREAD([
267     MULTITHREAD_CFLAGS=$PTHREAD_CFLAGS
268     MULTITHREAD_LDFLAGS=$PTHREAD_LIBS
269              ],
270              [])
271 fi
272
273 dnl since we use lots of *_r functions all over the code we better
274 dnl make sure they are known
275
276 if test  "x$x_rflag" != "xno"; then
277    CPPFLAGS="$CPPFLAGS $x_rflag"
278 fi
279
280  
281 AM_CONDITIONAL(BUILD_MULTITHREAD,[test $enable_pthread != no])
282   
283 dnl Check for Perl.
284 AC_PATH_PROG(PERL, perl, no)
285 if test "x$PERL" = "xno"; then
286         COMP_PERL=
287 else
288         COMP_PERL="perl_piped perl_shared"
289         AC_MSG_CHECKING(for the perl version you are running)
290         PERL_VERSION=`$PERL -MConfig -e 'print $Config{version}'`
291         AC_MSG_RESULT($PERL_VERSION)
292         AC_MSG_CHECKING(for the C compiler perl wants to use to build its modules)
293         perlcc=`$PERL -MConfig -e 'print $Config{cc}'`
294         AC_MSG_RESULT($perlcc)
295         if test ! -x $perlcc; then
296                AC_PATH_PROG(PERLCC, ${perlcc}, no)
297                if test -x $"x$PERLCC" = "xno"; then
298                   AC_MSG_WARN([
299 I would not find the Compiler ($perlcc) that was originally used to compile your
300 perl binary. You should either make sure that this compiler is available on your
301 system, or use a different perl setup that was compiled with $CC.
302
303 I will disable the compilation of the RRDs perl module.
304 ])
305                   COMP_PERL="perl_piped"
306                fi
307         fi
308 fi
309 AC_MSG_CHECKING(Perl Modules to build)
310 AC_MSG_RESULT(${COMP_PERL:-No Perl Modules will be built})
311
312 # Options to pass when configuring perl module
313 PERL_MAKE_OPTIONS="PREFIX=$prefix LIB=$prefix/lib/perl/$PERL_VERSION"
314
315 dnl pass additional perl options when generating Makefile from Makefile.PL
316 AC_ARG_ENABLE(perl-site-install,
317 [  --enable-perl-site-install   by default the rrdtool perl modules are installed
318                           together with rrdtool in $prefix/lib/perl. You have to
319                           put a 'use lib qw($prefix/lib/perl)' into your scripts
320                           when you want to use them. When you set this option
321                           the perl modules will get installed wherever
322                           your perl setup thinks it is best.],
323 [PERL_MAKE_OPTIONS=],[])
324
325 AC_ARG_WITH(perl-options,
326 [  --with-perl-options=[OPTIONS]  options to pass on command-line when
327                           generating Makefile from Makefile.PL. If you set this
328                           option, interesting things may happen unless you know
329                           what you are doing!],
330 [PERL_MAKE_OPTIONS=$withval])
331
332 AC_SUBST(PERL_MAKE_OPTIONS)
333 AC_SUBST(PERL)
334 AC_SUBST(COMP_PERL)
335 AC_SUBST(PERL_VERSION)
336
337
338 dnl Check for Tcl.
339 withval=""
340 AC_ARG_WITH(tcllib,[  --with-tcllib=DIR       location of the tclConfig.sh])
341 found=0
342 AC_MSG_CHECKING(for tclConfig.sh in $withval)
343 if test -f "$withval/tclConfig.sh" ; then
344         tcl_config=$withval/tclConfig.sh
345         found=1
346         AC_MSG_RESULT(yes)
347         break
348 else
349         AC_MSG_RESULT(no)
350 fi
351
352 if test $found -eq 0 ; then
353         AC_MSG_WARN([tclConfig.sh not found - Tcl interface won't be built])
354 else
355         . $tcl_config
356 fi
357
358
359 AM_CONDITIONAL(COMP_TCL, test x$found = x1 )
360
361 AC_SUBST(TCL_PREFIX)
362 AC_SUBST(TCL_SHLIB_CFLAGS)
363 AC_SUBST(TCL_SHLIB_LD)
364 AC_SUBST(TCL_SHLIB_SUFFIX)
365 AC_SUBST(TCL_PACKAGE_PATH)
366 AC_SUBST(TCL_LD_SEARCH_FLAGS)
367
368
369
370 dnl Check for nroff
371 AC_PATH_PROGS(NROFF, gnroff nroff)
372 AC_PATH_PROGS(TROFF, groff troff)
373
374 dnl Does the compiler like -Wall and -pedantic?
375 if test "x$GCC" = "xyes"; then
376   oCFLAGS=$CFLAGS
377   CFLAGS="$CFLAGS -Wall -pedantic -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline -W"
378   AC_CACHE_CHECK(if we can use GCC-specific compiler options, rd_cv_gcc_opt,
379                 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[return 0 ]])],[rd_cv_gcc_opt=yes],[rd_cv_gcc_opt=no ])
380                ]
381         )
382   if test $rd_cv_gcc_opt = no; then
383          CFLAGS=$oCFLAGS
384   fi
385 fi
386
387 dnl what does realloc do if it gets called with a NULL pointer
388
389 AC_CACHE_CHECK([if realloc can deal with NULL], rd_cv_null_realloc,
390 [AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdlib.h>
391               int main(void){
392               char *x = NULL;
393               x = realloc (x,10);
394               if (x==NULL) return 1;
395               return 0;
396              }]])],[rd_cv_null_realloc=yes],[rd_cv_null_realloc=nope],[:])])
397
398 if test x"$rd_cv_null_realloc" = xnope; then
399 AC_DEFINE(NO_NULL_REALLOC)
400 fi
401
402 AC_CONFIG_FILES([examples/shared-demo.pl                        \
403           examples/piped-demo.pl                        \
404           examples/stripes.pl                           \
405           examples/bigtops.pl                           \
406           examples/minmax.pl                            \
407           examples/cgi-demo.cgi                         \
408           examples/4charts.pl                           \
409           examples/Makefile                             \
410           doc/Makefile                                  \
411           src/Makefile                                  \
412           bindings/Makefile                             \
413           bindings/tcl/Makefile                         \
414           Makefile])
415 AC_CONFIG_COMMANDS([default],[[\
416           chmod +x examples/*.cgi examples/*.pl]],[[]])
417 AC_OUTPUT
418
419 AC_MSG_CHECKING(in)
420 AC_MSG_RESULT(and out again)
421
422 echo $ECHO_N "ordering CD from http://people.ee.ethz.ch/~oetiker/wish $ECHO_C" 1>&6
423 sleep 1
424 echo $ECHO_N ".$ECHO_C" 1>&6
425 sleep 1
426 echo $ECHO_N ".$ECHO_C" 1>&6
427 sleep 1
428 echo $ECHO_N ".$ECHO_C" 1>&6
429 sleep 1
430 echo $ECHO_N ".$ECHO_C" 1>&6
431 sleep 1
432 AC_MSG_RESULT([ just kidding ;-)])
433 echo
434 echo "----------------------------------------------------------------"
435 echo "Config is DONE!"
436 echo
437 echo "Type 'make' to compile the software and use 'make install' to "
438 echo "install everything to: $prefix."
439 echo
440 echo "If you want to install the perl"
441 echo "modules in site-perl, try 'make site-perl-install'."
442 echo 
443 echo "       ... that wishlist is NO JOKE. If you find RRDtool useful"
444 echo "make me happy. Go to http://people.ee.ethz.ch/~oetiker/wish and"
445 echo "place an order."
446 echo 
447 echo "                               -- Tobi Oetiker <tobi@oetiker.ch>"
448 echo "----------------------------------------------------------------"