From 8016c1d53332b9ad2af8e49482f7848648995a89 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Wed, 20 Oct 2010 10:55:07 +1000 Subject: 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 --- configure.ac | 328 +++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 209 insertions(+), 119 deletions(-) (limited to 'configure.ac') 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 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) -- cgit v1.1