Index: LICENSE ================================================================== --- LICENSE +++ LICENSE @@ -3,10 +3,11 @@ kitsh/buildsrc/kitsh-0.0/kitInit.c kitsh/buildsrc/kitsh-0.0/license.terms kitsh/buildsrc/kitsh-0.0/pwb.c kitsh/buildsrc/kitsh-0.0/rechan.c kitsh/buildsrc/kitsh-0.0/zlib.c + kitsh/buildsrc/kitsh-0.0/winMain.c Please see "kitsh/buildsrc/kitsh-0.0/license.terms" for licensing information regarding these files. All others are licensed under the terms of the MIT License, below: Index: README ================================================================== --- README +++ README @@ -65,10 +65,14 @@ 3. TCLKIT Specify the path to a Tclkit that is runnable on the current system. The default is "tclkit". A working tclkit is required for cross-compiling Tclkits. + 4. STATICTK + Specify this as "1" to statically link to Tk. The default + action on most platforms is to dynamically link to Tk. + ------------------- Method of Operation ------------------- Index: build/make-kit-win32 ================================================================== --- build/make-kit-win32 +++ build/make-kit-win32 @@ -1,10 +1,10 @@ #! /bin/sh AR=i586-mingw32msvc-ar -CC='i586-mingw32msvc-gcc -I/home/rkeene/root/windows-i386/include -L/home/rkeene/root/windows-i386/lib' -CXX='i586-mingw32msvc-g++ -I/home/rkeene/root/windows-i386/include -L/home/rkeene/root/windows-i386/lib' +CC=i586-mingw32msvc-gcc +CXX=i586-mingw32msvc-g++ RANLIB=i586-mingw32msvc-ranlib RC=i586-mingw32msvc-windres export AR CC CXX RANLIB RC -./kitcreator --host=i586-mingw32msvc +./kitcreator "$@" --host=i586-mingw32msvc --with-zlib=/home/rkeene/root/windows-i386 Index: kitsh/buildsrc/kitsh-0.0/Makefile.in ================================================================== --- kitsh/buildsrc/kitsh-0.0/Makefile.in +++ kitsh/buildsrc/kitsh-0.0/Makefile.in @@ -1,12 +1,12 @@ CC = @CC@ -CFLAGS = @CFLAGS@ @DEFS@ -DSTDC_HEADERS=1 -CPPFLAGS = @CPPFLAGS@ @DEFS@ -DSTDC_HEADERS=1 +CFLAGS = @CFLAGS@ @DEFS@ -DSTDC_HEADERS=1 -DTK_LOCAL_APPINIT=TclKit_AppInit +CPPFLAGS = @CPPFLAGS@ @DEFS@ -DSTDC_HEADERS=1 -DTK_LOCAL_APPINIT=TclKit_AppInit LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ ARCHS = @ARCHS@ -OBJS = kitInit.o main.o pwb.o rechan.o zlib.o +OBJS = kitInit.o main.o pwb.o rechan.o zlib.o winMain.o all: kit kit: $(OBJS) $(ARCHS) $(CC) $(CPPFLAGS) $(CFLAGS) -o kit $(OBJS) $(ARCHS) $(LDFLAGS) $(LIBS) Index: kitsh/buildsrc/kitsh-0.0/aclocal.m4 ================================================================== --- kitsh/buildsrc/kitsh-0.0/aclocal.m4 +++ kitsh/buildsrc/kitsh-0.0/aclocal.m4 @@ -4,32 +4,40 @@ with_tcl="auto" ]) if test "${with_tcl}" = "auto"; then for dir in `echo "${PATH}" | sed 's@:@ @g'`; do + if test -f "${dir}/tclConfig.sh"; then + tclconfigshdir="${dir}" + tclconfigsh="${tclconfigshdir}/tclConfig.sh" + break + fi if test -f "${dir}/../lib/tclConfig.sh"; then - tclconfigsh="${dir}/../lib/tclConfig.sh" + tclconfigshdir="${dir}/../lib" + tclconfigsh="${tclconfigshdir}/tclConfig.sh" break fi if test -f "${dir}/../lib64/tclConfig.sh"; then - tclconfigsh="${dir}/../lib64/tclConfig.sh" + tclconfigshdir="${dir}/../lib64" + tclconfigsh="${tclconfigshdir}/tclConfig.sh" break fi done if test -z "${tclconfigsh}"; then AC_MSG_ERROR([Unable to find tclConfig.sh]) fi else - tclconfigsh="${with_tcl}/tclConfig.sh" + tclconfigshdir="${with_tcl}" + tclconfigsh="${tclconfigshdir}/tclConfig.sh" fi if test -f "${tclconfigsh}"; then source "${tclconfigsh}" - CFLAGS="${CFLAGS} ${TCL_INCLUDE_SPEC} -I${TCL_SRC_DIR}/generic -I${TCL_SRC_DIR}/unix" - CPPFLAGS="${CPPFLAGS} ${TCL_INCLUDE_SPEC} -I${TCL_SRC_DIR}/generic -I${TCL_SRC_DIR}/unix" + CFLAGS="${CFLAGS} ${TCL_INCLUDE_SPEC} -I${TCL_SRC_DIR}/generic -I${tclconfigshdir}" + CPPFLAGS="${CPPFLAGS} ${TCL_INCLUDE_SPEC} -I${TCL_SRC_DIR}/generic -I${tclconfigshdir}" LDFLAGS="${LDFLAGS}" LIBS="${LIBS} ${TCL_LIBS}" fi AC_SUBST(CFLAGS) @@ -37,10 +45,60 @@ AC_SUBST(LDFLAGS) AC_SUBST(LIBS) AC_MSG_RESULT([$tclconfigsh]) ]) + +AC_DEFUN(DC_DO_TK, [ + AC_MSG_CHECKING([path to tk]) + AC_ARG_WITH(tk, AC_HELP_STRING([--with-tk], [directory containing tk configuration (tkConfig.sh)]), [], [ + with_tk="auto" + ]) + + if test "${with_tk}" = "auto"; then + for dir in ../../../tk/build/tk*/*/ `echo "${PATH}" | sed 's@:@ @g'`; do + if test -f "${dir}/tkConfig.sh"; then + tkconfigshdir="${dir}" + tkconfigsh="${tkconfigshdir}/tkConfig.sh" + break + fi + if test -f "${dir}/../lib/tkConfig.sh"; then + tkconfigshdir="${dir}/../lib" + tkconfigsh="${tkconfigshdir}/tkConfig.sh" + break + fi + if test -f "${dir}/../lib64/tkConfig.sh"; then + tkconfigshdir="${dir}/../lib64" + tkconfigsh="${tkconfigshdir}/tkConfig.sh" + break + fi + done + + if test -z "${tkconfigsh}"; then + AC_MSG_ERROR([Unable to find tkConfig.sh]) + fi + else + tkconfigshdir="${with_tk}" + tkconfigsh="${tkconfigshdir}/tkConfig.sh" + fi + + if test -f "${tkconfigsh}"; then + source "${tkconfigsh}" + + CFLAGS="${CFLAGS} ${TK_INCLUDE_SPEC} -I${TK_SRC_DIR}/generic -I${tkconfigshdir}" + CPPFLAGS="${CPPFLAGS} ${TK_INCLUDE_SPEC} -I${TK_SRC_DIR}/generic -I${tkconfigshdir}" + LDFLAGS="${LDFLAGS}" + LIBS="${LIBS} ${TK_LIBS}" + fi + + AC_SUBST(CFLAGS) + AC_SUBST(CPPFLAGS) + AC_SUBST(LDFLAGS) + AC_SUBST(LIBS) + + AC_MSG_RESULT([$tkconfigsh]) +]) AC_DEFUN(DC_DO_STATIC_LINK_LIBCXX, [ AC_MSG_CHECKING([for how to statically link to libstdc++]) SAVELIBS="${LIBS}" @@ -60,25 +118,35 @@ AC_SUBST(LIBS) ]) AC_DEFUN(DC_FIND_TCLKIT_LIBS, [ + DC_SETUP_TCL_PLAT_DEFS - for proj in mk4tcl tcl tclvfs; do + for proj in mk4tcl tcl tclvfs tk; do AC_MSG_CHECKING([for libraries required for ${proj}]) libdir="../../../${proj}/inst" - libfiles="`find "${libdir}" -name '*.a' | tr "\n" ' '`" + libfiles="`find "${libdir}" -name '*.a' | grep -v 'stub' | tr "\n" ' '`" ARCHS="${ARCHS} ${libfiles}" AC_MSG_RESULT([${libfiles}]) if test "${libfiles}" != ""; then if test "${proj}" = "mk4tcl"; then AC_DEFINE(KIT_INCLUDES_MK4TCL, [1], [Specify this if you link against mkt4tcl]) DC_DO_STATIC_LINK_LIBCXX + fi + if test "${proj}" = "tk"; then + DC_DO_TK + AC_DEFINE(KIT_INCLUDES_TK, [1], [Specify this if we link statically to Tk]) + + if test "$host_os" = "mingw32msvc"; then + AC_DEFINE(KITSH_NEED_WINMAIN, [1], [Define if you need WinMain (Windows)]) + CFLAGS="${CFLAGS} -mwindows" + fi fi fi done AC_SUBST(ARCHS) @@ -96,11 +164,12 @@ dnl If we are building for Win32, we need to define "BUILD_tcl" so that dnl TCL_STORAGE_CLASS gets defined as DLLEXPORT, to make static linking dnl work AC_DEFINE(BUILD_tcl, [1], [Define if you need to pretend to be building Tcl (Windows)]) + AC_DEFINE(BUILD_tk, [1], [Define if you need to pretend to be building Tk (Windows)]) ;; cygwin*) CFLAGS="${CFLAGS} -mms-bitfields" ;; esac -]) +]) Index: kitsh/buildsrc/kitsh-0.0/configure.ac ================================================================== --- kitsh/buildsrc/kitsh-0.0/configure.ac +++ kitsh/buildsrc/kitsh-0.0/configure.ac @@ -7,26 +7,29 @@ AC_PROG_INSTALL AC_AIX AC_GNU_SOURCE dnl Find the appropriate libraries to link to -AC_SEARCH_LIBS(inflate, z zlib,, [ AC_MSG_WARN([Couldn't find inflate (normally in zlib)!]) ]) AC_SEARCH_LIBS(acos, m,, [ AC_MSG_WARN([Couldn't find acos (normally in libm)!]) ]) AC_SEARCH_LIBS(dlsym, dl,, [ AC_MSG_WARN([Couldn't find dlsym (normally in libdl)!]) ]) dnl Find the appropriate Tcl headers and libraries DC_DO_TCL dnl Find archives we need to link to DC_FIND_TCLKIT_LIBS -dnl Find any platform specific defines that we need to make -DC_SETUP_TCL_PLAT_DEFS - dnl Determine if we have "Tcl_SetStartupScript" (8.6.x) or "TclSetStartupScriptPath" (8.4.x) SAVE_LIBS="${LIBS}" LIBS="${ARCHS} ${LIBS}" AC_CHECK_FUNCS(Tcl_SetStartupScript TclSetStartupScriptPath) LIBS="${SAVE_LIBS}" +dnl Find zlib +AC_ARG_WITH(zlib, AC_HELP_STRING([--with-zlib], [directory containing zlib]), [ + CFLAGS="${CFLAGS} -I${with_zlib}/include -I${with_zlib}" + LDFLAGS="${CFLAGS} -L${with_zlib}/lib -L${with_zlib}" +]) +AC_SEARCH_LIBS(inflate, z zlib,, [ AC_MSG_WARN([Couldn't find inflate (normally in zlib)!]) ]) + dnl Produce output AC_OUTPUT(Makefile) Index: kitsh/buildsrc/kitsh-0.0/main.c ================================================================== --- kitsh/buildsrc/kitsh-0.0/main.c +++ kitsh/buildsrc/kitsh-0.0/main.c @@ -1,5 +1,6 @@ +#ifndef KITSH_NEED_WINMAIN #include int TclKit_AppInit(Tcl_Interp *interp); int main(int argc, char **argv) { @@ -9,5 +10,6 @@ Tcl_Main(argc, argv, TclKit_AppInit); return(0); } +#endif ADDED kitsh/buildsrc/kitsh-0.0/winMain.c Index: kitsh/buildsrc/kitsh-0.0/winMain.c ================================================================== --- kitsh/buildsrc/kitsh-0.0/winMain.c +++ kitsh/buildsrc/kitsh-0.0/winMain.c @@ -0,0 +1,430 @@ +#ifdef KITSH_NEED_WINMAIN +/* + * winMain.c -- + * + * Main entry point for wish and other Tk-based applications. + * + * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * Copyright (c) 1998-1999 by Scriptics Corporation. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * RCS: @(#) $Id: winMain.c 1629 2007-06-09 13:59:31Z jcw $ + */ + +#include +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN +#include + +#ifndef UNDER_CE +#include +#endif + +/* + * The following declarations refer to internal Tk routines. These + * interfaces are available for use, but are not supported. + */ + + +/* + * Forward declarations for procedures defined later in this file: + */ + +static void setargv _ANSI_ARGS_((int *argcPtr, char ***argvPtr)); +static Tcl_PanicProc WishPanic; + +#ifdef TK_TEST +extern int Tktest_Init(Tcl_Interp *interp); +#endif /* TK_TEST */ + +static BOOL consoleRequired = TRUE; + +/* + * The following #if block allows you to change the AppInit + * function by using a #define of TCL_LOCAL_APPINIT instead + * of rewriting this entire file. The #if checks for that + * #define and uses Tcl_AppInit if it doesn't exist. + */ + +#ifndef TK_LOCAL_APPINIT +#define TK_LOCAL_APPINIT Tcl_AppInit +#endif +extern int TK_LOCAL_APPINIT _ANSI_ARGS_((Tcl_Interp *interp)); + +/* + * The following #if block allows you to change how Tcl finds the startup + * script, prime the library or encoding paths, fiddle with the argv, + * etc., without needing to rewrite Tk_Main() + */ + +#ifdef TK_LOCAL_MAIN_HOOK +extern int TK_LOCAL_MAIN_HOOK _ANSI_ARGS_((int *argc, char ***argv)); +#endif + + +/* + *---------------------------------------------------------------------- + * + * WinMain -- + * + * Main entry point from Windows. + * + * Results: + * Returns false if initialization fails, otherwise it never + * returns. + * + * Side effects: + * Just about anything, since from here we call arbitrary Tcl code. + * + *---------------------------------------------------------------------- + */ + +int APIENTRY +#ifdef UNDER_CE +wWinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow) +#else +WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow) +#endif + HINSTANCE hInstance; + HINSTANCE hPrevInstance; + LPSTR lpszCmdLine; + int nCmdShow; +{ + char **argv; + int argc; +#ifndef UNDER_CE + char buffer[MAX_PATH+1]; + char *p; +#endif + +#ifdef UNDER_CE + nCmdShow = SW_SHOWNORMAL; + + XCEShowWaitCursor(); + + xceinit(lpszCmdLine); + argc = __xceargc; + argv = __xceargv; +#endif + + Tcl_SetPanicProc(WishPanic); + + /* + * Create the console channels and install them as the standard + * channels. All I/O will be discarded until Tk_CreateConsoleWindow is + * called to attach the console to a text widget. + */ + + consoleRequired = TRUE; + + /* + * Set up the default locale to be standard "C" locale so parsing + * is performed correctly. + */ + +#ifndef UNDER_CE + setlocale(LC_ALL, "C"); + setargv(&argc, &argv); + + /* + * Replace argv[0] with full pathname of executable, and forward + * slashes substituted for backslashes. + */ + + GetModuleFileName(NULL, buffer, sizeof(buffer)); + argv[0] = buffer; + for (p = buffer; *p != '\0'; p++) { + if (*p == '\\') { + *p = '/'; + } + } +#endif + +#ifdef TK_LOCAL_MAIN_HOOK + TK_LOCAL_MAIN_HOOK(&argc, &argv); +#endif + + Tk_Main(argc, argv, TK_LOCAL_APPINIT); + return 1; +} + + +/* + *---------------------------------------------------------------------- + * + * Tcl_AppInit -- + * + * This procedure performs application-specific initialization. + * Most applications, especially those that incorporate additional + * packages, will have their own version of this procedure. + * + * Results: + * Returns a standard Tcl completion code, and leaves an error + * message in the interp's result if an error occurs. + * + * Side effects: + * Depends on the startup script. + * + *---------------------------------------------------------------------- + */ + +int +Tcl_AppInit(interp) + Tcl_Interp *interp; /* Interpreter for application. */ +{ + if (Tcl_Init(interp) == TCL_ERROR) { + goto error; + } + if (Tk_Init(interp) == TCL_ERROR) { + goto error; + } + Tcl_StaticPackage(interp, "Tk", Tk_Init, Tk_SafeInit); + + /* + * Initialize the console only if we are running as an interactive + * application. + */ + +#ifdef UNDER_CE + consoleRequired = FALSE; +#endif + + if (consoleRequired) { + if (Tk_CreateConsoleWindow(interp) == TCL_ERROR) { + goto error; + } + } +#if defined(STATIC_BUILD) && defined(TCL_USE_STATIC_PACKAGES) + { + extern Tcl_PackageInitProc Registry_Init; + extern Tcl_PackageInitProc Dde_Init; + + if (Registry_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + Tcl_StaticPackage(interp, "registry", Registry_Init, NULL); + + if (Dde_Init(interp) == TCL_ERROR) { + return TCL_ERROR; + } + Tcl_StaticPackage(interp, "dde", Dde_Init, NULL); + } +#endif + +#ifdef TK_TEST + if (Tktest_Init(interp) == TCL_ERROR) { + goto error; + } + Tcl_StaticPackage(interp, "Tktest", Tktest_Init, + (Tcl_PackageInitProc *) NULL); +#endif /* TK_TEST */ + + Tcl_SetVar(interp, "tcl_rcFileName", "~/wishrc.tcl", TCL_GLOBAL_ONLY); + return TCL_OK; + +error: + MessageBeep(MB_ICONEXCLAMATION); + MessageBox(NULL, Tcl_GetStringResult(interp), "Error in Wish", + MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND); + ExitProcess(1); + /* we won't reach this, but we need the return */ + return TCL_ERROR; +} + +/* + *---------------------------------------------------------------------- + * + * WishPanic -- + * + * Display a message and exit. + * + * Results: + * None. + * + * Side effects: + * Exits the program. + * + *---------------------------------------------------------------------- + */ + +void +WishPanic TCL_VARARGS_DEF(CONST char *,arg1) +{ + va_list argList; + char buf[1024]; + CONST char *format; + + format = TCL_VARARGS_START(CONST char *,arg1,argList); + vsprintf(buf, format, argList); + + MessageBeep(MB_ICONEXCLAMATION); + MessageBox(NULL, buf, "Fatal Error in Wish", + MB_ICONSTOP | MB_OK | MB_TASKMODAL | MB_SETFOREGROUND); +#ifdef _MSC_VER + DebugBreak(); +#endif + ExitProcess(1); +} +/* + *------------------------------------------------------------------------- + * + * setargv -- + * + * Parse the Windows command line string into argc/argv. Done here + * because we don't trust the builtin argument parser in crt0. + * Windows applications are responsible for breaking their command + * line into arguments. + * + * 2N backslashes + quote -> N backslashes + begin quoted string + * 2N + 1 backslashes + quote -> literal + * N backslashes + non-quote -> literal + * quote + quote in a quoted string -> single quote + * quote + quote not in quoted string -> empty string + * quote -> begin quoted string + * + * Results: + * Fills argcPtr with the number of arguments and argvPtr with the + * array of arguments. + * + * Side effects: + * Memory allocated. + * + *-------------------------------------------------------------------------- + */ + +static void +setargv(argcPtr, argvPtr) + int *argcPtr; /* Filled with number of argument strings. */ + char ***argvPtr; /* Filled with argument strings (malloc'd). */ +{ + char *cmdLine, *p, *arg, *argSpace; + char **argv; + int argc, size, inquote, copy, slashes; + + cmdLine = GetCommandLine(); /* INTL: BUG */ + + /* + * Precompute an overly pessimistic guess at the number of arguments + * in the command line by counting non-space spans. + */ + + size = 2; + for (p = cmdLine; *p != '\0'; p++) { + if ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ + size++; + while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ + p++; + } + if (*p == '\0') { + break; + } + } + } + argSpace = (char *) Tcl_Alloc( + (unsigned) (size * sizeof(char *) + strlen(cmdLine) + 1)); + argv = (char **) argSpace; + argSpace += size * sizeof(char *); + size--; + + p = cmdLine; + for (argc = 0; argc < size; argc++) { + argv[argc] = arg = argSpace; + while ((*p == ' ') || (*p == '\t')) { /* INTL: ISO space. */ + p++; + } + if (*p == '\0') { + break; + } + + inquote = 0; + slashes = 0; + while (1) { + copy = 1; + while (*p == '\\') { + slashes++; + p++; + } + if (*p == '"') { + if ((slashes & 1) == 0) { + copy = 0; + if ((inquote) && (p[1] == '"')) { + p++; + copy = 1; + } else { + inquote = !inquote; + } + } + slashes >>= 1; + } + + while (slashes) { + *arg = '\\'; + arg++; + slashes--; + } + + if ((*p == '\0') + || (!inquote && ((*p == ' ') || (*p == '\t')))) { /* INTL: ISO space. */ + break; + } + if (copy != 0) { + *arg = *p; + arg++; + } + p++; + } + *arg = '\0'; + argSpace = arg + 1; + } + argv[argc] = NULL; + + *argcPtr = argc; + *argvPtr = argv; +} + +#if !defined(__GNUC__) || defined(TK_TEST) +/* + *---------------------------------------------------------------------- + * + * main -- + * + * Main entry point from the console. + * + * Results: + * None: Tk_Main never returns here, so this procedure never + * returns either. + * + * Side effects: + * Whatever the applications does. + * + *---------------------------------------------------------------------- + */ + +int main(int argc, char **argv) +{ + Tcl_SetPanicProc(WishPanic); + + /* + * Set up the default locale to be standard "C" locale so parsing + * is performed correctly. + */ +#ifndef UNDER_CE + setlocale(LC_ALL, "C"); +#endif + + /* + * Create the console channels and install them as the standard + * channels. All I/O will be discarded until Tk_CreateConsoleWindow is + * called to attach the console to a text widget. + */ + + consoleRequired = FALSE; + + Tk_Main(argc, argv, Tcl_AppInit); + return 0; +} +#endif /* !__GNUC__ || TK_TEST */ +#endif