Support to Lua 5.0 -- Fidelis Assis
authoroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Mon, 6 Oct 2008 05:05:19 +0000 (05:05 +0000)
committeroetiker <oetiker@a5681a0c-68f1-0310-ab6d-d61299d08faa>
Mon, 6 Oct 2008 05:05:19 +0000 (05:05 +0000)
git-svn-id: svn://svn.oetiker.ch/rrdtool/trunk/program@1579 a5681a0c-68f1-0310-ab6d-d61299d08faa

CONTRIBUTORS
bindings/Makefile.am
bindings/lua/Makefile.lua
bindings/lua/README
bindings/lua/rrdlua.c
configure.ac
doc/rrdlua.pod

index ebb76e3..8c3e4be 100644 (file)
@@ -22,6 +22,7 @@ David L. Barker <dave with ncomtech.com> xport function bug fixes
 Evan Miller <emiller with imvu.com> Multiplicative HW Enhancements
 Frank Strauss <strauss with escape.de> TCL bindings
 Florian octo Forster <rrdtool nospam.verplant.org> rrd_restore libxml2 rewrite, deprecated function export, rrdcached
+Fidelis Assis <fidelis pobox.com> lua bindings
 Henrik Storner <henrik with hswn.dk> functions for min/max values of data in graph
 Hermann Hueni <hueni with glue.ch> (SunOS porting)
 Jakob Ilves <jilves with se.oracle.com> HPUX 11
index fd0a352..f6c8d98 100644 (file)
@@ -35,7 +35,7 @@ python:
        cd python && env BUILDLIBDIR=../../src/.libs $(PYTHON) setup.py build_ext --rpath=$(libdir) && env LIBDIR=../../src/.libs $(PYTHON) setup.py build
 
 lua:
-       cd lua && $(LUA) Makefile.lua "PREFIX=$(prefix) POD2MAN=$(POD2MAN) LUABIN=$(LUA) $(LUA_MAKE_OPTIONS)" > Makefile && $(MAKE)
+       cd lua && $(LUA) Makefile.lua > Makefile && $(MAKE)
 
 # rules for building the perl module
 perl_piped: perl-piped/Makefile
index 08be1cc..6d68cea 100644 (file)
@@ -1,82 +1,47 @@
--- min version
-local min_major, min_minor = 5, 1
-local major, minor = string.match(_VERSION, 'Lua (%d+)\.(%d*)')
-
-if (tonumber(major)  < min_major or
-    tonumber(major) == min_major and tonumber(minor) < min_minor) then
-  error(string.format(
-       '\n\n*** Lua rrdtool module requires Lua %d.%d or greater. ***\n',
-       min_major, min_minor))
-  os.exit(1)
-end
-local lua_version = major .. '.' .. minor
 
-local options = arg[1]
-if options then
-  io.write(string.gsub(options, ' (%S-=)', '\n%1'), '\n\n')
+print(string.format('%s %s %s\n', '# Makefile generated by', _VERSION, 'from Makefile.lua.\n'))
+
+local opts = {
+  LUA                 = '/usr/bin/lua',
+  LUA_MAJOR           = '5',
+  LUA_MINOR           = '0',
+  LUA_HAVE_COMPAT51   = 'HAVE_COMPAT51',
+  LUA_RRD_LANGPREF    = '/scratch/rrd4/lib/lua',
+  LUA_CFLAGS          = '-I/usr/include//lua50  ',
+  LUA_LFLAGS          = '-llualib50 -llua50  ',
+  LUA_SRCS            = 'rrdlua.c',
+  LUA_OBJS            = 'rrdlua.o',
+  LUA_INSTALL_CMOD    = '/scratch/rrd4/lib/lua/5.0',
+  CC                  = 'gcc',
+}
+
+-- doesn't preserve key order, but it's OK
+for k, v in pairs(opts) do
+  print(string.format('%s=%s', k, v))
 end
 
