#!/bin/sh # This script writes to stdout, a single source file (e.g. jimsh0.c) # which can be compiled to provide a bootstrap version of jimsh. # e.g. cc -o jimsh0 jimsh0.c makeext() { source="$1" basename=`basename "$source" .tcl` cat <<EOF int Jim_${basename}Init(Jim_Interp *interp) { if (Jim_PackageProvide(interp, "$basename", "1.0", JIM_ERRMSG)) return JIM_ERR; return Jim_EvalSource(interp, "$source", 1, EOF # Note: Keep newlines so that line numbers match in error messages sed -e 's/^[ ]*#.*//' -e 's@\\@\\\\@g' -e 's@"@\\"@g' -e 's@^\(.*\)$@"\1\\n"@' $source echo ");" echo "}" } makeloadexts() { cat <<EOF int Jim_InitStaticExtensions(Jim_Interp *interp) EOF echo "{" for ext in $*; do echo "extern int Jim_${ext}Init(Jim_Interp *);" done for ext in $*; do echo "Jim_${ext}Init(interp);" done echo "return JIM_OK;" echo "}" } cexts="aio readdir regexp file exec clock array" tclexts="bootstrap initjimsh glob stdlib tclcompat" # Note ordering allexts="bootstrap aio readdir regexp file glob exec clock array stdlib tclcompat" echo "/* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */" # define some core features for i in JIM_TCL_COMPAT JIM_ANSIC JIM_REGEXP HAVE_NO_AUTOCONF _JIMAUTOCONF_H; do echo "#define $i" done echo '#define TCL_LIBRARY "."' # and extensions for i in $allexts; do echo "#define jim_ext_$i" done cat <<EOF #if defined(_MSC_VER) #define TCL_PLATFORM_OS "windows" #define TCL_PLATFORM_PLATFORM "windows" #define TCL_PLATFORM_PATH_SEPARATOR ";" #define HAVE_MKDIR_ONE_ARG #define HAVE_SYSTEM #elif defined(__MINGW32__) #define TCL_PLATFORM_OS "mingw" #define TCL_PLATFORM_PLATFORM "windows" #define TCL_PLATFORM_PATH_SEPARATOR ";" #define HAVE_MKDIR_ONE_ARG #define HAVE_SYSTEM #define HAVE_SYS_TIME_H #define HAVE_DIRENT_H #define HAVE_UNISTD_H #define HAVE_UMASK #include <sys/stat.h> #ifndef S_IRWXG #define S_IRWXG 0 #endif #ifndef S_IRWXO #define S_IRWXO 0 #endif #else #define TCL_PLATFORM_OS "unknown" #define TCL_PLATFORM_PLATFORM "unix" #define TCL_PLATFORM_PATH_SEPARATOR ":" #ifdef _MINIX #define vfork fork #define _POSIX_SOURCE #else #define _GNU_SOURCE #endif #define HAVE_VFORK #define HAVE_WAITPID #define HAVE_ISATTY #define HAVE_MKSTEMP #define HAVE_LINK #define HAVE_SYS_TIME_H #define HAVE_DIRENT_H #define HAVE_UNISTD_H #define HAVE_UMASK #endif EOF # get JIM_VERSION from auto.def sed -n -e 's/^\(define JIM_VERSION.*\)/#\1/p' auto.def outputsource() { sed -e '/#include.*jim/d' -e '/#include.*utf8/d' \ -e '/^#.*if.*JIM_BOOTSTRAP/,/^#endif.*JIM_BOOTSTRAP/d' \ -e 's/[ ]*\/\*.*\*\///' -e '/^[ ]*\/\*/,/\*\//d' $1 } # Now output header files, removing references to jim header files for i in jim-win32compat.h utf8.h jim.h jim-subcmd.h jimregexp.h jim-signal.h jimiocompat.h; do outputsource $i done # Now extension source code for i in $tclexts; do makeext $i.tcl done for i in $cexts; do outputsource jim-$i.c done makeloadexts $allexts # And finally the core source code for i in jim.c jim-subcmd.c utf8.c jim-format.c jimregexp.c jimiocompat.c jim-win32compat.c jim-nosignal.c; do outputsource $i done echo "#ifndef JIM_BOOTSTRAP_LIB_ONLY" outputsource jim-interactive.c outputsource jimsh.c echo "#endif"