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.
UKo It isn't in the critcl wikit, is it? Where can I find an up-to-date reference? Or do I have to RTSL (Read the source Luke!)
AM I can send you the (informal) documentation I wrote ... just drop me a mail
29apr03 jcw - Here's a trick to make a file work both as Tcl script and as C source:
#if 0 package provide mypkg 1 package require critcl critcl::ccode { #endif #ifndef _TCL #include <stdio.h> /* etc ... */ #endif /* C code here ... */ #ifndef _TCL int main(int argc, char** argv) { /* standalone code here ... */ } #endif #if 0 } critcl::cproc proc1 {int v} int { return cdef1(v); } critcl::cproc proc2 {char* s} int { return cdef2(s); } #endif /* vim: set ft=c: */
That last line makes the "vi" editor colorize the file as C code, which is presumably the bulk.
The idea is that you can embed large chunks of C in Tcl, with some trivial cproc definitions at the end calling that code, while keeping the file in a form which can also be #include'd in non-Tcl environments, e.g. building code as Tcl extension *and* as a plain C application.
The other way to do this is to us "critcl::csources somefile.c" and then to store all C code there, but this stops Critcl from auto-detecting source changes made to such an external file, so its automatic recompile won't kick in. With the above approach, you can edit at will and Critcl will compile (only) when needed, while you get Tcl's context, say for running test suites. The end result can then be used in non-Tcl contexts.
Jean-Claude was aware of Perl's Inline [...] but not (?) of Python's Weave [...] in his design of Critcl.