pkgMkIndex.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:10k
源码类别:

通讯编程

开发平台:

Visual C++

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