Richard Suchenwirth 2007-10-11 - Successor to Windows 3.11. Even older (three years) than Windows 98, but still going strong in some places, e.g. my ancient 200MHz 48MB box at home - where most of my many hundreds of fun projects were made...
From 8.5, W95 is no longer supported by Tcl/Tk. Here's my travelogue how I managed 8.5b1 building Tcl/Tk with MinGW and running, with only two lines of code changed :^)
Obsolete contentBuilding Tcl 8.5b1 on W95 SE almost worked... just in make install I got
Installing time zone data /bin/sh: ./tclsh85.exe: Permission denied make: *** [install-tzdata] Error 126
and a pop-up which roughly translated says
missing Export-USER32.DLL:MsgWaitForMultipleObjectsEx
So it's true when they say W95 is no longer supported... :( The sore spot is
$ grep -n MultipleObjectsEx *.c tclWinNotify.c:475: result = MsgWaitForMultipleObjectsEx(1, &tsdPtr->event, timeout,
GPS suggested to try it without the "Ex" - this lets make install come through. make test still running (hey, this old box has only 200MHz...) In fact, it seems to hang after
---- Result was: timeout {} foobarbaz timeout ---- Result should have been (exact matching): {} timeout foobarbaz timeout ==== io-6.56 FAILED
A more patient retry shows that io.test just takes very long, but ultimately terminates, and lets other tests carry on. Here's one failed test which I'm not so sure of (uppercase drive letters seem quite Win-idiomatic to me):
==== filesystem-1.38 file normalisation with volume relative FAILED ==== Contents of test case: set path "[string range [lindex $drives 0] 0 1]foo" set dir [pwd] cd [lindex $drives 1] set res [file norm $path] cd $dir set res ---- Result was: C:/foo ---- Result should have been (exact matching): c:/foo ==== filesystem-1.38 FAILED
man file normalize: "A normalized path is an absolute path which has all '../', './' removed. Also it is one which is in the ``standard'' format for the native platform. " From all I see, uppercase drive letters are Win standard...
Another one, which came twice (also as winFCmd-1.19.2), is also not clear to me:
==== winFCmd-1.13.2 TclpRenameFile: errno: ENOENT FAILED ==== Contents of test case: cleanup list [catch {testfile mv nul tf1} msg] $msg ---- Result was: 1 EACCES ---- Result should have been (exact matching): 1 ENOENT ==== winFCmd-1.13.2 FAILED
After I took winNotify.test out of the race, the test suite went through, with these statistics:
all.tcl: Total 23324 Passed 22420 Skipped 872 Failed 32
Fixing the "Ex" issue more correctly, after RTFMSDN, to
result = MsgWaitForMultipleObjects(1, &tsdPtr->event, QS_ALLINPUT, MWMO_ALERTABLE, 0);
I get
all.tcl: Total 23324 Passed 22435 Skipped 872 Failed 17
which about cuts the problems in half :^) Here's what failures remain:
==== fCmd-6.12 CopyRenameOneFile: force != 0 FAILED ==== fCmd-22.1 TclpRenameFile: rename and overwrite in a single dir FAILED ==== fCmd-22.5 TclMacCopyFile: copy and overwrite in a single dir FAILED ==== filesystem-1.38 file normalisation with volume relative FAILED ==== http-3.13 http::geturl socket leak test FAILED ==== http-4.14 http::Event FAILED ==== winDde-3.5 DDE request locally FAILED ==== winFCmd-1.13.2 TclpRenameFile: errno: ENOENT FAILED ==== winFCmd-1.19.2 TclpRenameFile: errno == ENOENT FAILED ==== winFCmd-6.10 TclpRemoveDirectory: attr == -1 FAILED ==== winFCmd-7.11 TraverseWinTree: call TraversalCopy: DOTREE_PRED FAILED ==== winFCmd-7.19 TraverseWinTree: call TraversalCopy: DOTREE_POSTD FAILED ==== winFCmd-9.2 TraversalDelete: DOTREE_F FAILED ==== winpipe-4.2 Tcl_WaitPid: return of exception codes, SIGFPE FAILED ==== winpipe-4.3 Tcl_WaitPid: return of exception codes, SIGSEGV FAILED ==== winpipe-4.4 Tcl_WaitPid: return of exception codes, SIGILL FAILED ==== winpipe-4.5 Tcl_WaitPid: return of exception codes, SIGINT FAILED
There is some strangeness here anyway: if I run some tests separately, all is well:
$ tclsh fcmd.test fcmd.test: Total 254 Passed 162 Skipped 92 Failed 0 $ tclsh winFCmd.test winFCmd.test: Total 189 Passed 56 Skipped 133 Failed 0
So another 9 of the remaining 17 failures are unclear in status. Looks like it has to do with skipping rules:
$ tclsh winDde.test winDde.test: Total 43 Passed 0 Skipped 43 Failed 0 Number of tests skipped for each constraint: 43 dde
If all tests are skipped, no wonder none fails - but why then did winDde-3.5 fail in make test? Configuring Tk went well, in make I spotted a warning:
D:\MSYS\src\tk8.5b1\win\tkWinEmbed.c:49: warning: 'EmbeddedEventProc' declared ` static' but never defined
A bigger problem was another Win symbol, which I just commented out in tkWinX.c, near the end:
/* SendInput(1, &inp, sizeof(inp)); */
After this, win85.exe does not come up, but tclsh85.exe with package require Tk does, and responds as I'd expect... So yes, there's even some hope for ninety-fivers... :^)
Not all is well, though. A canvas acts and reacts decently (exhaustively tested with Domino), while a text widget reacts to insertions from console only after touching it, and to typing in itself very sloppy. So there are still deeper problems.
Oh, and besides ActiveTcl 8.4, some things like eTcl 1.0-rc23 and tcltcc run right out of the binary box here.
peterc 2008-04-23: If you're running ActiveTcl 8.4 TDK wrapped executibles on Win95, be sure to grab the Winsock2 update [L1 ] and the Windows Common Controls update [L2 ] to resolve various errors. With ActiveTcl 8.5 TDK executibles, I haven't found a Microsoft update which resolves the missing MsgWaitForMultipleObjectsEx in USER32.DLL, but, one might exist somewhere. With the other updates in place, an ActiveTcl 8.5 TDK executible will simply fail to start (no error dialog) on Windows 95.