A shortcut for CriTcl builds C extensions on-the-fly The name stands for Compiled Runtime In Tcl.
Tcl 2002 conference paper by Steve Landers and Jean-Claude Wippler is now at [L1 ], with slides from JCW's presentation at [L2 ].
Below are some simple how-to examples.
Using inlined C code
lappend auto_path . package require critcl critcl::cproc triple {int i} int { return i * 3; /* this is C code */ } puts "three times 123 is [triple 123]"
tclkit three.tcl
Building an extension for general use
package provide four 1.0 package require critcl critcl::cproc quadruple {int i} int { return i * 4; /* this is C code */ }
cd /path/where/four.tcl/lives/ tclkit /path/to/critcl -pkg four.tcl and the result is: Source: four.tcl Library: four.so Package: /path/where/four.tcl/lives/lib/four
lappend auto_path lib package require four puts "four times 123 is [quadruple 123]"
Cross compiling using Xmingwin
CriTcl supports cross compiling libraries and packages for Windows on Linux/Unix using the Xmingwin cross-compiler (based on mingw - http://www.mingw.org ).
$ cat /usr/local/bin/cross PATH=/usr/local/Xmingwin/i386-mingw32msvc/bin:$PATH export PATH exec $@
$ cross critcl -pkg four.tcl Cross compiling for Windows using Xmingwin Source: four.tcl Library: four.dll Package: /path/to/four/lib/four
tcl_platform(byteOrder) = littleEndian tcl_platform(machine) = intel tcl_platform(os) = Windows NT tcl_platform(osVersion) = 5.0 tcl_platform(platform) = windows tcl_platform(wordSize) = 4
For an example, download http://mini.net/sdarchive/critex.tar.gz , unload and change to the ex2/ directory. This contains a blowfish extension for Tcl. To build on Linux/Unix, run
$ critcl -pkg blowfish Source: blowfish.tcl Library: blowfish.so Package: /path/to/ex2/lib/blowfish
Then, to cross compile (via the above cross script) run
$ cross critcl -pkg blowfish Cross compiling for Windows using Xmingwin Source: blowfish.tcl Library: blowfish.dll Package: /path/to/ex2/lib/blowfish
If you look under ex2/lib/blowfish you'll see
lib/blowfish lib/blowfish/critcl.tcl lib/blowfish/pkgIndex.tcl lib/blowfish/Windows-x86 lib/blowfish/Windows-x86/critcl.tcl lib/blowfish/Windows-x86/blowfish.dll lib/blowfish/Linux-x86 lib/blowfish/Linux-x86/critcl.tcl lib/blowfish/Linux-x86/blowfish.so
The pkgIndex.tcl will autoload the correct binary for a particular platform.
Sep 2002 - Critcl sources are now in CVS (pw empty, so no login needed):
cvs -d :pserver:[email protected]:/home/cvs -z3 co critcl
To create a starkit from it, also do:
ln -s critcl critcl.vfs sdx wrap critcl.kit
-jcw
Discussion below moved from Scripted Compiler to the more natural place.
AM Because of Critcl I am working on a package that abstracts the concept of a compiler and a linker away from the platform-dependencies. This way Critcl will be able to support "any" compiler/linker without the user (or the Critcl programmer) having to jump through hoops.
Vince That sounds great!
Victor Without linker ?? How then I use gcc produced *.o or archives ? That is Critcl libs should take this place. Are they encrypted ? And it is still a long way to have it accepted by many people.
NEM There is Babel, by Paul Duffin. However, like Feather, it may take a while to get hold of any code from Paul.
"How to use C and Tcl Together" [L6 ] presents Critcl [CriTcl] as a profoundly important innovation.
escargo 11/11/2002: I got a 404 on this link. IDG Me too.
The link is up and functional now - AK.
escargo 12/5/2002: I see a table of contents, but no link to an article. Is it expected that the link above lead to the article itself?
Critcl makes a brief appearance in this [L7 ] column on XMingwin.
UKo How can I inject code into the package initialisation section? This is necessary to build new canvas commands or new sound subcommands for Snack.
AM There is a command cinit that allows you to do this.