From: oetiker Date: Wed, 27 May 2009 16:19:46 +0000 (+0000) Subject: switch from intltoolize to autopoint ... for a more happy gettext experiance X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=45996501402030f9784260bd9eea6de0492ed116;p=rrdtool.git switch from intltoolize to autopoint ... for a more happy gettext experiance git-svn-id: svn://svn.oetiker.ch/rrdtool/branches/1.3/program@1827 a5681a0c-68f1-0310-ab6d-d61299d08faa --- diff --git a/MakeMakefile b/MakeMakefile index 4623a72..03a5f34 100755 --- a/MakeMakefile +++ b/MakeMakefile @@ -3,9 +3,8 @@ # Run this script after the first cvs checkout to build # makefiles and friends -PATH="/usr/pack/automake-1.9.6-rp/bin:/usr/pack/autoconf-2.61-rp/bin:/usr/pack/libtool-1.5.22-rp/amd64-debian-linux3.1/bin:$PATH" -#export PATH - +PATH="/usr/pack/automake-1.11-to/amd64-linux-debian3.1/:/usr/pack/automake-1.11-to/amd64-linux-ubuntu8.04/bin:$PATH" +export PATH vcheck (){ perl <= $AUTOMAKE_VER" ERROR=1 else - automake=automake-1.9 - aclocal="aclocal-1.9" - for d in /usr/pack/automake-1.9.5-to/share/aclocal-1.9 /usr/share/aclocal-1.9 /usr/share/aclocal /usr/pack/rrdtool-1.3svn-to/share/aclocal /usr/pack/intltool-0.37.0-to/share/aclocal ; do - [ -d $d ] && aclocal="$aclocal -I $d" - done + AUTOMAKE="automake-1.11" + ACLOCAL="aclocal-1.11" + export AUTOMAKE ACLOCAL fi -else - automake="automake" - aclocal="aclocal" -# aclocal="aclocal -I /usr/pack/libtool-1.5.14-to/share/aclocal" fi + if vcheck $AUTOCONF_VER "autoconf --version" then echo "get a copy of GNU autoconf >= $autoconf_ver" ERROR=1 fi -if vcheck $INTLTOOL_VER "intltoolize --version" -then - echo "get a copy of GNU intltoolize >= $INTLTOOL_VER" - ERROR=1 -fi - if [ $ERROR -ne 0 ] then exit 1 fi -# remove the bits we are going to recreate - -echo Removing old Makefiles -touch Makefile -find . -name "Makefile" -or -name "Makefile.in" -print0 | xargs -0 rm -echo Cleaning out other leftovers -for x in configure install-sh intltool-merge.in rrd_config.h.in \ - missing intltool-update po/Makefile.in.in config.sub \ - intltool-extract intltool-extract.in config.guess \ - depcomp intltool-update.in autom4te.cache \ - intltool-merge compile; do - [ ! -L $x -a -d $x ] && rm -r "$x" - [ ! -L $x -a -f $x ] && rm "$x" -done -set -x -intltoolize --automake -c -f -$aclocal -libtoolize --copy --force -autoheader --force -$aclocal -$automake --foreign --add-missing --force-missing --copy -autoconf --force +./autogen.sh # vim: set syntax=sh : diff --git a/Makefile.am b/Makefile.am index b703754..bda0889 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,19 +1,11 @@ -ACLOCAL_AMFLAGS = -I m4 ## Process this file with automake to produce Makefile.in RSYNC = rsync --rsh=ssh -# build the following subdirectories -if BUILD_LIBINTL -PO=po -else -PO= -endif - -SUBDIRS = $(PO) src examples doc bindings +SUBDIRS = po src examples doc bindings intl # the following files are not mentioned in any other Makefile EXTRA_DIST = COPYRIGHT CHANGES WIN32-BUILD-TIPS.txt TODO CONTRIBUTORS THREADS \ - intltool-extract.in intltool-merge.in intltool-update.in \ + autogen.sh \ rrdtool.spec favicon.ico win32/Makefile win32/config.h \ win32/rrd.dsp win32/rrd.sln win32/rrd.vcproj \ win32/rrd_config.h.msvc win32/rrdlib.vcproj win32/rrdtool.dsp \ @@ -27,7 +19,7 @@ CLEANFILES = config.cache AUTOMAKE_OPTIONS= foreign # where we keep local rules for automake - +ACLOCAL_AMFLAGS = -I m4 ACLOCAL_M4= $(top_srcdir)/aclocal.m4 #AUTOHEADER = @AUTOHEADER@ --localdir=$(top_srcdir)/config #AUTOCONF = @AUTOCONF@ --localdir=$(top_srcdir)/config diff --git a/acinclude.m4 b/acinclude.m4 deleted file mode 100644 index 5ea34f0..0000000 --- a/acinclude.m4 +++ /dev/null @@ -1,592 +0,0 @@ -dnl Helper Functions for the RRDtool configure.ac script -dnl -dnl this file gets included into aclocal.m4 when runnning aclocal -dnl -dnl -dnl -dnl Check for the presence of a particular library and its header files -dnl if this check fails set the environment variable EX_CHECK_ALL_ERR to YES -dnl and prints out a helful message -dnl -dnl -dnl EX_CHECK_ALL(library, function, header, pkgconf name, tested-version, homepage, cppflags) -dnl $1 $2 $3 $4 $5 $6 $7 -dnl -dnl -AC_DEFUN([EX_CHECK_ALL], -[ - AC_LANG_PUSH(C) - EX_CHECK_STATE=NO - ex_check_save_LIBS=${LIBS} - ex_check_save_CPPFLAGS=${CPPFLAGS} - ex_check_save_LDFLAGS=${LDFLAGS} - if test "x$7" != "x"; then - CPPFLAGS="$CPPFLAGS -I$7" - fi - dnl try compiling naked first - AC_CHECK_LIB($1,$2, [ - AC_CHECK_HEADER($3,[LIBS="-l$1 ${LIBS}";EX_CHECK_STATE=YES],[])],[]) - if test $EX_CHECK_STATE = NO; then - dnl now asking pkg-config for help - AC_CHECK_PROGS(PKGCONFIG,[pkg-config],no) - if test "$PKGCONFIG" != "no"; then - if $PKGCONFIG --exists $4; then - CPPFLAGS=${CPPFLAGS}" "`$PKGCONFIG --cflags $4` - LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-L $4` - LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-other $4` - LIBS=${LIBS}" "`$PKGCONFIG --libs-only-l $4` - dnl remove the cached value and test again - unset ac_cv_lib_`echo $1 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']`_$2 - AC_CHECK_LIB($1,$2,[ - unset ac_cv_header_`echo $3 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']` - AC_CHECK_HEADER($3,[EX_CHECK_STATE=YES],[]) - ],[]) - else - AC_MSG_WARN([ ----------------------------------------------------------------------------- -* I found a copy of pkgconfig, but there is no $4.pc file around. - You may want to set the PKG_CONFIG_PATH variable to point to its - location. ----------------------------------------------------------------------------- - ]) - fi - fi - fi - - if test ${EX_CHECK_STATE} = NO; then - AC_MSG_WARN([ ----------------------------------------------------------------------------- -* I could not find a working copy of $4. Check config.log for hints on why - this is the case. Maybe you need to set LDFLAGS and CPPFLAGS appropriately - so that compiler and the linker can find lib$1 and its header files. If - you have not installed $4, you can get it either from its original home on - - $6 - - You can find also find an archive copy on - - http://oss.oetiker.ch/rrdtool/pub/libs - - The last tested version of $4 is $5. - - LIBS=$LIBS - LDFLAGS=$LDFLAGS - CPPFLAGS=$CPPFLAGS - ----------------------------------------------------------------------------- - ]) - EX_CHECK_ALL_ERR=YES - LIBS="${ex_check_save_LIBS}" - CPPFLAGS="${ex_check_save_CPPFLAGS}" - LDFLAGS="${ex_check_save_LDFLAGS}" - fi - AC_LANG_POP(C) -] -) - -dnl -dnl Ptherad check from http://autoconf-archive.cryp.to/acx_pthread.m4 -dnl -dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) -dnl -dnl This macro figures out how to build C programs using POSIX threads. -dnl It sets the PTHREAD_LIBS output variable to the threads library and -dnl linker flags, and the PTHREAD_CFLAGS output variable to any special -dnl C compiler flags that are needed. (The user can also force certain -dnl compiler flags/libs to be tested by setting these environment -dnl variables.) -dnl -dnl Also sets PTHREAD_CC to any special C compiler that is needed for -dnl multi-threaded programs (defaults to the value of CC otherwise). -dnl (This is necessary on AIX to use the special cc_r compiler alias.) -dnl -dnl NOTE: You are assumed to not only compile your program with these -dnl flags, but also link it with them as well. e.g. you should link -dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS -dnl $LIBS -dnl -dnl If you are only building threads programs, you may wish to use -dnl these variables in your default LIBS, CFLAGS, and CC: -dnl -dnl LIBS="$PTHREAD_LIBS $LIBS" -dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -dnl CC="$PTHREAD_CC" -dnl -dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute -dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to -dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). -dnl -dnl ACTION-IF-FOUND is a list of shell commands to run if a threads -dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to -dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the -dnl default action will define HAVE_PTHREAD. -dnl -dnl Please let the authors know if this macro fails on any platform, or -dnl if you have any other suggestions or comments. This macro was based -dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with -dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros -dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. -dnl We are also grateful for the helpful feedback of numerous users. -dnl -dnl @category InstalledPackages -dnl @author Steven G. Johnson -dnl @version 2005-01-14 -dnl @license GPLWithACException - -AC_DEFUN([ACX_PTHREAD], [ -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_PUSH(C) -acx_pthread_ok=no - -# We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). -# It gets checked for in the link test anyway. - -# First of all, check if the user has set any of the PTHREAD_LIBS, -# etcetera environment variables, and if threads linking works using -# them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) - AC_MSG_RESULT($acx_pthread_ok) - if test x"$acx_pthread_ok" = xno; then - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" - fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" -fi - -# We must check for the threads library under a number of different -# names; the ordering is very important because some systems -# (e.g. DEC) have both -lpthread and -lpthreads, where one of the -# libraries is broken (non-POSIX). - -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. - -acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" - -# The ordering *is* (sometimes) important. Some notes on the -# individual items follow: - -# pthreads: AIX (must check this before -lpthread) -# none: in case threads are in libc; should be tried before -Kthread and -# other compiler flags to prevent continual compiler warnings -# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc -# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# pthread: Linux, etcetera -# --thread-safe: KAI C++ -# pthread-config: use pthread-config program (for GNU Pth library) - -case "${host_cpu}-${host_os}" in - *solaris*) - - # On Solaris (at least, for some versions), libc contains stubbed - # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthread or - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: - - acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" - ;; -esac - -if test x"$acx_pthread_ok" = xno; then -for flag in $acx_pthread_flags; do - - case $flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" - ;; - - pthread-config) - AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) - if test x"$acx_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - - *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" - ;; - esac - - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[pthread_t th; pthread_join(th, 0); - pthread_attr_init(0); pthread_cleanup_push(0, 0); - pthread_create(0,0,0,0); pthread_cleanup_pop(0); ]])],[acx_pthread_ok=yes],[]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($acx_pthread_ok) - if test "x$acx_pthread_ok" = xyes; then - break; - fi - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi - -# Various other checks: -if test "x$acx_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - - # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int attr=$attr;]])],[attr_name=$attr; break],[]) - done - AC_MSG_RESULT($attr_name) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - x_rflag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) x_rflag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) x_rflag="-D_REENTRANT";; - *-linux*) - if test x"$PTHREAD_CFLAGS" = "x-pthread"; then - # For Linux/gcc "-pthread" implies "-lpthread". We need, however, to make this explicit - # in PTHREAD_LIBS such that a shared library to be built properly depends on libpthread. - PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" - fi;; - esac - AC_MSG_RESULT(${x_rflag}) - if test "x$x_rflag" != xno; then - PTHREAD_CFLAGS="$x_rflag $PTHREAD_CFLAGS" - fi - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - # More AIX lossage: must compile with cc_r - AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) -else - PTHREAD_CC="$CC" -fi - -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) - -# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$acx_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) - : -else - acx_pthread_ok=no - $2 -fi -AC_LANG_POP(C) -])dnl ACX_PTHREAD - - -dnl -dnl determine how to get IEEE math working -dnl AC_IEEE(MESSAGE, set rd_cv_ieee_[var] variable, INCLUDES, -dnl FUNCTION-BODY, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]) -dnl - -dnl substitute them in all the files listed in AC_OUTPUT -AC_SUBST(PERLFLAGS) - -AC_DEFUN([AC_IEEE], [ -AC_MSG_CHECKING([if IEEE math works $1]) -AC_CACHE_VAL([rd_cv_ieee_$2], -[AC_RUN_IFELSE([AC_LANG_SOURCE([[$3 - -#if HAVE_MATH_H -# include -#endif - -#if HAVE_FLOAT_H -# include -#endif - -#if HAVE_IEEEFP_H -# include -#endif - -#if HAVE_FP_CLASS_H -# include -#endif - -/* Solaris */ -#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASS)) -# define HAVE_ISINF 1 -# define isinf(a) (fpclass(a) == FP_NINF || fpclass(a) == FP_PINF) -#endif - -/* solaris 10 it defines isnan such that only forte can compile it ... bad bad */ -#if (defined(HAVE_ISNAN) && defined(isnan) && defined(HAVE_FPCLASS)) -# undef isnan -# define isnan(a) (fpclass(a) == FP_SNAN || fpclass(a) == FP_QNAN) -#endif - -/* Digital UNIX */ -#if (! defined(HAVE_ISINF) && defined(HAVE_FP_CLASS) && defined(HAVE_FP_CLASS_H)) -# define HAVE_ISINF 1 -# define isinf(a) (fp_class(a) == FP_NEG_INF || fp_class(a) == FP_POS_INF) -#endif - -/* AIX */ -#if (! defined(HAVE_ISINF) && defined(HAVE_CLASS)) -# define HAVE_ISINF 1 -# define isinf(a) (class(a) == FP_MINUS_INF || class(a) == FP_PLUS_INF) -#endif - -#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_PLUS_INF) && defined(FP_MINUS_INF)) -# define HAVE_ISINF 1 -# define isinf(a) (fpclassify(a) == FP_MINUS_INF || fpclassify(a) == FP_PLUS_INF) -#endif - -#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_INFINITE)) -# define HAVE_ISINF 1 -# define isinf(a) (fpclassify(a) == FP_INFINITE) -#endif - -#include -int main(void){ - double rrdnan,rrdinf,rrdc,rrdzero; - $4; - /* some math to see if we get a floating point exception */ - rrdzero=sin(0.0); /* don't let the compiler optimize us away */ - rrdnan=0.0/rrdzero; /* especially here */ - rrdinf=1.0/rrdzero; /* and here. I want to know if it can do the magic */ - /* at run time without sig fpe */ - rrdc = rrdinf + rrdnan; - rrdc = rrdinf / rrdnan; - if (! isnan(rrdnan)) {printf ("not isnan(NaN) ... "); return 1;} - if (rrdnan == rrdnan) {printf ("nan == nan ... "); return 1;} - if (! isinf(rrdinf)) {printf ("not isinf(oo) ... "); return 1;} - if (! isinf(-rrdinf)) {printf ("not isinf(-oo) ... "); return 1;} - if (! rrdinf > 0) {printf ("not inf > 0 ... "); return 1;} - if (! -rrdinf < 0) {printf ("not -inf < 0 ... "); return 1;} - return 0; - }]])],[rd_cv_ieee_$2=yes],[rd_cv_ieee_$2=no],[:])]) -dnl these we run regardles is cached or not -if test x${rd_cv_ieee_$2} = "xyes"; then - AC_MSG_RESULT(yes) - $5 -else - AC_MSG_RESULT(no) - $6 -fi - -]) - -AC_DEFUN([AC_FULL_IEEE],[ -AC_LANG_PUSH(C) -_cflags=${CFLAGS} -AC_IEEE([out of the box], works, , , , - [CFLAGS="$_cflags -ieee" - AC_IEEE([with the -ieee switch], switch, , , , - [CFLAGS="$_cflags -qfloat=nofold" - AC_IEEE([with the -qfloat=nofold switch], nofold, , , , - [CFLAGS="$_cflags -w -qflttrap=enable:zerodivide" - AC_IEEE([with the -w -qflttrap=enable:zerodivide], flttrap, , , , - [CFLAGS="$_cflags -mieee" - AC_IEEE([with the -mieee switch], mswitch, , , , - [CFLAGS="$_cflags -q float=rndsngl" - AC_IEEE([with the -q float=rndsngl switch], qswitch, , , , - [CFLAGS="$_cflags -OPT:IEEE_NaN_inf=ON" - AC_IEEE([with the -OPT:IEEE_NaN_inf=ON switch], ieeenaninfswitch, , , , - [CFLAGS="$_cflags -OPT:IEEE_comparisons=ON" - AC_IEEE([with the -OPT:IEEE_comparisons=ON switch], ieeecmpswitch, , , , - [CFLAGS=$_cflags - AC_IEEE([with fpsetmask(0)], mask, - [#include ], [fpsetmask(0)], - [AC_DEFINE(MUST_DISABLE_FPMASK) - PERLFLAGS="CCFLAGS=-DMUST_DISABLE_FPMASK"], - [AC_IEEE([with signal(SIGFPE,SIG_IGN)], sigfpe, - [#include ], [signal(SIGFPE,SIG_IGN)], - [AC_DEFINE(MUST_DISABLE_SIGFPE) - PERLFLAGS="CCFLAGS=-DMUST_DISABLE_SIGFPE"], - AC_MSG_ERROR([ -Your Compiler does not do propper IEEE math ... Please find out how to -make IEEE math work with your compiler and let me know (tobi@oetiker.ch). -Check config.log to see what went wrong ... -]))])])])])])])])])]) - -AC_LANG_POP(C) - -]) - - -dnl a macro to check for ability to create python extensions -dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE]) -dnl function also defines PYTHON_INCLUDES -AC_DEFUN([AM_CHECK_PYTHON_HEADERS], -[AC_REQUIRE([AM_PATH_PYTHON]) -AC_MSG_CHECKING(for headers required to compile python extensions) -dnl deduce PYTHON_INCLUDES -py_prefix=`$PYTHON -c "import sys; print sys.prefix"` -py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` -PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" -if test "$py_prefix" != "$py_exec_prefix"; then - PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" -fi -AC_SUBST(PYTHON_INCLUDES) -dnl check if the headers exist: -save_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" -AC_TRY_CPP([#include ],dnl -[AC_MSG_RESULT(found) -$1],dnl -[AC_MSG_RESULT(not found) -$2]) -CPPFLAGS="$save_CPPFLAGS" -]) - -dnl a macro to add some color to the build process. -dnl CONFIGURE_PART(MESSAGE) - -AC_DEFUN([CONFIGURE_PART],[ -case $TERM in - # for the most important terminal types we directly know the sequences - xterm|xterm*|vt220|vt220*) - T_MD=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` - T_ME=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` - ;; - vt100|vt100*|cygwin) - T_MD=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` - T_ME=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` - ;; - *) - T_MD='' - T_ME='' - ;; -esac - AC_MSG_RESULT() - AC_MSG_RESULT([${T_MD}$1${T_ME}]) -]) - -dnl check - -AC_DEFUN([CHECK_FOR_WORKING_MS_ASYNC], [ -AC_MSG_CHECKING([if msync with MS_ASYNC updates the files mtime]) -AC_CACHE_VAL([rd_cv_ms_async], -[AC_RUN_IFELSE([AC_LANG_SOURCE([[ -#include -#include -#include -#include -#include -#include -#include -#include -int main(void){ - int fd; - struct stat stbuf; - char *addr; - int res; - char temp[] = "mmaptestXXXXXX"; - struct utimbuf newtime; - - time_t create_ts; - fd = mkstemp(temp); - if (fd == -1){ - perror(temp); - return 1; - } - write(fd,"12345\n", 6); - stat(temp, &stbuf); - create_ts = stbuf.st_mtime; - newtime.actime = 0; - newtime.modtime = 0; - utime(temp,&newtime); - addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - if (addr == MAP_FAILED) { - perror("mmap"); - goto bad_exit; - } - addr[0]='x'; - res = msync(addr, 4, MS_ASYNC); - if (res == -1) { - perror("msync"); - goto bad_exit; - } - res = close(fd); - if (res == -1) { - perror("close"); - goto bad_exit; - } - /* The ASYNC means that we schedule the msync and return immediately. - Since we want to see if the modification time is updated upon - msync(), we have to make sure that our asynchronous request - completes before we stat below. In a real application, the - request would be completed at a random time in the future - but for this test we do not want to wait an arbitrary amount of - time, so force a commit now. */ - sync(); - stat(temp, &stbuf); - if (create_ts > stbuf.st_mtime){ - goto bad_exit; - } - unlink(temp); - return 0; - bad_exit: - unlink(temp); - return 1; -} -]])],[rd_cv_ms_async=ok],[rd_cv_ms_async=broken],[:])]) - - -if test "${rd_cv_ms_async}" = "ok"; then - AC_MSG_RESULT(yes) -else - AC_DEFINE_UNQUOTED(HAVE_BROKEN_MS_ASYNC, 1 , [set to 1 if msync with MS_ASYNC fails to update mtime]) - AC_MSG_RESULT(no) - AC_MSG_WARN([With mmap access, your platform fails to update the files]) - AC_MSG_WARN([mtime. RRDtool will work around this problem by calling utime on each]) - AC_MSG_WARN([file it opens for rw access.]) - sleep 2 -fi - -]) - diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..0f4bfad --- /dev/null +++ b/autogen.sh @@ -0,0 +1,2 @@ +#!/bin/sh +autoreconf --force --install --verbose -Iconfig -Im4 diff --git a/configure.ac b/configure.ac index 10e08f9..064c1a6 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ dnl see http://sourceware.org/autobook/autobook/autobook_91.html dnl LIBVERS=4:7:0 AC_SUBST(LIBVERS) - +AC_USE_SYSTEM_EXTENSIONS AC_CANONICAL_TARGET AM_INIT_AUTOMAKE AM_MAINTAINER_MODE @@ -246,45 +246,8 @@ AC_CHECK_FUNCS(posix_fadvise) CONFIGURE_PART(Libintl Processing) - -dnl gettext -GETTEXT_PACKAGE=rrdtool -AC_SUBST(GETTEXT_PACKAGE) -AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Gettext package]) - -AM_GLIB_GNU_GETTEXT() - -AC_ARG_ENABLE(libintl,[ --disable-libintl i18n support (libintl)], -[],[enable_libintl=yes]) - -if test x$enable_libintl = xyes; then - IT_PROG_INTLTOOL([0.35.0],[no-xml]) -fi - -if test x$enable_libintl = xyes -a x$MSGFMT = xno; then - AC_MSG_WARN(I could not find msgfmt. Diabeling libintl build.) - enable_libintl=no -fi - -if test x$enable_libintl = xyes; then - AC_CHECK_HEADERS(libintl.h,[],[AC_MSG_RESULT(disabeling libintl build); enable_libintl=no]) -fi - -if test x$enable_libintl = xyes ; then - dnl it seems bsd synstems need to link against libintl - dnl when compiling rrdupdate. lets check - AC_CHECK_LIB(intl, libintl_gettext,[LIB_LIBINTL="-lintl"]) -fi - -dnl use for linking rrdupdate -AC_SUBST(LIB_LIBINTL) - -dnl do not touch the po stuff if we are not going to build intl -AM_CONDITIONAL(BUILD_LIBINTL,[test x$enable_libintl = xyes]) - -if test x$enable_libintl = xyes; then - AC_DEFINE([BUILD_LIBINTL], [], [Use this in code sections to mark them for libintl build]) -fi +AM_GNU_GETTEXT_VERSION(0.17) +AM_GNU_GETTEXT() CONFIGURE_PART(IEEE Math Checks) @@ -729,6 +692,7 @@ AC_CONFIG_FILES([examples/perftest.pl]) AC_CONFIG_FILES([examples/Makefile]) AC_CONFIG_FILES([doc/Makefile]) AC_CONFIG_FILES([po/Makefile.in]) +AC_CONFIG_FILES([intl/Makefile]) AC_CONFIG_FILES([src/Makefile]) AC_CONFIG_FILES([src/librrd.sym.in]) AC_CONFIG_FILES([src/librrd.pc]) @@ -772,7 +736,7 @@ echo " Build Tcl Bindings: $enable_tcl" echo " Build Python Bindings: $enable_python" echo " Build rrdcgi: $enable_rrdcgi" echo " Build librrd MT: $enable_pthread" -echo " Link with libintl: $enable_libintl" +echo " Use gettext: $USE_NLS" echo echo " Libraries: $ALL_LIBS" echo diff --git a/m4/acinclude.m4 b/m4/acinclude.m4 new file mode 100644 index 0000000..5ea34f0 --- /dev/null +++ b/m4/acinclude.m4 @@ -0,0 +1,592 @@ +dnl Helper Functions for the RRDtool configure.ac script +dnl +dnl this file gets included into aclocal.m4 when runnning aclocal +dnl +dnl +dnl +dnl Check for the presence of a particular library and its header files +dnl if this check fails set the environment variable EX_CHECK_ALL_ERR to YES +dnl and prints out a helful message +dnl +dnl +dnl EX_CHECK_ALL(library, function, header, pkgconf name, tested-version, homepage, cppflags) +dnl $1 $2 $3 $4 $5 $6 $7 +dnl +dnl +AC_DEFUN([EX_CHECK_ALL], +[ + AC_LANG_PUSH(C) + EX_CHECK_STATE=NO + ex_check_save_LIBS=${LIBS} + ex_check_save_CPPFLAGS=${CPPFLAGS} + ex_check_save_LDFLAGS=${LDFLAGS} + if test "x$7" != "x"; then + CPPFLAGS="$CPPFLAGS -I$7" + fi + dnl try compiling naked first + AC_CHECK_LIB($1,$2, [ + AC_CHECK_HEADER($3,[LIBS="-l$1 ${LIBS}";EX_CHECK_STATE=YES],[])],[]) + if test $EX_CHECK_STATE = NO; then + dnl now asking pkg-config for help + AC_CHECK_PROGS(PKGCONFIG,[pkg-config],no) + if test "$PKGCONFIG" != "no"; then + if $PKGCONFIG --exists $4; then + CPPFLAGS=${CPPFLAGS}" "`$PKGCONFIG --cflags $4` + LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-L $4` + LDFLAGS=${LDFLAGS}" "`$PKGCONFIG --libs-only-other $4` + LIBS=${LIBS}" "`$PKGCONFIG --libs-only-l $4` + dnl remove the cached value and test again + unset ac_cv_lib_`echo $1 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']`_$2 + AC_CHECK_LIB($1,$2,[ + unset ac_cv_header_`echo $3 | sed ['s/[^_a-zA-Z0-9]/_/g;s/^[0-9]/_/']` + AC_CHECK_HEADER($3,[EX_CHECK_STATE=YES],[]) + ],[]) + else + AC_MSG_WARN([ +---------------------------------------------------------------------------- +* I found a copy of pkgconfig, but there is no $4.pc file around. + You may want to set the PKG_CONFIG_PATH variable to point to its + location. +---------------------------------------------------------------------------- + ]) + fi + fi + fi + + if test ${EX_CHECK_STATE} = NO; then + AC_MSG_WARN([ +---------------------------------------------------------------------------- +* I could not find a working copy of $4. Check config.log for hints on why + this is the case. Maybe you need to set LDFLAGS and CPPFLAGS appropriately + so that compiler and the linker can find lib$1 and its header files. If + you have not installed $4, you can get it either from its original home on + + $6 + + You can find also find an archive copy on + + http://oss.oetiker.ch/rrdtool/pub/libs + + The last tested version of $4 is $5. + + LIBS=$LIBS + LDFLAGS=$LDFLAGS + CPPFLAGS=$CPPFLAGS + +---------------------------------------------------------------------------- + ]) + EX_CHECK_ALL_ERR=YES + LIBS="${ex_check_save_LIBS}" + CPPFLAGS="${ex_check_save_CPPFLAGS}" + LDFLAGS="${ex_check_save_LDFLAGS}" + fi + AC_LANG_POP(C) +] +) + +dnl +dnl Ptherad check from http://autoconf-archive.cryp.to/acx_pthread.m4 +dnl +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2005-01-14 +dnl @license GPLWithACException + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_PUSH(C) +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthread or + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ]])],[acx_pthread_ok=yes],[]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int attr=$attr;]])],[attr_name=$attr; break],[]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + x_rflag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) x_rflag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) x_rflag="-D_REENTRANT";; + *-linux*) + if test x"$PTHREAD_CFLAGS" = "x-pthread"; then + # For Linux/gcc "-pthread" implies "-lpthread". We need, however, to make this explicit + # in PTHREAD_LIBS such that a shared library to be built properly depends on libpthread. + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + fi;; + esac + AC_MSG_RESULT(${x_rflag}) + if test "x$x_rflag" != xno; then + PTHREAD_CFLAGS="$x_rflag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with cc_r + AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_POP(C) +])dnl ACX_PTHREAD + + +dnl +dnl determine how to get IEEE math working +dnl AC_IEEE(MESSAGE, set rd_cv_ieee_[var] variable, INCLUDES, +dnl FUNCTION-BODY, [ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]]) +dnl + +dnl substitute them in all the files listed in AC_OUTPUT +AC_SUBST(PERLFLAGS) + +AC_DEFUN([AC_IEEE], [ +AC_MSG_CHECKING([if IEEE math works $1]) +AC_CACHE_VAL([rd_cv_ieee_$2], +[AC_RUN_IFELSE([AC_LANG_SOURCE([[$3 + +#if HAVE_MATH_H +# include +#endif + +#if HAVE_FLOAT_H +# include +#endif + +#if HAVE_IEEEFP_H +# include +#endif + +#if HAVE_FP_CLASS_H +# include +#endif + +/* Solaris */ +#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASS)) +# define HAVE_ISINF 1 +# define isinf(a) (fpclass(a) == FP_NINF || fpclass(a) == FP_PINF) +#endif + +/* solaris 10 it defines isnan such that only forte can compile it ... bad bad */ +#if (defined(HAVE_ISNAN) && defined(isnan) && defined(HAVE_FPCLASS)) +# undef isnan +# define isnan(a) (fpclass(a) == FP_SNAN || fpclass(a) == FP_QNAN) +#endif + +/* Digital UNIX */ +#if (! defined(HAVE_ISINF) && defined(HAVE_FP_CLASS) && defined(HAVE_FP_CLASS_H)) +# define HAVE_ISINF 1 +# define isinf(a) (fp_class(a) == FP_NEG_INF || fp_class(a) == FP_POS_INF) +#endif + +/* AIX */ +#if (! defined(HAVE_ISINF) && defined(HAVE_CLASS)) +# define HAVE_ISINF 1 +# define isinf(a) (class(a) == FP_MINUS_INF || class(a) == FP_PLUS_INF) +#endif + +#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_PLUS_INF) && defined(FP_MINUS_INF)) +# define HAVE_ISINF 1 +# define isinf(a) (fpclassify(a) == FP_MINUS_INF || fpclassify(a) == FP_PLUS_INF) +#endif + +#if (! defined(HAVE_ISINF) && defined(HAVE_FPCLASSIFY) && defined(FP_INFINITE)) +# define HAVE_ISINF 1 +# define isinf(a) (fpclassify(a) == FP_INFINITE) +#endif + +#include +int main(void){ + double rrdnan,rrdinf,rrdc,rrdzero; + $4; + /* some math to see if we get a floating point exception */ + rrdzero=sin(0.0); /* don't let the compiler optimize us away */ + rrdnan=0.0/rrdzero; /* especially here */ + rrdinf=1.0/rrdzero; /* and here. I want to know if it can do the magic */ + /* at run time without sig fpe */ + rrdc = rrdinf + rrdnan; + rrdc = rrdinf / rrdnan; + if (! isnan(rrdnan)) {printf ("not isnan(NaN) ... "); return 1;} + if (rrdnan == rrdnan) {printf ("nan == nan ... "); return 1;} + if (! isinf(rrdinf)) {printf ("not isinf(oo) ... "); return 1;} + if (! isinf(-rrdinf)) {printf ("not isinf(-oo) ... "); return 1;} + if (! rrdinf > 0) {printf ("not inf > 0 ... "); return 1;} + if (! -rrdinf < 0) {printf ("not -inf < 0 ... "); return 1;} + return 0; + }]])],[rd_cv_ieee_$2=yes],[rd_cv_ieee_$2=no],[:])]) +dnl these we run regardles is cached or not +if test x${rd_cv_ieee_$2} = "xyes"; then + AC_MSG_RESULT(yes) + $5 +else + AC_MSG_RESULT(no) + $6 +fi + +]) + +AC_DEFUN([AC_FULL_IEEE],[ +AC_LANG_PUSH(C) +_cflags=${CFLAGS} +AC_IEEE([out of the box], works, , , , + [CFLAGS="$_cflags -ieee" + AC_IEEE([with the -ieee switch], switch, , , , + [CFLAGS="$_cflags -qfloat=nofold" + AC_IEEE([with the -qfloat=nofold switch], nofold, , , , + [CFLAGS="$_cflags -w -qflttrap=enable:zerodivide" + AC_IEEE([with the -w -qflttrap=enable:zerodivide], flttrap, , , , + [CFLAGS="$_cflags -mieee" + AC_IEEE([with the -mieee switch], mswitch, , , , + [CFLAGS="$_cflags -q float=rndsngl" + AC_IEEE([with the -q float=rndsngl switch], qswitch, , , , + [CFLAGS="$_cflags -OPT:IEEE_NaN_inf=ON" + AC_IEEE([with the -OPT:IEEE_NaN_inf=ON switch], ieeenaninfswitch, , , , + [CFLAGS="$_cflags -OPT:IEEE_comparisons=ON" + AC_IEEE([with the -OPT:IEEE_comparisons=ON switch], ieeecmpswitch, , , , + [CFLAGS=$_cflags + AC_IEEE([with fpsetmask(0)], mask, + [#include ], [fpsetmask(0)], + [AC_DEFINE(MUST_DISABLE_FPMASK) + PERLFLAGS="CCFLAGS=-DMUST_DISABLE_FPMASK"], + [AC_IEEE([with signal(SIGFPE,SIG_IGN)], sigfpe, + [#include ], [signal(SIGFPE,SIG_IGN)], + [AC_DEFINE(MUST_DISABLE_SIGFPE) + PERLFLAGS="CCFLAGS=-DMUST_DISABLE_SIGFPE"], + AC_MSG_ERROR([ +Your Compiler does not do propper IEEE math ... Please find out how to +make IEEE math work with your compiler and let me know (tobi@oetiker.ch). +Check config.log to see what went wrong ... +]))])])])])])])])])]) + +AC_LANG_POP(C) + +]) + + +dnl a macro to check for ability to create python extensions +dnl AM_CHECK_PYTHON_HEADERS([ACTION-IF-POSSIBLE], [ACTION-IF-NOT-POSSIBLE]) +dnl function also defines PYTHON_INCLUDES +AC_DEFUN([AM_CHECK_PYTHON_HEADERS], +[AC_REQUIRE([AM_PATH_PYTHON]) +AC_MSG_CHECKING(for headers required to compile python extensions) +dnl deduce PYTHON_INCLUDES +py_prefix=`$PYTHON -c "import sys; print sys.prefix"` +py_exec_prefix=`$PYTHON -c "import sys; print sys.exec_prefix"` +PYTHON_INCLUDES="-I${py_prefix}/include/python${PYTHON_VERSION}" +if test "$py_prefix" != "$py_exec_prefix"; then + PYTHON_INCLUDES="$PYTHON_INCLUDES -I${py_exec_prefix}/include/python${PYTHON_VERSION}" +fi +AC_SUBST(PYTHON_INCLUDES) +dnl check if the headers exist: +save_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $PYTHON_INCLUDES" +AC_TRY_CPP([#include ],dnl +[AC_MSG_RESULT(found) +$1],dnl +[AC_MSG_RESULT(not found) +$2]) +CPPFLAGS="$save_CPPFLAGS" +]) + +dnl a macro to add some color to the build process. +dnl CONFIGURE_PART(MESSAGE) + +AC_DEFUN([CONFIGURE_PART],[ +case $TERM in + # for the most important terminal types we directly know the sequences + xterm|xterm*|vt220|vt220*) + T_MD=`awk 'BEGIN { printf("%c%c%c%c", 27, 91, 49, 109); }' /dev/null` + T_ME=`awk 'BEGIN { printf("%c%c%c", 27, 91, 109); }' /dev/null` + ;; + vt100|vt100*|cygwin) + T_MD=`awk 'BEGIN { printf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); }' /dev/null` + T_ME=`awk 'BEGIN { printf("%c%c%c%c%c", 27, 91, 109, 0, 0); }' /dev/null` + ;; + *) + T_MD='' + T_ME='' + ;; +esac + AC_MSG_RESULT() + AC_MSG_RESULT([${T_MD}$1${T_ME}]) +]) + +dnl check + +AC_DEFUN([CHECK_FOR_WORKING_MS_ASYNC], [ +AC_MSG_CHECKING([if msync with MS_ASYNC updates the files mtime]) +AC_CACHE_VAL([rd_cv_ms_async], +[AC_RUN_IFELSE([AC_LANG_SOURCE([[ +#include +#include +#include +#include +#include +#include +#include +#include +int main(void){ + int fd; + struct stat stbuf; + char *addr; + int res; + char temp[] = "mmaptestXXXXXX"; + struct utimbuf newtime; + + time_t create_ts; + fd = mkstemp(temp); + if (fd == -1){ + perror(temp); + return 1; + } + write(fd,"12345\n", 6); + stat(temp, &stbuf); + create_ts = stbuf.st_mtime; + newtime.actime = 0; + newtime.modtime = 0; + utime(temp,&newtime); + addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + perror("mmap"); + goto bad_exit; + } + addr[0]='x'; + res = msync(addr, 4, MS_ASYNC); + if (res == -1) { + perror("msync"); + goto bad_exit; + } + res = close(fd); + if (res == -1) { + perror("close"); + goto bad_exit; + } + /* The ASYNC means that we schedule the msync and return immediately. + Since we want to see if the modification time is updated upon + msync(), we have to make sure that our asynchronous request + completes before we stat below. In a real application, the + request would be completed at a random time in the future + but for this test we do not want to wait an arbitrary amount of + time, so force a commit now. */ + sync(); + stat(temp, &stbuf); + if (create_ts > stbuf.st_mtime){ + goto bad_exit; + } + unlink(temp); + return 0; + bad_exit: + unlink(temp); + return 1; +} +]])],[rd_cv_ms_async=ok],[rd_cv_ms_async=broken],[:])]) + + +if test "${rd_cv_ms_async}" = "ok"; then + AC_MSG_RESULT(yes) +else + AC_DEFINE_UNQUOTED(HAVE_BROKEN_MS_ASYNC, 1 , [set to 1 if msync with MS_ASYNC fails to update mtime]) + AC_MSG_RESULT(no) + AC_MSG_WARN([With mmap access, your platform fails to update the files]) + AC_MSG_WARN([mtime. RRDtool will work around this problem by calling utime on each]) + AC_MSG_WARN([file it opens for rw access.]) + sleep 2 +fi + +]) + diff --git a/po/LINGUAS b/po/LINGUAS index 46ae20d..8b13789 100644 --- a/po/LINGUAS +++ b/po/LINGUAS @@ -1,2 +1 @@ -de diff --git a/po/de.po b/po/de.po deleted file mode 100644 index 4c556c7..0000000 --- a/po/de.po +++ /dev/null @@ -1,334 +0,0 @@ -#: ../src/rrd_getopt.c:615 -#, c-format -msgid "%s: option `%s' is ambiguous\n" -msgstr "" - -#: ../src/rrd_getopt.c:637 -#, c-format -msgid "%s: option `--%s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_getopt.c:643 -#, c-format -msgid "%s: option `%c%s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_getopt.c:658 ../src/rrd_getopt.c:811 -#, c-format -msgid "%s: option `%s' requires an argument\n" -msgstr "" - -#. --option -#: ../src/rrd_getopt.c:684 -#, c-format -msgid "%s: unrecognized option `--%s'\n" -msgstr "" - -#. +option or -option -#: ../src/rrd_getopt.c:688 -#, c-format -msgid "%s: unrecognized option `%c%s'\n" -msgstr "" - -#. 1003.2 specifies the format of this message. -#: ../src/rrd_getopt.c:712 -#, c-format -msgid "%s: illegal option -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:715 -#, c-format -msgid "%s: invalid option -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:741 ../src/rrd_getopt.c:849 -#, c-format -msgid "%s: option requires an argument -- %c\n" -msgstr "" - -#: ../src/rrd_getopt.c:783 -#, c-format -msgid "%s: option `-W %s' is ambiguous\n" -msgstr "" - -#: ../src/rrd_getopt.c:798 -#, c-format -msgid "%s: option `-W %s' doesn't allow an argument\n" -msgstr "" - -#: ../src/rrd_tool.c:49 -#, c-format -msgid "" -"RRDtool %s Copyright 1997-2007 by Tobias Oetiker \n" -" Compiled %s %s\n" -"\n" -"Usage: rrdtool [options] command command_options\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:55 -msgid "" -"Valid commands: create, update, updatev, graph, dump, restore,\n" -"\t\tlast, lastupdate, first, info, fetch, tune,\n" -"\t\tresize, xport\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:60 -msgid "" -"Valid remote commands: quit, ls, cd, mkdir, pwd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:64 -msgid "" -"* create - create a new RRD\n" -"\n" -"\trrdtool create filename [--start|-b start time]\n" -"\t\t[--step|-s step]\n" -"\t\t[DS:ds-name:DST:dst arguments]\n" -"\t\t[RRA:CF:cf arguments]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:71 -msgid "" -"* dump - dump an RRD to XML\n" -"\n" -"\trrdtool dump filename.rrd >filename.xml\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:75 -msgid "" -"* info - returns the configuration and status of the RRD\n" -"\n" -"\trrdtool info filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:79 -msgid "" -"* restore - restore an RRD file from its XML form\n" -"\n" -"\trrdtool restore [--range-check|-r] [--force-overwrite|-f] filename.xml " -"filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:83 -msgid "" -"* last - show last update time for RRD\n" -"\n" -"\trrdtool last filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:87 -msgid "" -"* lastupdate - returns the most recent datum stored for\n" -" each DS in an RRD\n" -"\n" -"\trrdtool lastupdate filename.rrd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:91 -msgid "" -"* first - show first update time for RRA within an RRD\n" -"\n" -"\trrdtool first filename.rrd [--rraindex number]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:95 -msgid "" -"* update - update an RRD\n" -"\n" -"\trrdtool update filename\n" -"\t\t--template|-t ds-name:ds-name:...\n" -"\t\ttime|N:value[:value...]\n" -"\n" -"\t\tat-time@value[:value...]\n" -"\n" -"\t\t[ time:value[:value...] ..]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:103 -msgid "" -"* updatev - a verbose version of update\n" -"\treturns information about values, RRAs, and datasources updated\n" -"\n" -"\trrdtool updatev filename\n" -"\t\t--template|-t ds-name:ds-name:...\n" -"\t\ttime|N:value[:value...]\n" -"\n" -"\t\tat-time@value[:value...]\n" -"\n" -"\t\t[ time:value[:value...] ..]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:112 -msgid "" -"* fetch - fetch data out of an RRD\n" -"\n" -"\trrdtool fetch filename.rrd CF\n" -"\t\t[-r|--resolution resolution]\n" -"\t\t[-s|--start start] [-e|--end end]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:120 -msgid "" -"* graph - generate a graph from one or several RRD\n" -"\n" -"\trrdtool graph filename [-s|--start seconds] [-e|--end seconds]\n" -"\t\t[-x|--x-grid x-axis grid and label]\n" -"\t\t[-Y|--alt-y-grid]\n" -"\t\t[-y|--y-grid y-axis grid and label]\n" -"\t\t[-v|--vertical-label string] [-w|--width pixels]\n" -"\t\t[-h|--height pixels] [-o|--logarithmic]\n" -"\t\t[-u|--upper-limit value] [-z|--lazy]\n" -"\t\t[-l|--lower-limit value] [-r|--rigid]\n" -"\t\t[-g|--no-legend]\n" -"\t\t[-F|--force-rules-legend]\n" -"\t\t[-j|--only-graph]\n" -msgstr "" - -#: ../src/rrd_tool.c:132 -msgid "" -"\t\t[-n|--font FONTTAG:size:font]\n" -"\t\t[-m|--zoom factor]\n" -"\t\t[-A|--alt-autoscale]\n" -"\t\t[-M|--alt-autoscale-max]\n" -"\t\t[-R|--font-render-mode {normal,light,mono}]\n" -"\t\t[-B|--font-smoothing-threshold size]\n" -"\t\t[-E|--slope-mode]\n" -"\t\t[-N|--no-gridfit]\n" -"\t\t[-X|--units-exponent value]\n" -"\t\t[-L|--units-length value]\n" -"\t\t[-S|--step seconds]\n" -"\t\t[-f|--imginfo printfstr]\n" -"\t\t[-a|--imgformat PNG]\n" -"\t\t[-c|--color COLORTAG#rrggbb[aa]] [-t|--title string]\n" -"\t\t[-W|--watermark string]\n" -"\t\t[DEF:vname=rrd:ds-name:CF]\n" -msgstr "" - -#: ../src/rrd_tool.c:148 -msgid "" -"\t\t[CDEF:vname=rpn-expression]\n" -"\t\t[VDEF:vdefname=rpn-expression]\n" -"\t\t[PRINT:vdefname:format]\n" -"\t\t[GPRINT:vdefname:format]\n" -"\t\t[COMMENT:text]\n" -"\t\t[SHIFT:vname:offset]\n" -"\t\t[TICK:vname#rrggbb[aa][:[fraction][:legend]]]\n" -"\t\t[HRULE:value#rrggbb[aa][:legend]]\n" -"\t\t[VRULE:value#rrggbb[aa][:legend]]\n" -"\t\t[LINE[width]:vname[#rrggbb[aa][:[legend][:STACK]]]]\n" -"\t\t[AREA:vname[#rrggbb[aa][:[legend][:STACK]]]]\n" -"\t\t[PRINT:vname:CF:format] (deprecated)\n" -"\t\t[GPRINT:vname:CF:format] (deprecated)\n" -"\t\t[STACK:vname[#rrggbb[aa][:legend]]] (deprecated)\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:164 -msgid "" -" * tune - Modify some basic properties of an RRD\n" -"\n" -"\trrdtool tune filename\n" -"\t\t[--heartbeat|-h ds-name:heartbeat]\n" -"\t\t[--data-source-type|-d ds-name:DST]\n" -"\t\t[--data-source-rename|-r old-name:new-name]\n" -"\t\t[--minimum|-i ds-name:min] [--maximum|-a ds-name:max]\n" -"\t\t[--deltapos scale-value] [--deltaneg scale-value]\n" -"\t\t[--failure-threshold integer]\n" -"\t\t[--window-length integer]\n" -"\t\t[--alpha adaptation-parameter]\n" -msgstr "" - -#: ../src/rrd_tool.c:175 -msgid "" -" * tune - Modify some basic properties of an RRD\n" -"\n" -"\t\t[--beta adaptation-parameter]\n" -"\t\t[--gamma adaptation-parameter]\n" -"\t\t[--gamma-deviation adaptation-parameter]\n" -"\t\t[--aberrant-reset ds-name]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:182 -msgid "" -" * resize - alter the length of one of the RRAs in an RRD\n" -"\n" -"\trrdtool resize filename rranum GROW|SHRINK rows\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:186 -msgid "" -"* xport - generate XML dump from one or several RRD\n" -"\n" -"\trrdtool xport [-s|--start seconds] [-e|--end seconds]\n" -"\t\t[-m|--maxrows rows]\n" -"\t\t[--step seconds]\n" -"\t\t[--enumds]\n" -"\t\t[DEF:vname=rrd:ds-name:CF]\n" -"\t\t[CDEF:vname=rpn-expression]\n" -"\t\t[XPORT:vname:legend]\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:195 -msgid "" -" * quit - closing a session in remote mode\n" -"\n" -"\trrdtool quit\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:198 -msgid "" -" * ls - lists all *.rrd files in current directory\n" -"\n" -"\trrdtool ls\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:202 -msgid "" -" * cd - changes the current directory\n" -"\n" -"\trrdtool cd new directory\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:206 -msgid "" -" * mkdir - creates a new directory\n" -"\n" -"\trrdtool mkdir newdirectoryname\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:210 -msgid "" -" * pwd - returns the current working directory\n" -"\n" -"\trrdtool pwd\n" -"\n" -msgstr "" - -#: ../src/rrd_tool.c:214 -msgid "" -"RRDtool is distributed under the Terms of the GNU General\n" -"Public License Version 2. (www.gnu.org/copyleft/gpl.html)\n" -"\n" -"For more information read the RRD manpages\n" -"\n" -msgstr "" diff --git a/src/Makefile.am b/src/Makefile.am index 74d382f..ccdd604 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,7 +52,7 @@ noinst_HEADERS = \ rrd_format.h rrd_tool.h rrd_xport.h rrd.h rrd_rpncalc.h \ rrd_hw.h rrd_hw_math.h rrd_hw_update.h \ fnv.h rrd_graph.h \ - rrd_is_thread_safe.h + rrd_is_thread_safe.h gettext.h if BUILD_GETOPT noinst_HEADERS += rrd_getopt.h diff --git a/src/gettext.h b/src/gettext.h new file mode 100644 index 0000000..209921e --- /dev/null +++ b/src/gettext.h @@ -0,0 +1,271 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004-2006 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +/* You can set the DEFAULT_TEXT_DOMAIN macro to specify the domain used by + the gettext() and ngettext() macros. This is an alternative to calling + textdomain(), and is useful for libraries. */ +# ifdef DEFAULT_TEXT_DOMAIN +# undef gettext +# define gettext(Msgid) \ + dgettext (DEFAULT_TEXT_DOMAIN, Msgid) +# undef ngettext +# define ngettext(Msgid1, Msgid2, N) \ + dngettext (DEFAULT_TEXT_DOMAIN, Msgid1, Msgid2, N) +# endif + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((void) (Domainname), gettext (Msgid)) +# define dcgettext(Domainname, Msgid, Category) \ + ((void) (Category), dgettext (Domainname, Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 \ + ? ((void) (Msgid2), (const char *) (Msgid1)) \ + : ((void) (Msgid1), (const char *) (Msgid2))) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((void) (Domainname), ngettext (Msgid1, Msgid2, N)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((void) (Category), dngettext(Domainname, Msgid1, Msgid2, N)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) \ + ((void) (Domainname), (const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) \ + ((void) (Domainname), (const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +/* The separator between msgctxt and msgid in a .mo file. */ +#define GETTEXT_CONTEXT_GLUE "\004" + +/* Pseudo function calls, taking a MSGCTXT and a MSGID instead of just a + MSGID. MSGCTXT and MSGID must be string literals. MSGCTXT should be + short and rarely need to change. + The letter 'p' stands for 'particular' or 'special'. */ +#ifdef DEFAULT_TEXT_DOMAIN +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#else +# define pgettext(Msgctxt, Msgid) \ + pgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#endif +#define dpgettext(Domainname, Msgctxt, Msgid) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, LC_MESSAGES) +#define dcpgettext(Domainname, Msgctxt, Msgid, Category) \ + pgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, Category) +#ifdef DEFAULT_TEXT_DOMAIN +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (DEFAULT_TEXT_DOMAIN, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#else +# define npgettext(Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (NULL, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#endif +#define dnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dcnpgettext(Domainname, Msgctxt, Msgid, MsgidPlural, N, Category) \ + npgettext_aux (Domainname, Msgctxt GETTEXT_CONTEXT_GLUE Msgid, Msgid, MsgidPlural, N, Category) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +pgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + int category) +{ + const char *translation = dcgettext (domain, msg_ctxt_id, category); + if (translation == msg_ctxt_id) + return msgid; + else + return translation; +} + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +npgettext_aux (const char *domain, + const char *msg_ctxt_id, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + const char *translation = + dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); + if (translation == msg_ctxt_id || translation == msgid_plural) + return (n == 1 ? msgid : msgid_plural); + else + return translation; +} + +/* The same thing extended for non-constant arguments. Here MSGCTXT and MSGID + can be arbitrary expressions. But for string literals these macros are + less efficient than those above. */ + +#include + +#define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS \ + (((__GNUC__ >= 3 || __GNUG__ >= 2) && !__STRICT_ANSI__) \ + /* || __STDC_VERSION__ >= 199901L */ ) + +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS +#include +#endif + +#define pgettext_expr(Msgctxt, Msgid) \ + dcpgettext_expr (NULL, Msgctxt, Msgid, LC_MESSAGES) +#define dpgettext_expr(Domainname, Msgctxt, Msgid) \ + dcpgettext_expr (Domainname, Msgctxt, Msgid, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcgettext (domain, msg_ctxt_id, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (translation != msg_ctxt_id) + return translation; + } + return msgid; +} + +#define npgettext_expr(Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (NULL, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) +#define dnpgettext_expr(Domainname, Msgctxt, Msgid, MsgidPlural, N) \ + dcnpgettext_expr (Domainname, Msgctxt, Msgid, MsgidPlural, N, LC_MESSAGES) + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static const char * +dcnpgettext_expr (const char *domain, + const char *msgctxt, const char *msgid, + const char *msgid_plural, unsigned long int n, + int category) +{ + size_t msgctxt_len = strlen (msgctxt) + 1; + size_t msgid_len = strlen (msgid) + 1; + const char *translation; +#if _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + char msg_ctxt_id[msgctxt_len + msgid_len]; +#else + char buf[1024]; + char *msg_ctxt_id = + (msgctxt_len + msgid_len <= sizeof (buf) + ? buf + : (char *) malloc (msgctxt_len + msgid_len)); + if (msg_ctxt_id != NULL) +#endif + { + memcpy (msg_ctxt_id, msgctxt, msgctxt_len - 1); + msg_ctxt_id[msgctxt_len - 1] = '\004'; + memcpy (msg_ctxt_id + msgctxt_len, msgid, msgid_len); + translation = dcngettext (domain, msg_ctxt_id, msgid_plural, n, category); +#if !_LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS + if (msg_ctxt_id != buf) + free (msg_ctxt_id); +#endif + if (!(translation == msg_ctxt_id || translation == msgid_plural)) + return translation; + } + return (n == 1 ? msgid : msgid_plural); +} + +#endif /* _LIBGETTEXT_H */ diff --git a/src/rrd_i18n.h b/src/rrd_i18n.h index adeed37..c7ea78c 100644 --- a/src/rrd_i18n.h +++ b/src/rrd_i18n.h @@ -11,19 +11,23 @@ extern "C" { #ifndef _RRD_I18N_H #define _RRD_I18N_H -#ifndef _ -/* This is for other GNU distributions with internationalized messages. - When compiling libc, the _ macro is predefined. */ -#if defined(HAVE_LIBINTL_H) && defined(BUILD_LIBINTL) -# include -#define _(String) gettext (String) +#ifdef ENABLE_NLS +# ifdef _LIBC +# include +# else +# include "gettext.h" +# define _(String) gettext (String) +# endif #else -#define _(String) (String) -#endif -#define N_(String) (String) +# define _(String) (String) #endif +#define N_(String) String + +#endif +#ifdef __cplusplus +} #endif #ifdef __cplusplus