aboutsummaryrefslogtreecommitdiff
path: root/configure.ac
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-10-20 10:55:07 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-30 20:07:28 +1000
commit8016c1d53332b9ad2af8e49482f7848648995a89 (patch)
treee45d82799d638cdfcc2020e7cc05131b60049384 /configure.ac
parentbbd43ee01fce3a2b5284154c50dfc9994c913a29 (diff)
downloadjimtcl-8016c1d53332b9ad2af8e49482f7848648995a89.zip
jimtcl-8016c1d53332b9ad2af8e49482f7848648995a89.tar.gz
jimtcl-8016c1d53332b9ad2af8e49482f7848648995a89.tar.bz2
Allow extensions to be built/installed as modules
This includes C extensions and Tcl extensions Also adds windows support (mingw32 and cygwin) Now the sqlite*, readline and win32 extensions are supported Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'configure.ac')
-rwxr-xr-xconfigure.ac328
1 files changed, 209 insertions, 119 deletions
diff --git a/configure.ac b/configure.ac
index 202aa41..b8b1705 100755
--- a/configure.ac
+++ b/configure.ac
@@ -12,52 +12,90 @@ AC_PROG_MAKE_SET
# Checks for types
AC_CHECK_TYPES(long long, AC_SUBST(DEFINE_HAVE_LONG_LONG,["#define HAVE_LONG_LONG 1"]),AC_SUBST(DEFINE_HAVE_LONG_LONG,["#undef HAVE_LONG_LONG"]))
-# Shared library support. Because we don't believe in automake!
AC_CANONICAL_HOST
+
+iswin=no
+# Shared library support. Because we don't believe in automake!
case $host in
*-*-darwin*)
- AC_SUBST(SH_CFLAGS,-dynamic)
- AC_SUBST(SH_LDFLAGS,"-dynamiclib -undefined suppress -flat_namespace");;
+ AC_SUBST(SH_CFLAGS,-dynamic)
+ AC_SUBST(SH_LDFLAGS,"-dynamiclib -undefined suppress -flat_namespace")
+ AC_SUBST(SHOBJ_CFLAGS,"-dynamic -fno-common")
+ AC_SUBST(SHOBJ_LDFLAGS,"-bundle -undefined dynamic_lookup -flat_namespace")
+ ;;
+*-*-ming*)
+ # Use the built-in dlopen wrapper
+ have_dlopen=yes
+ iswin=yes
+ AC_SUBST(SHOBJ_LDFLAGS,-shared)
+ AC_SUBST(SH_LDFLAGS,-shared)
+ ;;
+*-*-cygwin)
+ iswin=yes
+ AC_SUBST(SHOBJ_LDFLAGS,-shared)
+ AC_SUBST(SH_LDFLAGS,-shared)
+ ;;
*)
- AC_SUBST(SH_CFLAGS,-fPIC)
- AC_SUBST(SH_LDFLAGS,-shared);;
+ # Generic Unix settings
+ AC_SUBST(LINKFLAGS,-rdynamic)
+ AC_SUBST(SH_CFLAGS,-fPIC)
+ AC_SUBST(SH_LDFLAGS,-shared)
+ AC_SUBST(SHOBJ_CFLAGS,-fPIC)
+ AC_SUBST(SHOBJ_LDFLAGS,"-shared -nostartfiles")
+ ;;
esac
if test -n "$host_alias"; then
- AC_SUBST(CROSS,$host_alias-)
+ AC_SUBST(CROSS,$host_alias-)
fi
AC_ARG_ENABLE(fork,
- [ --disable-fork do not use fork (no exec, etc.)],
- [
- if test "x$enableval" = "xno" ; then
- AC_MSG_RESULT(* disabling fork)
- EXTRA_CFLAGS="-DJIM_NOFORK"
- fi
- ],
+ [ --disable-fork do not use fork (no exec, etc.)],
+ [
+ if test "x$enableval" = "xno" ; then
+ AC_MSG_RESULT(* disabling fork)
+ EXTRA_CFLAGS="-DJIM_NOFORK"
+ fi
+ ],
)
AC_ARG_ENABLE(math,
- [ --enable-math include support for math functions],
- [
- if test "x$enableval" = "xyes" ; then
- EXTRA_CFLAGS="$EXTRA_CFLAGS -DJIM_MATH_FUNCTIONS"
- fi
- ]
+ [ --enable-math include support for math functions],
+ [
+ if test "x$enableval" = "xyes" ; then
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -DJIM_MATH_FUNCTIONS"
+ fi
+ ]
)
AC_ARG_ENABLE(ipv6,
- [ --enable-ipv6 include ipv6 support in the aio extension],
- [
- if test "x$enableval" = "xyes" ; then
- EXTRA_CFLAGS="$EXTRA_CFLAGS -DJIM_IPV6"
- fi
- ]
+ [ --enable-ipv6 include ipv6 support in the aio extension],
+ [
+ if test "x$enableval" = "xyes" ; then
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -DJIM_IPV6"
+ fi
+ ]
)
+# Is $1 in list $2?
+in_list()
+{
+ echo "$2" | tr ' ' '\n' | grep "^$1\$" >/dev/null
+}
+
+# Tcl extensions
+ext_tcl="stdlib glob tclcompat tree rlprompt"
+# C extensions
+ext_c="load package readdir array clock exec file posix regexp signal aio bio eventloop syslog nvp readline sqlite sqlite3 win32"
+
+# Tcl extensions which can be modules
+ext_tcl_mod="glob tree rlprompt"
+# C extensions which can be modules
+ext_c_mod="readdir array clock file posix regexp bio syslog readline sqlite sqlite3 win32"
+
# All extensions
-ext_all=$(echo stdlib load package readdir glob array clock exec file posix regexp signal tclcompat aio bio eventloop syslog nvp tree | tr ' ' '\n' | sort)
+ext_all="$ext_c $ext_tcl"
-# Default extensions
-ext_default=$(echo stdlib load package readdir glob array clock exec file posix regexp signal tclcompat aio eventloop syslog | tr ' ' '\n' | sort)
+# Default static extensions
+ext_default="stdlib load package readdir glob array clock exec file posix regexp signal tclcompat aio eventloop syslog"
AC_ARG_WITH(jim-ext,
[ --with-jim-ext="ext1 ext2 ..."
@@ -87,6 +125,11 @@ AC_ARG_WITH(jim-ext,
bio - Binary I/O, mostly for bio copy/file copy
nvp - Name-value pairs C-only API
tree - Similar to tcllib ::struct::tree using references
+ readline - Interface to libreadline
+ rlprompt - Tcl wrapper around the readline extension
+ sqlite - Interface to sqlite
+ sqlite3 - Interface to sqlite3
+ win32 - Interface to win32
])
AC_ARG_WITH(out-jim-ext,
[ --with-out-jim-ext="default|ext1 ext2 ..."
@@ -94,79 +137,62 @@ AC_ARG_WITH(out-jim-ext,
Specify jim extensions to exclude.
If 'default' is given, the default extensions will not be added.
])
+AC_ARG_WITH(jim-extmod,
+[ --with-jim-extmod="ext1 ext2 ..."
+
+ Specify jim extensions to build as separate modules (either C or Tcl).
+ Note that not all extensions can be built as loadable modules.
+])
if test "$with_out_jim_ext" = "default"; then
- # but we always include stdlib
- ext_default=stdlib
- with_out_jim_ext=
+ # but we always include stdlib
+ ext_default=stdlib
+ with_out_jim_ext=
fi
# Check valid extension names
-for i in $with_jim_ext $with_out_jim_ext; do
- echo "$ext_all" | grep "^$i\$" >/dev/null || AC_MSG_ERROR([Unknown extension: $i])
+for i in $with_jim_ext $with_out_jim_ext $with_jim_extmod; do
+ in_list "$i" "$ext_all" || AC_MSG_ERROR([Unknown extension: $i])
done
JIM_LIBTYPE=static
AC_ARG_WITH(jim-shared,
- [ --with-jim-shared build a shared library instead of a static library],
- [
- if test "x$withval" = "xyes" ; then
- JIM_LIBTYPE=shared
- fi
- ]
+ [ --with-jim-shared build a shared library instead of a static library],
+ [
+ if test "x$withval" = "xyes" ; then
+ JIM_LIBTYPE=shared
+ fi
+ ]
)
AC_SUBST(JIM_LIBTYPE,$JIM_LIBTYPE)
-AC_CHECK_HEADERS([sys/un.h])
+AC_CHECK_HEADERS([sys/un.h dlfcn.h])
AC_CHECK_FUNCS([ualarm sysinfo lstat fork vfork])
AC_CHECK_FUNCS([backtrace geteuid mkstemp realpath strptime])
AC_CHECK_FUNCS([regcomp waitpid sigaction sys_signame sys_siglist])
AC_CHECK_FUNCS([syslog opendir readlink sleep usleep pipe inet_ntop getaddrinfo])
-AC_SEARCH_LIBS(dlopen, dl,
- AC_SUBST(LIBDL,${ac_cv_search_dlopen%none required})
- AC_DEFINE([HAVE_DLOPEN],[1],[Have the dlopen function])
-)
+dnl XXX: Don't need to search for libs if the corresponding extensions aren't enabled
+AC_SEARCH_LIBS(dlopen, dl, have_dlopen=yes; AC_DEFINE([HAVE_DLOPEN],[1],[Have the dlopen function]))
+AC_SEARCH_LIBS(readline, readline, AC_DEFINE([HAVE_READLINE],[1],[Have libreadline]))
+AC_SEARCH_LIBS(sqlite_open, sqlite, AC_DEFINE([HAVE_SQLITE],[1],[Have libsqlite]))
+AC_SEARCH_LIBS(sqlite3_open, sqlite3, AC_DEFINE([HAVE_SQLITE3],[1],[Have libsqlite3]))
-dnl AC_SEARCH_LIBS doesn't work for mingw, so check for winsock.h instead
-AC_CHECK_HEADER(winsock.h,[AC_SUBST(LIBSOCK,-lwsock32)],
- AC_SEARCH_LIBS(socket, socket,
- AC_SUBST(LIBSOCK,${ac_cv_search_socket%none required})
- )
-)
+AC_SEARCH_LIBS(socket, socket)
-dnl Look for environ alternatives. Possibility #1: is environ in unistd.h?
-AC_MSG_CHECKING([for environ in unistd.h])
+dnl Look for environ. If it is declared in unistd, no need to declare it
+AC_MSG_CHECKING([environ declared in unistd.h?])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
#define _GNU_SOURCE
#include <unistd.h>
int main(int argc, char **argv) { char **ep = environ; }
]])], [
AC_MSG_RESULT([yes])
- has_environ=yes
- ], [
- AC_MSG_RESULT([no])
-
- # Possibility #2: can environ be found in an available library?
- AC_MSG_CHECKING([for extern environ])
- AC_LINK_IFELSE([
- AC_LANG_SOURCE([[
-extern char **environ;
-int main(int argc, char **argv) { char **ep = environ; }
- ]])
- ], [
- AC_DEFINE(NEED_ENVIRON_EXTERN, [1], [Must declare 'environ' to use it.])
- has_environ=yes
- ], [
- has_environ=no
- ])
- AC_MSG_RESULT([${has_environ}])
-])
-
-if test "${has_environ}" != "yes" ; then
- AC_MSG_FAILURE([Could find 'environ' in unistd.h or available libraries.])
-fi
+ AC_DEFINE(NO_ENVIRON_EXTERN, [1], [No need to declare extern 'environ'.])
+ ],
+ AC_MSG_RESULT([no])
+)
# Now that we know what the platform supports:
@@ -175,64 +201,128 @@ fi
# - Otherwise, check to see if it's pre-requisites are met
# - If yes, add it if it is enabled or is a default
# - If no, error if it is enabled, or do nothing otherwise
+# - Modules may be either C or Tcl
needs_regexp="ac_cv_func_regcomp"
needs_syslog="ac_cv_func_syslog"
needs_exec="ac_cv_func_vfork"
+needs_readdir="ac_cv_func_opendir"
+dep_glob="readdir"
needs_posix="ac_cv_func_waitpid"
-needs_load="ac_cv_search_dlopen"
+needs_load="have_dlopen"
needs_signal="ac_cv_func_sigaction ac_cv_func_vfork"
-needs_readdir="ac_cv_func_opendir"
+needs_readline="ac_cv_search_readline"
+dep_rlprompt="readline"
+needs_sqlite="ac_cv_search_sqlite_open"
+needs_sqlite3="ac_cv_search_sqlite3_open"
+needs_win32="iswin"
+
+# First handle dependencies. If an extension is enabled, also enable its dependency
+for i in $ext_default $with_jim_ext; do
+ in_list "$i" "$with_out_jim_ext" && continue
+ eval "dep=\$dep_$i"
+ test -z "$dep" && continue
+ with_jim_ext="$with_jim_ext $dep"
+done
+for i in $with_jim_extmod; do
+ eval "dep=\$dep_$i"
+ dnl Theoretically, a mod could depend upon something which must be static
+ test -z "$dep" && continue
+ dnl If already configured static, don't make it a module
+ for d in $dep; do
+ in_list "$d" "$with_jim_ext" || with_jim_extmod="$with_jim_extmod $d"
+ done
+done
-ext_add=$(echo $with_jim_ext | tr ' ' '\n')
-ext_del=$(echo $with_out_jim_ext | tr ' ' '\n')
for i in $ext_all; do
- AC_MSG_CHECKING(extension $i)
- echo "$ext_del" | grep "^$i\$" >/dev/null
- if test $? -eq 0; then
- AC_MSG_RESULT(disabled)
- continue
- fi
- # Check dependencies
- eval "dep=\$needs_$i"
- met=1
- for d in $dep; do
- eval "check=\$$d"
- if test "$check" = "no" -o -z "$check" ; then
- met=0
- break
- fi
- done
- echo "$ext_add" | grep "^$i\$" >/dev/null
- if test $? -eq 0; then
- if test $met -eq 0; then
- AC_MSG_ERROR(dependencies not met)
- fi
- AC_MSG_RESULT(enabled)
- ext="$ext $i"
- continue
- fi
- echo "$ext_default" | grep "^$i\$" >/dev/null
- if test $? -eq 0; then
- if test $met -eq 0; then
- AC_MSG_RESULT(disabled (dependencies))
- continue
- fi
- AC_MSG_RESULT(enabled (default))
- ext="$ext $i"
- continue
- fi
- AC_MSG_RESULT(not enabled)
+ AC_MSG_CHECKING(extension $i)
+ # Disabled?
+ in_list "$i" "$with_out_jim_ext"
+ if test $? -eq 0; then
+ AC_MSG_RESULT(disabled)
+ continue
+ fi
+ # Check dependencies
+ eval "dep=\$needs_$i"
+ met=1
+ for d in $dep; do
+ eval "check=\$$d"
+ if test "$check" == "no" -o -z "$check" ; then
+ met=0
+ break
+ fi
+ done
+ # Selected as a module?
+ in_list "$i" "$with_jim_extmod"
+ if test $? -eq 0; then
+ in_list "$i" "$ext_tcl_mod"
+ if test $? -eq 0; then
+ dnl Easy, a Tcl module
+ AC_MSG_RESULT(tcl)
+ extmodtcl="$exmodtcl $i"
+ continue
+ fi
+ in_list "$i" "$ext_c_mod"
+ if test $? -ne 0; then
+ AC_MSG_ERROR(not a module)
+ fi
+ if test $met -eq 0; then
+ AC_MSG_ERROR(dependencies not met)
+ fi
+ AC_MSG_RESULT(module)
+ extmod="$extmod $i"
+ continue
+ fi
+ # Selected as a static extension?
+ in_list "$i" "$with_jim_ext"
+ if test $? -eq 0; then
+ if test $met -eq 0; then
+ AC_MSG_ERROR(dependencies not met)
+ fi
+ AC_MSG_RESULT(enabled)
+ ext="$ext $i"
+ continue
+ fi
+ # Enabled by default?
+ in_list "$i" "$ext_default"
+ if test $? -eq 0; then
+ if test $met -eq 0; then
+ AC_MSG_RESULT(disabled (dependencies))
+ continue
+ fi
+ AC_MSG_RESULT(enabled (default))
+ ext="$ext $i"
+ continue
+ fi
+ AC_MSG_RESULT(not enabled)
done
-
-ext=$(echo $ext | tr '\n' ' ')
-AC_MSG_RESULT(Jim extensions: $ext)
+
+AC_MSG_RESULT(Jim static extensions:$ext)
AC_SUBST(JIM_EXTENSIONS,$ext)
+if test -n "$extmod"; then
+case "$iswin,$JIM_LIBTYPE" in
+yes,static)
+ AC_MSG_FAILURE([cygwin/mingw require --with-jim-shared for dynamic modules])
+ ;;
+esac
+ AC_MSG_RESULT(Jim dynamic extensions:$extmod)
+ AC_SUBST(JIM_MOD_EXTENSIONS,$extmod)
+fi
+if test -n "$extmodtcl"; then
+ AC_MSG_RESULT(Jim Tcl extensions:$extmodtcl)
+ AC_SUBST(JIM_TCL_EXTENSIONS,$extmodtcl)
+fi
for i in $ext; do
- EXTRA_CFLAGS="$EXTRA_CFLAGS -Djim_ext_$i"
+ EXTRA_CFLAGS="$EXTRA_CFLAGS -Djim_ext_$i"
done
+if test $iswin = yes; then
+ in_list "aio" "$ext $extmod" && LIBS="$LIBS -lwsock32"
+ EXTRA_OBJS="$EXTRA_OBJS jim-win32compat.o"
+fi
+
AC_SUBST(EXTRA_CFLAGS,$EXTRA_CFLAGS)
+AC_SUBST(EXTRA_OBJS,$EXTRA_OBJS)
AC_SUBST(SRCDIR,`dirname $0`)
AC_SUBST(PLATFORM_OS,`uname -s`)
AC_SUBST(PLATFORM_PLATFORM,unix)