We released McCLIM 0.9.2 ("Laetare Sunday" – go silly names for releases!) and SBCL 0.9.11 at the weekend.
One relatively new feature in SBCL is the ability to make executable images in a fairly straightforward manner: simply pass :executable t to sb-ext:save-lisp-and-die, and the system will attempt to dump one file that plays relatively nice with the executable loader on your given system. Since it is fair to say that there are a large number of dependencies in McCLIM, and additionally a non-dependency that is in practice needed to get windows to display on the screen, it seemed reasonable to use this executable-generating functionality to distribute a binary that could be tried out before deciding whether or not to get the source to a fair number of software projects.
So, Andreas Fuchs duly stepped up to build a binary of mcclim-0.9.2 for x86/linux, and all seemed well. However, I remembered that some people had expressed an interest in a Mac OS X binary, so I went about building one of those[*]. And all seemed well; a few things had to be changed from Andreas' binary, mostly because SBCL on x86/linux supports threading, while on ppc/darwin it has to make do with select(). However, trying the binary revealed some odd things going on: using Apple's X11.app, you would need to hit RET twice to get your input accepted: only not quite systematically: also, sometimes, the REPL's answer would only appear after a subsequent keystroke.
Amusingly, the same behaviour was far less systematic when running the same binary over an ssh-forwarded connection to an xorg server. This is perhaps not overly surprising, but it did make debugging the problem, or even identifying the proximate cause, a lot harder. Tim Moore and Juho Snellman did end up tracking it down, though: Tim worked out that read-char-no-hang was hanging, and Juho spotted an error in a recent bugfix in SBCL for listen: sometimes the system would report that data was available on a socket even when it wasn't. The difference in behaviour of the buggy binary between X servers is I think explained by a difference in double-buffering: Apple's windows are double buffered, so they never receive any Expose events, whereas xorg's aren't, and so they receive many more events in total; and a failure to respond in a timely manner to an Expose event is less noticeable than not doing anything when hitting the Return key...
The upshot is that SBCL 0.9.11 is unfortunately unsuitable for McCLIM work; however, armed with a hotfix for listen, I have made available an OS X binary of mcclim 0.9.2 for people to try: you'll need X to be running, and also to have libfreetype.dylib in /usr/X11R6/lib/.
[*] For the record, the build script ended looking like this for OS X:
(mapcar #'require
'(:asdf :clx :mcclim :mcclim-freetype
:clim-listener :clouseau :swank :clim-examples :functional-geometry))
(load "/isms/home/mas01cr/lisp/cvs/clnet/mcclim/Apps/Debugger/clim-debugger.lisp")
;;; listener fixes / demo commands
(clim:define-command-table clim-listener::demo-commands)
(clim:define-command (clim-listener::com-plot-fishes
:name "Plot Fishes with Functional Geometry"
:command-table clim-listener::demo-commands :menu t
:provide-output-destination-keyword t)
()
(functional-geometry::clim-plot functional-geometry::*fishes*))
(clim:define-command (clim-listener::com-show-demos
:name "Show McCLIM Demos"
:command-table clim-listener::demo-commands :menu t
:provide-output-destination-keyword t)
()
(clim:run-frame-top-level
(clim:make-application-frame 'clim-demo::demodemo)))
(clim:make-command-table
'clim-listener::listener
:inherit-from '(clim-listener::application-commands
clim-listener::lisp-commands
clim-listener::filesystem-commands
clim-listener::show-commands clim-listener::demo-commands)
:menu '(("Application" :menu clim-listener::application-commands)
("Lisp" :menu clim-listener::lisp-commands)
("Filesystem" :menu clim-listener::filesystem-commands)
("Show" :menu clim-listener::show-commands)
("Demos" :menu clim-listener::demo-commands))
:errorp nil)
(push (lambda ()
(setf mcclim-freetype::*freetype-font-path*
(merge-pathnames
(make-pathname :directory '(:relative "fonts"))
(make-pathname
:directory (pathname-directory sb-ext:*core-pathname*))))
(clim-listener::load-mime-types)
(clim-listener::load-mailcaps))
sb-ext:*init-hooks*)
(setf sb-ext:*invoke-debugger-hook* #'clim-debugger:debugger)
(sb-ext:save-lisp-and-die "/tmp/mcclim-listener-0.9.2/mcclim"
:executable t
:toplevel (lambda ()
(clim-listener:run-listener)
(sb-ext:quit :unix-status 0)))
