The Tcl Package User Guide describes how to obtain, manage, and use Tcl packages
In the most elementary case, using a package is a matter of directly employing the load or source command to make the code in some file available to Tcl. This can be seen in the following examples:
Typically, however, packages are distributed such that they can be loaded via the package command. In a nutshell, just make sure $auto_path contains the directories or parent directories (one level up) that should be searched for pkgIndex.tcl files, which in turn contain the package ifneeded commands to either source or load the files necessary to provide requested packages. If the default $auto_path value isn't doing the job, try augmenting it with the TCLLIBPATH environment variable, which is a Tcl list, not ; or :-separated values.
Files that end in .tm, are Tcl modules, and are found by a different mechanism. There is no environment variable like $auto_path for these. Instead, use the commands ::tcl::tm::path add, ::tcl::tm::path remove, and::tcl::tm::path list. The environment variables TCLX_Y_TM_PATH, where X is the Tcl major version, and Y is the Tcl minor version, are also detected, and are a sequence of pathnames delimited by ; (windows) or : (unix).
See also:
Most packages use the TEA template, so it's a matter of doing
./configure make make install
The most common variant on this is to specify a certain tclConfig.sh
./configure --with-tcl=/pathname/of/tclConfig.sh make make install
If installing to some alternate prefix, the current behaviour of the TEA template requires that --exec-prefix is also specified.
./configure --with-tcl=/pathname/of/tclConfig.sh --prefix=/pathname/of/my/bin_directory --exec-prefix=/pathname/of/my/bin_directory make make install
And that's usually all there is to it!
If you are on Windows, then chances are you are using ActiveTcl, in which case you want
teacup install some_package
Or to get a list of available packages
teacup list
See also:
proc packages {} { # returns the list of presently loaded packages set res {} foreach i [package names] { if {[string length [package provide $i]]} { lappend res $i } } set res } ;# RS
LV Is there a way to modify this packages proc so that it also reports the version of the package that was loaded?
Lars H: Yes, simply change the
lappend res $i
line to
lappend res $i [package provide $i]
RS 2006-01-29: Here's a package version retriever that returns a list, which can be put into a dict or array:
proc packages {{pattern *}} { catch {package require ""} set res {} foreach p [lsort [package names]] { if [string match $pattern $p] { lappend res $p [package versions $p] } } set res }
Incidentally, packages Tcl and ActiveTcl report {} at package versions, seen on 8.4.5 and 8.4.12. At least the former could do the same as what info patchlevel does... Tk says 8.4 at least, but there are many precedents of packaging reporting 3-part version numbers, Mk4tcl even does four: 2.4.9.2. Test:
% foreach {p v} [packages T*] {puts "$p : $v"} Tcl : TclScript : 1.0 Tclx : 8.4 Tk : 8.4 Tkhtml : 2.0 Tktable : 2.8 Tkx : 8.3 Trf : 2.1
See also Tcl modules for possibly new alternatives to packages. Then there is kitten, which is an example of storing packages in a single starkit which is easier to ship around.