Deploying stand-alone applications on Windows
Friday, November 23, 2007
Everybody loves Microsoft and Windows, and Steve Ballmer is probably the greatest man alive, so for me, a solid Windows port of Factor is a high priority.
The major blocker to getting the deploy tool working on Windows was the
lack of <process-stream>
support. Doug had some incomplete code
written for this earlier. By looking at his code together with the
Twisted
Python
implementation of the same feature, I was able to get it working. The
trick is that Windows only supports blocking reads/writes on anonymous
pipes, so one has to use named pipes (and resort to stupid tricks like
naming them using a random number/milliseconds to ensure uniqueness),
which do support non-blocking I/O via completion ports.
So, here is an example. We wish to deploy the Tetris demo, so we type this in the listener:
"tetris" deploy-tool
This opens a window:
Now, we click “Deploy”. This spawns a new Factor process which
bootstraps and tree shakes a tetris image, dumping output into the
current listener window (this is where <process-stream>
comes in).
After a few minutes, we get a “Tetris” directory which has everything we
need:
Note the FreeType files and DLLs; they will go away as soon as we ditch
FreeType and start using native font rendering APIs (real soon now), so
in the future all you’ll have is the executable, the image file, and
factor-nt.dll
. Double-clicking the executable runs the program:
Now the raptor icon is nice and all, but eventually we’ll also have a
way to specify custom icons for deployment, on both Mac OS X and
Windows.
The completion of the Windows <process-stream>
implementation marks a
milestone in Factor development. The Windows I/O subsystem has now
reached feature parity with the Unix side. This means Factor now offers
high-level, cross-platform APIs for the following tasks:
- Creating, renaming, copying, deleting files and directories
- Reading and writing files sequentially
- Memory mapped files
- TCP/IP sockets
- UDP/IP sockets
- IPv4 and IPv6 addressing, host name lookups
- Launching processes
- Launching processes with redirected I/O
Where possible, all I/O is non-blocking (the user-level API is presented as a blocking stream API, however under the hood Factor’s co-operative thread scheduler yields between threads while waiting on I/O).
On Windows CE, the I/O support is spotty. Windows CE doesn’t support pipes or non-blocking I/O, so certain features are not implemented, but we try the best we can.
Factor has an awesome FFI and now it has an awesome I/O library, which will still gain additional features in the future, for example Doug is already working on Windows directory change notification and I’ll be doing the Unix side of that soon. A small step for Factor, a giant leap for stack languages!