-io.stdout:write([[
-T= rrd
-# Version
-LIB_VERSION=0.0.8
-LUA_VERSION=]],major, '.',minor,[[
-
-
-# set lua include, lib and C installation dirs
-PKG_CONFIG=$(firstword $(shell which pkg-config))
-ifeq (pkg-config,$(findstring pkg-config,$(PKG_CONFIG)))
-  LUA_LIBDIR=$(shell pkg-config --variable=INSTALL_CMOD lua$(LUA_VERSION))
-  ifeq (,$(LUA_LIBDIR))
-    $(warning *** couldn't find lua$(LUA_VERSION).pc)
-  else
-    LUA_CFLAGS=$(shell pkg-config --cflags lua$(LUA_VERSION) 2>/dev/null)
-    LUA_LFLAGS=$(shell pkg-config --libs lua$(LUA_VERSION) 2>/dev/null)
-  endif
-else
-  $(warning couldn't find pkg-config)
-endif
-
-ifeq (,$(LUA_LIBDIR))
-    $(warning *** setting Lua dirs to defaults in src package)
-    LUA_CFLAGS=-I/usr/local/include -I/usr/local/include/lua
-    LUA_LFLAGS=-L/usr/local/lib/lua/$(LUA_VERSION) -llua
-    LUA_LIBDIR=/usr/local/lib/lua/$(LUA_VERSION)
-endif
-
-]])
+local lua_ver = opts['LUA_MAJOR'] .. '.' .. opts['LUA_MINOR']
 
--- overwrite global LUA_LIBDIR if default lib is set
-if lib then
-  io.stdout:write([[
-# override LUA_LIBDIR for site install
-LUA_LIBDIR=]],lib,[[/$(LUA_VERSION)
-]])
-end
+print([[
 
-io.stdout:write([[
+T= rrd
+# Version
+LIB_VERSION=0.0.9
 
 # OS dependent
 LIB_EXT= .so
 
-# if this "autoconf" doesn't work for you, set LIB_OPTION for shared
-# object manually.
-LD=$(shell ld -V -o /dev/null 2>&1)
-ifneq (,$(findstring Solaris,$(LD)))
- # Solaris - tested with 2.6, gcc 2.95.3 20010315 and Solaris ld
- LIB_OPTION= -G -dy
-else
- ifneq (,$(findstring GNU,$(LD)))
-  # GNU ld
-  LIB_OPTION= -shared -dy
- else
-  $(error couldn't identify your ld. Please set the shared option manually)
- endif
-endif
-
-RRD_CFLAGS=-I../../src/
+LIBNAME= $T-$(LIB_VERSION)$(LIB_EXT)
+
+RRD_CFLAGS=-I../../src
 RRD_LIB_DIR=-L../../src/.libs -lrrd
 
+# Set shared object options to what your platform requires
+# For Solaris - tested with 2.6, gcc 2.95.3 20010315 and Solaris ld:
+# LIB_OPTION= -G -dy
+# For GNU ld:
+LIB_OPTION= -shared -dy
+
 # Choose the PIC option
 # safest, works on most systems
 PIC=-fPIC
@@ -84,15 +49,9 @@ PIC=-fPIC
 #PIC=-fpic
 
 # Compilation directives
-OPTIONS= -O3 -Wall ${PIC} -fomit-frame-pointer -pedantic-errors -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings
+OPTIONS= -O3 -Wall $(PIC) -fomit-frame-pointer -pedantic-errors -W -Waggregate-return -Wcast-align -Wmissing-prototypes -Wnested-externs -Wshadow -Wwrite-strings
 LIBS= $(RRD_LIB_DIR) $(LUA_LFLAGS) -lm
-CFLAGS= $(OPTIONS) $(LUA_CFLAGS) $(RRD_CFLAGS) -DLIB_VERSION=\"$(LIB_VERSION)\"
-#CC= gcc
-
-LIBNAME= $T-$(LIB_VERSION)$(LIB_EXT)
-
-SRCS= rrdlua.c
-OBJS= rrdlua.o
+CFLAGS= $(OPTIONS) $(LUA_CFLAGS) $(RRD_CFLAGS) -DLIB_VERSION=\"$(LIB_VERSION)\" -DLUA$(LUA_MAJOR)$(LUA_MINOR) -D$(LUA_HAVE_COMPAT51)
 
 all: $(LIBNAME)
 
@@ -100,21 +59,64 @@ lib: $(LIBNAME)
 
 *.o:   *.c
 
-$(LIBNAME): $(OBJS)
-       $(CC) $(CFLAGS) $(LIB_OPTION) $(OBJS) $(LIBS) -o $(LIBNAME)
+$(LIBNAME): $(LUA_OBJS)
+       $(CC) $(CFLAGS) $(LIB_OPTION) $(LUA_OBJS) $(LIBS) -o $(LIBNAME)
 
 install: $(LIBNAME)
-       mkdir -p $(LUA_LIBDIR)
-       cp $(LIBNAME) $(LUA_LIBDIR)
-       strip $(LUA_LIBDIR)/$(LIBNAME)
-       (cd $(LUA_LIBDIR) ; rm -f $T$(LIB_EXT) ; ln -fs $(LIBNAME) $T$(LIB_EXT))
-       $(POD2MAN) --release=$(VERSION) --center=RRDLua --section=3 rrdlua.pod > $(PREFIX)/man/man3/rrdlua.3
+       mkdir -p $(LUA_INSTALL_CMOD)
+       cp $(LIBNAME) $(LUA_INSTALL_CMOD)
+       #strip $(LUA_INSTALL_CMOD)/$(LIBNAME)
+       (cd $(LUA_INSTALL_CMOD) ; rm -f $T$(LIB_EXT) ; ln -fs $(LIBNAME) $T$(LIB_EXT))]])
+if lua_ver == '5.0' and opts['LUA_HAVE_COMPAT51'] ~= 'HAVE_COMPAT51' then
+  print([[
+       mkdir -p $(LUA_RRD_LANGPREF)/5.0
+       cp compat-5.1r5/compat-5.1.lua $(LUA_RRD_LANGPREF)/5.0
+]])
+end
+
+print([[
+
+test.lua: $(LIBNAME) test.lua.bottom
+       @echo "-- Created by Makefile." > test.lua
+       @echo "-- Test script adapted from the one in the Ruby binding." > test.lua
+       @echo >> test.lua]])
+if lua_ver == '5.0' then
+  print([[
+       @echo "--- compat-5.1.lua is only required for Lua 5.0 ----------" >> test.lua]])
+
+  if opts['LUA_HAVE_COMPAT51'] ~= 'HAVE_COMPAT51' then
+    print([[
+       @echo "original_LUA_PATH = LUA_PATH" >> test.lua
+       @echo "-- try only compat-5.1.lua installed with RRDtool package" >> test.lua
+       @echo "LUA_PATH = '$(LUA_RRD_LANGPREF)/5.0/?.lua'" >> test.lua]])
+  end
+    print([[
+       @echo "local r = pcall(require, 'compat-5.1')" >> test.lua
+       @echo "if not r then" >> test.lua
+       @echo "  print('** compat-5.1.lua not found')" >> test.lua
+       @echo "  os.exit(1)" >> test.lua
+       @echo "end" >> test.lua]])
+
+  if opts['LUA_HAVE_COMPAT51'] ~= 'HAVE_COMPAT51' then
+    print([[
+       @echo "LUA_PATH = original_LUA_PATH" >> test.lua
+       @echo "original_LUA_PATH = nil" >> test.lua]])
+  end
+  print([[
+       @echo "----------------------------------------------------------" >> test.lua
+       @echo >> test.lua]])
+end
+if opts['LUA_RRD_LANGPREF'] .. '/' .. lua_ver == opts['LUA_INSTALL_CMOD'] then
+  print([[
+       @echo "package.cpath = '$(LUA_INSTALL_CMOD)/?.so;' .. package.cpath" >> test.lua]])
+end
+print([[
+       @cat test.lua.bottom >> test.lua
 
-test: $(LIBNAME)
-       ln -sf $(LIBNAME) rrd.so
-       lua test.lua
+test: test.lua
+       $(LUA) test.lua
 
 clean:
-       rm -f $L $(LIBNAME) $(OBJS) *.so *.rrd *.xml *.png *~
+       rm -f $(LIBNAME) $(LUA_OBJS) test.lua *.so *.rrd *.xml *.png *~
 ]])
 
index f1fe186..0eaaccc 100644 (file)
@@ -1,21 +1,69 @@
 RRDLua is a Lua module for RRD functions.
 
-Compiling:
+- Configuration
 
-Just run "configure" from the top RRDTool package dir and then 'make'.
-You should have lua and lua-dev packages installed before executing
-configure.
+  From the top dir of RRDtool package, run "./configure", or
+  "./configure --enable-lua-site-install" if you prefer to install it
+  in Lua's search path.
 
-Testing:
+ You should have lua and lua-dev packages installed before executing
+ configure.
 
-Enter the bindings/lua dir, run 'make test' and use your preferred
-viewer to display the just created graph 'test.png'. If you can read
-"Enjoy Lua RRDtool module!" on the picture, everything went fine.
+- Compilation and installation
 
-Installation:
+ Run 'make' and 'sudo make install'. If you don't enable lua-site-install,
+ the Lua module will be installed together with RRDtool, under the subdir
+ lib/lua/<lua_version>.
 
-Run 'make install' from the top dir of the RRDtool package. The Lua
-module will be installed in the same RRDtool installation dir,
-under the subdir lib/lua/<lua_version>.
+- Testing
 
+ Install RRDtool first, as above. Then, enter the bindings/lua dir, run
+ 'make test' and use your preferred viewer to display the just created
+ 'test.png'. If you can read "Enjoy Lua RRDtool module!" on the picture,
+ everything went fine.
+
+- Using with Lua 5.1
+
+ Start your programs with:
+
+  ---------------------------------------------------------------
+  package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.1/?.so;' ..
+                  package.cpath
+  require 'rrd'
+  ---------------------------------------------------------------
+
+ OBS: If you use the option --enable-lua-site-install you won't need
+      to change package.cpath like above. 
+
+- Using with Lua 5.0
+
+ The Lua binding for RRDtool needs the compat-5.1 module to work with
+ Lua 5.0. Some Linux distros, like Ubuntu gutsy and hardy, have it
+ already integrated in Lua 5.0 -dev packages, so you just have to
+ require:
+
+  require 'compat-5.1'
+
+ For other platforms, the compat-5.1 module that comes with this Lua
+ binding will be installed for you in the same dir where RRDtool was
+ installed, under the subdir .../lib/lua/5.0. In this case, you must
+ tell your Lua programs where to find it by changing the Lua var
+ LUA_PATH:
+
+  --- compat-5.1.lua is only necessary for Lua 5.0 ----------------
+  original_LUA_PATH = LUA_PATH
+  -- try only compat-5.1 installed with RRDtool package
+  LUA_PATH = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.lua'
+  require 'compat-5.1'
+  LUA_PATH = original_LUA_PATH
+  original_LUA_PATH = nil
+  --- end of code to require compat-5.1 ---------------------------
+
+  Now we can require the rrd module in the same way we did for 5.1 above:
+
+  ---------------------------------------------------------------
+  package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.so;' ..
+                  package.cpath
+  require 'rrd'
+  ---------------------------------------------------------------
 
index a786077..bef3e66 100644 (file)
 #include "lualib.h"
 #include "../../src/rrd_tool.h"
 
+#ifdef LUA50
+  #ifdef HAVE_COMPAT51
+    #include "compat-5.1.h"
+  #else
+    #include "compat-5.1r5/compat-5.1.h"
+  #endif
+#endif
+
 extern void rrd_freemem(void *mem);
 
 extern int luaopen_rrd (lua_State * L);
@@ -354,7 +362,12 @@ static const struct luaL_reg rrd[] = {
 int
 luaopen_rrd (lua_State * L)
 {
+#if defined LUA50
+  /* luaL_module is defined in compat-5.1.c */
+  luaL_module (L, "rrd", rrd, 0);
+#else
   luaL_register (L, "rrd", rrd);
+#endif
   set_info (L);
   return 1;
 }
index 3dcc155..a2ece2b 100644 (file)
@@ -636,45 +636,146 @@ AC_SUBST(COMP_RUBY)
 dnl Check for Lua.
 AC_PATH_PROG(LUA, lua, no)
 
-AC_ARG_ENABLE(lua,[  --disable-lua          do not build the lua modules],
+AC_ARG_ENABLE(lua,[  --disable-lua           do not build the lua modules],
 [],[enable_lua=yes])
 
-AC_MSG_CHECKING(if lua modules can be built)
-
 COMP_LUA=
-if test "x$LUA" = "xno" -o  x$enable_lua = xno; then
-  AC_MSG_RESULT(No .. Lua not found or disabled)
+if test "$LUA" = "no" -o "$enable_lua" = "no"; then
+  enable_lua=no
 else
-  for dir in /usr/include/lua /usr/include/lua5.1 /usr/local/include/lua5.1 /usr/include/lua5.2 /usr/local/include/lua5.2 ; do
-    if test -f "$dir/lualib.h" ; then
-      enable_lua=yes
-      COMP_LUA="lua"
-      break
+  AC_MSG_CHECKING(for lua >= 5.0)
+  read LUA_MAJOR LUA_MINOR LUA_POINT <<LUA_EOF
+    $($LUA -v 2>&1 | cut -f2 -d' ' | sed -e 's/\./ /g')
+LUA_EOF
+  if test 0$LUA_MAJOR -lt 5; then
+    AC_MSG_RESULT([no, version found is $LUA_MAJOR.$LUA_MINOR])
+  else
+    AC_MSG_RESULT([$LUA_MAJOR.$LUA_MINOR found])
+    vdot=$LUA_MAJOR.$LUA_MINOR
+    vndot=$LUA_MAJOR$LUA_MINOR
+    lua_version=$LUA_MAJOR.$LUA_MINOR.$LUA_POINT
+    AC_CHECK_HEADERS(lua$vndot/lua.h,
+      [AC_CHECK_HEADERS(lua$vndot/lualib.h,
+        [AC_CHECK_HEADER(lua$vndot/lauxlib.h,
+          [lua_headerdir=lua$vndot],
+          [])],
+        [])],
+      [AC_CHECK_HEADERS(lua$vdot/lua.h,
+        [AC_CHECK_HEADERS(lua$vdot/lualib.h,
+          [AC_CHECK_HEADER(lua$vdot/lauxlib.h,
+            [lua_headerdir=lua$vdot],
+            [])],
+          [])],
+        [AC_CHECK_HEADERS(lua.h,
+          [AC_CHECK_HEADERS(lualib.h,
+            [AC_CHECK_HEADER(lauxlib.h,
+              [lua_headerdir=""],
+              [lua_headerdir="no"])],
+            [])],
+          [])])])
+
+    if test "$lua_headerdir" = "no"; then
+      enable_lua=no
+    else
+      COMP_LUA=lua
     fi
-  done
 
-  if test "$COMP_LUA" = "lua" ; then
-    AC_MSG_RESULT(YES)
-  else
-    AC_MSG_RESULT(Lua found but lualib.h is missing! Install the -dev package)
-  fi
-fi
+    if test "$COMP_LUA" != "lua"; then
+      enable_lua=no
+      AC_MSG_WARN([Lua $vdot found but not lua.h, lualib.h and lauxlib.h! Please install the -dev packages for Lua $vdot])
+    else
+      # OK, headers found, let's check the libraries (LIBS is not used)
+      LIBS=
+      lua_havelib=no
+      LUA_HAVE_COMPAT51=DONT_HAVE_COMPAT51
+      AC_SEARCH_LIBS(lua_call, lua$vdot lua$vndot lua,
+        [AC_SEARCH_LIBS(luaL_register, lua$vdot lua$vndot lua,
+          [lua_havelib=LUA$vndot],
+          [AC_SEARCH_LIBS(luaL_module, lualib$vndot lualib$vdot lualib,
+            [lua_havelib=$vndot ;
+             AC_CHECK_HEADERS(lua$vndot/compat-5.1.h,
+               [LUA_HAVE_COMPAT51=HAVE_COMPAT51], [],
+                 [[#include <lua$vndot/lua.h>
+                   #include <lua$vndot/lauxlib.h> ]])],
+            [AC_SEARCH_LIBS(luaL_openlib, lualib$vdot lualib$vndot lualib,
+              [lua_havelib=$vndot],
+              [COMP_LUA=], [-lm])], [-lm])], [-lm])],
+        [COMP_LUA=], [-lm])
+      lua_libs=$LIBS
+      LIBS=
+
+      # Options to pass when configuring Lua module
+      if test  "$lua_havelib" != "no"; then
+        # OK, headers and libs found
+        # try to set lua include, lib and C installation dirs with pkg-config
+        if test "$PKGCONFIG" != "no"; then
+          if test "$vndot" = "50"; then
+            lua_pkg_prefix=lualib
+          else
+            lua_pkg_prefix=lua
+          fi
+          # try with dot, without dot and finally without version
+          for f in $lua_pkg_prefix$vdot $lua_pkg_prefix$vndot $lua_pkg_prefix; do
+            lua_cflags=$($PKGCONFIG --cflags $f 2>/dev/null)
+            if test "$lua_cflags" != ""; then
+              # OK, found CFLAGS. Get Lua LFLAGS and lib install dir
+              LUA_CFLAGS=$lua_cflags
+              LUA_LFLAGS=$($PKGCONFIG --libs $f)
+              LUA_INSTALL_CMOD=$($PKGCONFIG --variable=INSTALL_CMOD $f)
+              break
+            fi
+          done
+        fi
 
-dnl pass additional lua options
-# if lua-site-install is set, don't set 'LIB' and let Lua setup decide
-# the best place.
-AC_ARG_ENABLE(lua-site-install,
-[  --enable-lua-site-install   by default the rrdtool lua modules are installed
-                          together with rrdtool in $prefix/lib/lua. You have to
-                          add $prefix/lib/lua/$lua_version/?.so to package.cpath
-                          for lua to find the rrd.so file.]. When you set this
-                         option the Lua module will get installed wherever
-                          your Lua setup thinks it is best.],
-[LUA_MAKE_OPTIONS=],[LUA_MAKE_OPTIONS="LIB=$langpref/lib/lua"])
+        # if not set with pkg-config, use default values in src package
+        if test "$LUA_CFLAGS" = ""; then
+          AC_MSG_WARN(Setting Lua include and lib dirs to defaults in src package)
+          LUA_CFLAGS="-I/usr/local/include -I/usr/local/include/lua -I/usr/local/include/lua/$vdot"
+          LUA_LFLAGS="-L/usr/local/lib -L/usr/local/lib/lua -L/usr/local/lib/lua/$vdot $lua_libs"
+          LUA_INSTALL_CMOD="/usr/local/lib/lua/$vdot"
+        fi
+        LUA_SRCS=rrdlua.c
+        LUA_OBJS=rrdlua.o
+        # If Lua 5.0, we need compat-5.1. Add ours unless already
+        # integrated as in Debian/Ubuntu 5.0 -dev packages.
+        if test "$vdot" = "5.0" -a "$LUA_HAVE_COMPAT51" != "HAVE_COMPAT51"; then
+          LUA_SRCS="rrdlua.c compat-5.1r5/compat-5.1.c"
+          LUA_OBJS="rrdlua.o compat-5.1r5/compat-5.1.o"
+        fi
 
-AC_SUBST(LUA_MAKE_OPTIONS)
-AC_SUBST(LUA)
-AC_SUBST(COMP_LUA)
+        dnl pass additional lua options
+        # if lua-site-install is not set, overwrite LUA_INSTALL_CMOD already
+        # found and install together with RRDtool, under $langpref.
+        LUA_RRD_LANGPREF="$langpref/lib/lua"
+        AC_ARG_ENABLE(lua-site-install,
+        [  --enable-lua-site-install   by default the rrdtool lua modules are installed
+                                  together with rrdtool in $prefix/lib/lua. You have to
+                                  add $prefix/lib/lua/$lua_version/?.so to package.cpath
+                                  for lua to find the rrd.so file. When you set this
+                                  option the Lua module will get installed wherever
+                                  your Lua setup thinks it is best.],
+        [],
+        [LUA_INSTALL_CMOD="$LUA_RRD_LANGPREF/$vdot"])
+
+        AC_SUBST(LUA)
+        AC_SUBST(COMP_LUA)
+        AC_SUBST(LUA_MAJOR)
+        AC_SUBST(LUA_MINOR)
+        AC_SUBST(LUA_POINT)
+        AC_SUBST(LUA_RRD_LANGPREF)
+        AC_SUBST(LUA_INSTALL_CMOD)
+        AC_SUBST(LUA_HAVE_COMPAT51)
+        AC_SUBST(LUA_CFLAGS)
+        AC_SUBST(LUA_LFLAGS)
+        AC_SUBST(LUA_SRCS)
+        AC_SUBST(LUA_OBJS)
+      else
+        enable_lua=no
+        AC_MSG_RESULT([Lua headers found but not the libraries! Please reinstall the dev packages for Lua $LUA_MAJOR.$LUA_MINOR])
+      fi
+    fi
+  fi
+fi
 
 
 enable_tcl_site=no
@@ -773,6 +874,7 @@ AC_CONFIG_FILES([bindings/Makefile])
 AC_CONFIG_FILES([bindings/tcl/Makefile])
 AC_CONFIG_FILES([bindings/tcl/ifOctets.tcl])
 AC_CONFIG_FILES([Makefile])          
+AC_CONFIG_FILES([bindings/lua/Makefile.lua])
 
 AC_CONFIG_COMMANDS([default],[[ chmod +x examples/*.pl]],[[]])
 AC_OUTPUT
@@ -805,9 +907,10 @@ echo "          Perl Options: $PERL_MAKE_OPTIONS"
 echo "          Ruby Modules: $COMP_RUBY"
 echo "           Ruby Binary: $RUBY"
 echo "          Ruby Options: $RUBY_MAKE_OPTIONS"
-echo "           Lua Modules: $COMP_LUA"
+echo "    Build Lua Bindings: $enable_lua"
 echo "            Lua Binary: $LUA"
-echo "           Lua Options: $LUA_MAKE_OPTIONS"
+echo "           Lua Version: $lua_version"
+echo "        Lua module dir: $LUA_INSTALL_CMOD"
 echo "    Build Tcl Bindings: $enable_tcl"
 echo " Build Python Bindings: $enable_python"
 echo "          Build rrdcgi: $enable_rrdcgi"
index a6240f2..7d234fe 100644 (file)
@@ -27,43 +27,104 @@ This module accesses RRDtool functionality directly from within Lua.
 The arguments to the functions listed in the SYNOPSIS are explained in
 the regular RRDtool documentation. The command-line call
 
-  rrdtool update mydemo.rrd --template in:out N:12:13
+    rrdtool update mydemo.rrd --template in:out N:12:13
 
 gets turned into
 
-  rrd.update ("mydemo.rrd", "--template", "in:out", "N:12:13")
-
-Note that
-
-  --template=in:out is also valid.
+    rrd.update ("mydemo.rrd", "--template", "in:out", "N:12:13")
+
+Note that --template=in:out is also valid.
+
+=head2 Using with Lua 5.1
+
+Start your programs with:
+
+    ---------------------------------------------------------------
+    package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.1/?.so;' ..
+                    package.cpath
+    require 'rrd'
+    ---------------------------------------------------------------
+   
+OBS: If you configured with --enable-lua-site-install, you don't need
+to set package.cpath like above.
+
+=head2 Using with Lua 5.0
+
+The Lua binding for RRDtool needs the Lua module compat-5.1 to work with
+Lua 5.0. Some Linux distros, like Ubuntu gutsy and hardy, have it already
+integrated in Lua 5.0 -dev packages, so you just have to require it:
+
+    require 'compat-5.1'
+
+For other platforms, the compat-5.1 module that comes with this binding
+will be installed for you in the same dir where RRDtool was installed,
+under the subdir .../lib/lua/5.0. In this case, you must tell your Lua
+programs where to find it by changing the Lua var LUA_PATH:
+
+    -- compat-5.1.lua is only necessary for Lua 5.0 ----------------
+    -- try only compat-5.1 installed with RRDtool package
+    local original_LUA_PATH = LUA_PATH
+    LUA_PATH = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.lua'
+    require 'compat-5.1'
+    LUA_PATH = original_LUA_PATH
+    original_LUA_PATH = nil
+    --- end of code to require compat-5.1 ---------------------------
+    
+    Now we can require the rrd module in the same way we did for 5.1 above:
+    
+    ---------------------------------------------------------------
+    package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.so;' ..
+                    package.cpath
+    require 'rrd'
+    ---------------------------------------------------------------
 
 =head2 Error Handling
 
 The Lua RRDTool module functions will abort your program with a stack
 traceback when they can not make sense out of the arguments you fed them.
-
-  Ex:
-
-  -- If the Lua RRDTool module was installed together with RRDTool,
-  -- in $prefix/lib/lua/$lua_version, package.cpath must be set like
-  -- in the example below, so that 'require' can find the module:
-
-  package.cpath = '/usr/local/rrdtool-1.3.3/lib/lua/5.1/?.so;' ..
-                  package.cpath
-  local rrd = require 'rrd'
-  rrd.update ("mydemo.rrd","N:12:13")
-
-  $ lua t.lua
-
-  lua: t.lua:8: opening 'mydemo.rrd': No such file or directory
-  stack traceback:
-          [C]: in function 'update'
-          t.lua:8: in main chunk
-          [C]: ?
-
-You may capture and handle the errors yourself, instead of just letting
-the program abort, by calling the module functions through Lua protected
-calls - 'pcall' or 'xpcall'.
+However, you can capture and handle the errors yourself, instead of just
+letting the program abort, by calling the module functions through Lua
+protected calls - 'pcall' or 'xpcall'.
+
+     Ex: program t.lua
+      
+     --- compat-5.1.lua is only necessary for Lua 5.0 ----------------
+     -- uncomment below if your distro has not compat-5.1
+     -- original_LUA_PATH = LUA_PATH
+     -- try only compat-5.1.lua installed with RRDtool package
+     -- LUA_PATH = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.lua'
+      
+     -- here we use a protected call to require compat-5.1
+     local r = pcall(require, 'compat-5.1')
+     if not r then
+       print('** could not load compat-5.1.lua')
+       os.exit(1)
+     end
+     
+     -- uncomment below if your distro has not compat-5.1
+     -- LUA_PATH = original_LUA_PATH
+     -- original_LUA_PATH = nil
+     --- end of code to require compat-5.1 ---------------------------
+     
+     -- If the Lua RRDTool module was installed together with RRDTool,
+     -- in /usr/local/rrdtool-1.3.2/lib/lua/5.0, package.cpath must be
+     -- set accordingly so that 'require' can find the module:
+    
+     package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.so;' ..
+                     package.cpath
+      
+     local rrd = require 'rrd'
+     rrd.update ("mydemo.rrd","N:12:13")
+     
+If we execute the program above we'll get:
+
+     $ lua t.lua
+      
+     lua: t.lua:27: opening 'mydemo.rrd': No such file or directory
+     stack traceback:
+           [C]: in function `update'
+           t.lua:27: in main chunk
+           [C]: ?
 
 =head2 Return Values
 
@@ -74,26 +135,26 @@ B<rrd.first> returns a single INTEGER representing the timestamp of the
 first data sample in an RRA within an RRD file. Example returning the
 first timestamp of the third RRA (index 2):
 
-  local firstdate = rrd.first('example.rrd', '--rraindex', 2)
+     local firstdate = rrd.first('example.rrd', '--rraindex', 2)
 
 B<rrd.last> returns a single INTEGER representing the last update time.
 
-  local lastupdate = rrd.last('example.rrd')
+     local lastupdate = rrd.last('example.rrd')
 
 B<rrd.graph> returns the x-size and y-size of the created image and a table
 with the results of the PRINT arguments.
 
-  local xsize, ysize, averages = rrd.graph ...
-  print(string.format("Image size: %dx%d", xsize, ysize)
-  print("Averages: ", table.concat(averages, ', '))
+     local xsize, ysize, averages = rrd.graph ...
+     print(string.format("Image size: %dx%d", xsize, ysize)
+     print("Averages: ", table.concat(averages, ', '))
 
 B<rrd.info> returns a table where the keys and the values represent property
 names and property values of the RRD.
 
-  local info = rrd.info("test.rrd")
-  for key, value in pairs(info) do
-    print(key, ' = ', value)
-  end
+     local info = rrd.info("test.rrd")
+     for key, value in pairs(info) do
+       print(key, ' = ', value)
+     end
 
 B<rrd.graphv> takes the same parameters as rrd.graph but it returns a table
 only. The table returned contains meta information about the graph, like
@@ -111,27 +172,33 @@ returns 5 values: the initial timestamp, the step, two parallel arrays
 containing the data source names and their data points respectively, and
 the final timestamp.
 
-  package.cpath = '/usr/local/rrdtool-1.3.3/lib/lua/5.1/?.so;' ..
-                   package.cpath
-  local rrd = require "rrd"
-  local first, last = rrd.first("test.rrd"), rrd.last("test.rrd")
-  local start, step, names, data =
-    rrd.fetch("test.rrd", "--start", first, "--end", last, "AVERAGE")
-  io.write(string.format("Start:       %s (%d)\n",
-                         os.date("%c", start),start))
-  io.write("Step size:   ", step, " seconds\n")
-  io.write("DS names:    ", table.concat(names, ', '), "\n")
-  io.write("Data points: ", #data[1], "\n")
-  io.write("Data:\n")
-  for i,dp in ipairs(data) do
-    io.write(os.date("%t", start), " (", start, "): ")
-    start = start + step
-    for j,v in ipairs(dp) do
-      io.write(v, " ")
-    end
-  io.write("\n")
-  end
+     --require compat-5.1 if necessary
+    
+     package.cpath = '/usr/local/rrdtool-1.3.2/lib/lua/5.0/?.so;' ..
+                     package.cpath
+    
+     local rrd = require "rrd"
+     local first, last = rrd.first("test.rrd"), rrd.last("test.rrd")
+     local start, step, names, data =
+       rrd.fetch("test.rrd", "--start", first, "--end", last, "AVERAGE")
+     io.write(string.format("Start:       %s (%d)\n",
+                            os.date("%c", start),start))
+     io.write("Step size:   ", step, " seconds\n")
+     io.write("DS names:    ", table.concat(names, ', '), "\n")
+     io.write("Data points: ", #data[1], "\n")
+     io.write("Data:\n")
+     for i,dp in ipairs(data) do
+       io.write(os.date("%t", start), " (", start, "): ")
+       start = start + step
+       for j,v in ipairs(dp) do
+         io.write(v, " ")
+       end
+     io.write("\n")
+     end
 
 =head1 AUTHOR
 
 Fidelis Assis E<lt>fidelis@pobox.comE<gt>
+
+
+