1 |
578 |
markom |
'\"
|
2 |
|
|
'\" Copyright (c) 1996 Sun Microsystems, Inc.
|
3 |
|
|
'\"
|
4 |
|
|
'\" See the file "license.terms" for information on usage and redistribution
|
5 |
|
|
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
6 |
|
|
'\"
|
7 |
|
|
'\" RCS: @(#) $Id: pkgMkIndex.n,v 1.1.1.1 2002-01-16 10:25:25 markom Exp $
|
8 |
|
|
'\"
|
9 |
|
|
.so man.macros
|
10 |
|
|
.TH pkg_mkIndex n 8.0 Tcl "Tcl Built-In Commands"
|
11 |
|
|
.BS
|
12 |
|
|
'\" Note: do not modify the .SH NAME line immediately below!
|
13 |
|
|
.SH NAME
|
14 |
|
|
pkg_mkIndex \- Build an index for automatic loading of packages
|
15 |
|
|
.SH SYNOPSIS
|
16 |
|
|
.nf
|
17 |
|
|
.VS 8.0.3
|
18 |
|
|
\fBpkg_mkIndex ?\fI-direct\fR? ?\fI-load pkgPat\fR? ?\fI-verbose\fR? \fIdir\fR ?\fIpattern pattern ...\fR?
|
19 |
|
|
.VE
|
20 |
|
|
.fi
|
21 |
|
|
.BE
|
22 |
|
|
|
23 |
|
|
.SH DESCRIPTION
|
24 |
|
|
.PP
|
25 |
|
|
\fBPkg_mkIndex\fR is a utility procedure that is part of the standard
|
26 |
|
|
Tcl library.
|
27 |
|
|
It is used to create index files that allow packages to be loaded
|
28 |
|
|
automatically when \fBpackage require\fR commands are executed.
|
29 |
|
|
To use \fBpkg_mkIndex\fR, follow these steps:
|
30 |
|
|
.IP [1]
|
31 |
|
|
Create the package(s).
|
32 |
|
|
Each package may consist of one or more Tcl script files or binary files.
|
33 |
|
|
Binary files must be suitable for loading with the \fBload\fR command
|
34 |
|
|
with a single argument; for example, if the file is \fBtest.so\fR it must
|
35 |
|
|
be possible to load this file with the command \fBload test.so\fR.
|
36 |
|
|
Each script file must contain a \fBpackage provide\fR command to declare
|
37 |
|
|
the package and version number, and each binary file must contain
|
38 |
|
|
a call to \fBTcl_PkgProvide\fR.
|
39 |
|
|
.IP [2]
|
40 |
|
|
Create the index by invoking \fBpkg_mkIndex\fR.
|
41 |
|
|
The \fIdir\fR argument gives the name of a directory and each
|
42 |
|
|
\fIpattern\fR argument is a \fBglob\fR-style pattern that selects
|
43 |
|
|
script or binary files in \fIdir\fR.
|
44 |
|
|
.VS 8.0.3
|
45 |
|
|
The default pattern is \fB*.tcl\fR and \fB*.[info sharedlibextension]\fR.
|
46 |
|
|
The optional switches are:
|
47 |
|
|
.TP 15
|
48 |
|
|
\fB\-direct\fR
|
49 |
|
|
The generated index
|
50 |
|
|
will manage to load the package immediately upon \fBpackage require\fR
|
51 |
|
|
instead of delaying loading until actual use of one of the commands.
|
52 |
|
|
.TP 15
|
53 |
|
|
\fB\-load \fIpkgPat\fR
|
54 |
|
|
The index process will pre-load any packages that exist in the
|
55 |
|
|
current interpreter and match \fIpkgPat\fP into the slave interpreter used to
|
56 |
|
|
generate the index. The pattern match uses string match rules.
|
57 |
|
|
See COMPLEX CASES below.
|
58 |
|
|
.TP 15
|
59 |
|
|
\fB\-verbose\fR
|
60 |
|
|
Generate output during the indexing process. Output is via
|
61 |
|
|
the \fBtclLog\fP procedure, which by default prints to stderr.
|
62 |
|
|
.TP 15
|
63 |
|
|
\fB\-\-\fR
|
64 |
|
|
End of the flags, in case \fIdir\fP begins with a dash.
|
65 |
|
|
.VE
|
66 |
|
|
.LP
|
67 |
|
|
.RS
|
68 |
|
|
\fBPkg_mkIndex\fR will create a file \fBpkgIndex.tcl\fR in \fIdir\fR
|
69 |
|
|
with package information about all the files given by the \fIpattern\fR
|
70 |
|
|
arguments.
|
71 |
|
|
It does this by loading each file into a slave
|
72 |
|
|
interpreter and seeing what packages
|
73 |
|
|
and new commands appear (this is why it is essential to have
|
74 |
|
|
\fBpackage provide\fR commands or \fBTcl_PkgProvide\fR calls
|
75 |
|
|
in the files, as described above).
|
76 |
|
|
If you have a package split among scripts and binary files,
|
77 |
|
|
or if you have dependencies among files,
|
78 |
|
|
you may have to use the \fB-load\fP option
|
79 |
|
|
or adjust the order in which \fBpkg_mkIndex\fR processes
|
80 |
|
|
the files. See COMPLEX CASES below.
|
81 |
|
|
.RE
|
82 |
|
|
.IP [3]
|
83 |
|
|
Install the package as a subdirectory of one of the directories given by
|
84 |
|
|
the \fBtcl_pkgPath\fR variable. If \fB$tcl_pkgPath\fR contains more
|
85 |
|
|
than one directory, machine-dependent packages (e.g., those that
|
86 |
|
|
contain binary shared libraries) should normally be installed
|
87 |
|
|
under the first directory and machine-independent packages (e.g.,
|
88 |
|
|
those that contain only Tcl scripts) should be installed under the
|
89 |
|
|
second directory.
|
90 |
|
|
The subdirectory should include
|
91 |
|
|
the package's script and/or binary files as well as the \fBpkgIndex.tcl\fR
|
92 |
|
|
file. As long as the package is installed as a subdirectory of a
|
93 |
|
|
directory in \fB$tcl_pkgPath\fR it will automatically be found during
|
94 |
|
|
\fBpackage require\fR commands.
|
95 |
|
|
.IP
|
96 |
|
|
If you install the package anywhere else, then you must ensure that
|
97 |
|
|
the directory containing the package is in the \fBauto_path\fR global variable
|
98 |
|
|
or an immediate subdirectory of one of the directories in \fBauto_path\fR.
|
99 |
|
|
\fBAuto_path\fR contains a list of directories that are searched
|
100 |
|
|
by both the auto-loader and the package loader; by default it
|
101 |
|
|
includes \fB$tcl_pkgPath\fR.
|
102 |
|
|
The package loader also checks all of the subdirectories of the
|
103 |
|
|
directories in \fBauto_path\fR.
|
104 |
|
|
You can add a directory to \fBauto_path\fR explicitly in your
|
105 |
|
|
application, or you can add the directory to your \fBTCLLIBPATH\fR
|
106 |
|
|
environment variable: if this environment variable is present,
|
107 |
|
|
Tcl initializes \fBauto_path\fR from it during application startup.
|
108 |
|
|
.IP [4]
|
109 |
|
|
Once the above steps have been taken, all you need to do to use a
|
110 |
|
|
package is to invoke \fBpackage require\fR.
|
111 |
|
|
For example, if versions 2.1, 2.3, and 3.1 of package \fBTest\fR
|
112 |
|
|
have been indexed by \fBpkg_mkIndex\fR, the command
|
113 |
|
|
\fBpackage require Test\fR will make version 3.1 available
|
114 |
|
|
and the command \fBpackage require \-exact Test 2.1\fR will
|
115 |
|
|
make version 2.1 available.
|
116 |
|
|
There may be many versions of a package in the various index files
|
117 |
|
|
in \fBauto_path\fR, but only one will actually be loaded in a given
|
118 |
|
|
interpreter, based on the first call to \fBpackage require\fR.
|
119 |
|
|
Different versions of a package may be loaded in different
|
120 |
|
|
interpreters.
|
121 |
|
|
|
122 |
|
|
.SH "PACKAGES AND THE AUTO-LOADER"
|
123 |
|
|
.PP
|
124 |
|
|
The package management facilities overlap somewhat with the auto-loader,
|
125 |
|
|
in that both arrange for files to be loaded on-demand.
|
126 |
|
|
However, package management is a higher-level mechanism that uses
|
127 |
|
|
the auto-loader for the last step in the loading process.
|
128 |
|
|
It is generally better to index a package with \fBpkg_mkIndex\fR
|
129 |
|
|
rather than \fBauto_mkindex\fR because the package mechanism provides
|
130 |
|
|
version control: several versions of a package can be made available
|
131 |
|
|
in the index files, with different applications using different
|
132 |
|
|
versions based on \fBpackage require\fR commands.
|
133 |
|
|
In contrast, \fBauto_mkindex\fR does not understand versions so
|
134 |
|
|
it can only handle a single version of each package.
|
135 |
|
|
It is probably not a good idea to index a given package with both
|
136 |
|
|
\fBpkg_mkIndex\fR and \fBauto_mkindex\fR.
|
137 |
|
|
If you use \fBpkg_mkIndex\fR to index a package, its commands cannot
|
138 |
|
|
be invoked until \fBpackage require\fR has been used to select a
|
139 |
|
|
version; in contrast, packages indexed with \fBauto_mkindex\fR
|
140 |
|
|
can be used immediately since there is no version control.
|
141 |
|
|
|
142 |
|
|
.SH "HOW IT WORKS"
|
143 |
|
|
.PP
|
144 |
|
|
\fBPkg_mkIndex\fR depends on the \fBpackage unknown\fR command,
|
145 |
|
|
the \fBpackage ifneeded\fR command, and the auto-loader.
|
146 |
|
|
The first time a \fBpackage require\fR command is invoked,
|
147 |
|
|
the \fBpackage unknown\fR script is invoked.
|
148 |
|
|
This is set by Tcl initialization to a script that
|
149 |
|
|
evaluates all of the \fBpkgIndex.tcl\fR files in the
|
150 |
|
|
\fBauto_path\fR.
|
151 |
|
|
The \fBpkgIndex.tcl\fR files contain \fBpackage ifneeded\fR
|
152 |
|
|
commands for each version of each available package; these commands
|
153 |
|
|
invoke \fBpackage provide\fR commands to announce the
|
154 |
|
|
availability of the package, and they setup auto-loader
|
155 |
|
|
information to load the files of the package.
|
156 |
|
|
.VS 8.0.3
|
157 |
|
|
Unless the \fI-direct\fR flag was provided when the \fBpkgIndex.tcl\fR
|
158 |
|
|
was generated,
|
159 |
|
|
.VE
|
160 |
|
|
a given file of a given version of a given package isn't
|
161 |
|
|
actually loaded until the first time one of its commands
|
162 |
|
|
is invoked.
|
163 |
|
|
Thus, after invoking \fBpackage require\fR you
|
164 |
|
|
.VS 8.0.3
|
165 |
|
|
may
|
166 |
|
|
.VE
|
167 |
|
|
not see
|
168 |
|
|
the package's commands in the interpreter, but you will be able
|
169 |
|
|
to invoke the commands and they will be auto-loaded.
|
170 |
|
|
|
171 |
|
|
.VS 8.0.3
|
172 |
|
|
.SH "DIRECT LOADING"
|
173 |
|
|
.PP
|
174 |
|
|
Some packages, for instance packages which use namespaces and export
|
175 |
|
|
commands or those which require special initialization, might select
|
176 |
|
|
that their package files be loaded immediately upon \fBpackage require\fR
|
177 |
|
|
instead of delaying the actual loading to the first use of one of the
|
178 |
|
|
package's command. This mode is enabled when generating the package
|
179 |
|
|
index by specifying the \fI-direct\fR argument.
|
180 |
|
|
.VE
|
181 |
|
|
|
182 |
|
|
.SH "COMPLEX CASES"
|
183 |
|
|
Most complex cases of dependencies among scripts
|
184 |
|
|
and binary files, and packages being split among scripts and
|
185 |
|
|
binary files are handled OK. However, you may have to adjust
|
186 |
|
|
the order in which files are processed by \fBpkg_mkIndex\fR.
|
187 |
|
|
These issues are described in detail below.
|
188 |
|
|
.PP
|
189 |
|
|
If each script or file contains one package, and packages
|
190 |
|
|
are only contained in one file, then things are easy.
|
191 |
|
|
You simply specify all files to be indexed in any order
|
192 |
|
|
with some glob patterns.
|
193 |
|
|
.PP
|
194 |
|
|
In general, it is OK for scripts to have dependencies on other
|
195 |
|
|
packages.
|
196 |
|
|
If scripts contain \fBpackage require\fP commands, these are
|
197 |
|
|
stubbed out in the interpreter used to process the scripts,
|
198 |
|
|
so these do not cause problems.
|
199 |
|
|
If scripts call into other packages in global code,
|
200 |
|
|
these calls are handled by a stub \fBunknown\fP command.
|
201 |
|
|
However, if scripts make variable references to other package's
|
202 |
|
|
variables in global code, these will cause errors. That is
|
203 |
|
|
also bad coding style.
|
204 |
|
|
.PP
|
205 |
|
|
If binary files have dependencies on other packages, things
|
206 |
|
|
can become tricky because it is not possible to stub out
|
207 |
|
|
C-level API's such as \fBTcl_PkgRequire\fP API
|
208 |
|
|
when loading a binary file.
|
209 |
|
|
For example, suppose the BLT package requires Tk, and expresses
|
210 |
|
|
this with a call to \fBTcl_PkgRequire\fP in its \fBBlt_Init\fP routine.
|
211 |
|
|
To support this, you must run \fBpkg_mkIndex\fR in an interpreter that
|
212 |
|
|
has Tk loaded. You can achieve this with the
|
213 |
|
|
\fB-load \fIpkgPat\fR option. If you specify this option,
|
214 |
|
|
\fBpkg_mkIndex\fR will load any packages listed by
|
215 |
|
|
\fBinfo loaded\fP and that match \fIpkgPat\fP
|
216 |
|
|
into the interpreter used to process files.
|
217 |
|
|
In most cases this will satisfy the \fBTcl_PkgRequire\fP calls
|
218 |
|
|
made by binary files.
|
219 |
|
|
.PP
|
220 |
|
|
If you are indexing two binary files and one depends on the other,
|
221 |
|
|
you should specify the one that has dependencies last.
|
222 |
|
|
This way the one without dependencies will get loaded and indexed,
|
223 |
|
|
and then the package it provides
|
224 |
|
|
will be available when the second file is processed.
|
225 |
|
|
You may also need to load the first package into the
|
226 |
|
|
temporary interpreter used to create the index by using
|
227 |
|
|
the \fB-load\fP flag;
|
228 |
|
|
it won't hurt to specify package patterns that are not yet loaded.
|
229 |
|
|
.PP
|
230 |
|
|
If you have a package that is split across scripts and a binary file,
|
231 |
|
|
then you should avoid the \fB-load\fP flag. The problem is that
|
232 |
|
|
if you load a package before computing the index it masks any
|
233 |
|
|
other files that provide part of the same package.
|
234 |
|
|
If you must use \fB-load\fP,
|
235 |
|
|
then you must specify the scripts first; otherwise the package loaded from
|
236 |
|
|
the binary file may mask the package defined by the scripts.
|
237 |
|
|
|
238 |
|
|
.SH KEYWORDS
|
239 |
|
|
auto-load, index, package, version
|