@@ -1,51 +1,93 @@ dnl Tcl M4 Routines + +dnl Find a runnable Tcl +AC_DEFUN([TCLEXT_FIND_TCLSH_PROG], [ + AC_CACHE_CHECK([runnable tclsh], [tcl_cv_tclsh_native_path], [ + dnl Try to find a runnable tclsh + if test -z "$TCLCONFIGPATH"; then + TCLCONFIGPATH=/dev/null/null + fi + + for try_tclsh in "$TCLSH_NATIVE" "$TCLCONFIGPATH/../bin/tclsh" \ + "$TCLCONFIGPATH/../bin/tclsh8.6" \ + "$TCLCONFIGPATH/../bin/tclsh8.5" \ + "$TCLCONFIGPATH/../bin/tclsh8.4" \ + `which tclsh 2>/dev/null` \ + `which tclsh8.6 2>/dev/null` \ + `which tclsh8.5 2>/dev/null` \ + `which tclsh8.4 2>/dev/null` \ + tclsh; do + if test -z "$try_tclsh"; then + continue + fi + if test -x "$try_tclsh"; then + if echo 'exit 0' | "$try_tclsh" 2>/dev/null >/dev/null; then + tcl_cv_tclsh_native_path="$try_tclsh" + + break + fi + fi + done + + if test "$TCLCONFIGPATH" = '/dev/null/null'; then + unset TCLCONFIGPATH + fi + ]) + + TCLSH_PROG="${tcl_cv_tclsh_native_path}" + AC_SUBST(TCLSH_PROG) +]) + dnl Must call AC_CANONICAL_HOST before calling us AC_DEFUN([TCLEXT_FIND_TCLCONFIG], [ - AC_MSG_CHECKING([for path to tclConfig.sh]) TCLCONFIGPATH="" AC_ARG_WITH([tcl], AS_HELP_STRING([--with-tcl], [directory containing tcl configuration (tclConfig.sh)]), [ if test "x$withval" = "xno"; then AC_MSG_ERROR([cant build without tcl]) fi TCLCONFIGPATH="$withval" ], [ - for dir in "/usr/$host_alias/lib" /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64; do + if test "$cross_compiling" = 'no'; then + TCLEXT_FIND_TCLSH_PROG + tclConfigCheckDir="`echo 'puts [[tcl::pkgconfig get libdir,runtime]]' | "$TCLSH_PROG" 2>/dev/null`" + else + tclConfigCheckDir=/dev/null/null + fi + + if test "$cross_compiling" = 'no'; then + dirs="/usr/$host_alias/lib /usr/lib /usr/lib64 /usr/local/lib /usr/local/lib64" + else + dirs='' + fi + + for dir in "$tclConfigCheckDir" $dirs; do if test -f "$dir/tclConfig.sh"; then TCLCONFIGPATH="$dir" break fi done ]) + AC_MSG_CHECKING([for path to tclConfig.sh]) + if test -z "$TCLCONFIGPATH"; then AC_MSG_ERROR([unable to locate tclConfig.sh. Try --with-tcl.]) fi - for try_tclsh in "$TCLCONFIGPATH/../bin/tclsh" \ - "$TCLCONFIGPATH/../bin/tclsh8.6" \ - "$TCLCONFIGPATH/../bin/tclsh8.5" \ - "$TCLCONFIGPATH/../bin/tclsh8.4" \ - `which tclsh 2>/dev/null` \ - `which tclsh8.6 2>/dev/null` \ - `which tclsh8.5 2>/dev/null` \ - `which tclsh8.4 2>/dev/null` \ - tclsh; do - if test -x "$try_tclsh"; then - break - fi - done - TCLSH_PROG="${try_tclsh}" - AC_SUBST(TCLCONFIGPATH) - AC_SUBST(TCLSH_PROG) AC_MSG_RESULT([$TCLCONFIGPATH]) + + dnl Find Tcl if we haven't already + if test -z "$TCLSH_PROG"; then + TCLEXT_FIND_TCLSH_PROG + fi ]) dnl Must define TCLCONFIGPATH before calling us (i.e., by TCLEXT_FIND_TCLCONFIG) AC_DEFUN([TCLEXT_LOAD_TCLCONFIG], [ AC_MSG_CHECKING([for working tclConfig.sh]) @@ -65,10 +107,18 @@ TCLEXT_FIND_TCLCONFIG TCLEXT_LOAD_TCLCONFIG AC_DEFINE_UNQUOTED([MODULE_SCOPE], [static], [Define how to declare a function should only be visible to the current module]) + + TCLEXT_BUILD='shared' + AC_ARG_ENABLE([static], AS_HELP_STRING([--enable-static], [enable a static build]), [ + if test "$enableval" = "yes"; then + TCLEXT_BUILD='static' + TCL_SUPPORTS_STUBS=0 + fi + ]) AC_ARG_ENABLE([stubs], AS_HELP_STRING([--disable-stubs], [disable use of Tcl stubs]), [ if test "$enableval" = "no"; then TCL_SUPPORTS_STUBS=0 else @@ -88,13 +138,24 @@ TCL_INCLUDE_SPEC="`eval echo "${TCL_INCLUDE_SPEC}"`" CFLAGS="${CFLAGS} ${TCL_INCLUDE_SPEC}" CPPFLAGS="${CPPFLAGS} ${TCL_INCLUDE_SPEC}" - DEFS="${DEFS} ${TCL_DEFS}" + TCL_DEFS_TCL_ONLY=`( + eval "set -- ${TCL_DEFS}" + for flag in "[$]@"; do + case "${flag}" in + -DTCL_*) + echo "${flag}" | sed "s/'/'\\''/g" | sed "s@^@'@;s@"'[$]'"@'@" | tr $'\n' ' ' + ;; + esac + done + )` + TCL_DEFS="${TCL_DEFS_TCL_ONLY}" + AC_SUBST(TCL_DEFS) dnl Needed for package installation TCL_PACKAGE_PATH="`echo "${TCL_PACKAGE_PATH}" | sed 's@ *$''@@' | awk '{ print [$]1 }'`" AC_SUBST(TCL_PACKAGE_PATH) AC_SUBST(LIBS) ])