|
|
1.1 ! root 1: # ! 2: # installTcl.tcl -- ! 3: # ! 4: # Tcl program to install Tcl onto the system. ! 5: # ! 6: #------------------------------------------------------------------------------ ! 7: # Copyright 1992 Karl Lehenbauer and Mark Diekhans. ! 8: # ! 9: # Permission to use, copy, modify, and distribute this software and its ! 10: # documentation for any purpose and without fee is hereby granted, provided ! 11: # that the above copyright notice appear in all copies. Karl Lehenbauer and ! 12: # Mark Diekhans make no representations about the suitability of this ! 13: # software for any purpose. It is provided "as is" without express or ! 14: # implied warranty. ! 15: #------------------------------------------------------------------------------ ! 16: # $Id: installTcl.tcl,v 2.0 1992/10/16 04:52:08 markd Rel $ ! 17: #------------------------------------------------------------------------------ ! 18: # ! 19: # It is run in the following manner: ! 20: # ! 21: # tcl installTcl.tcl ! 22: # ! 23: # This script reads the Extended Tcl Makefile confiugation file (Config.mk) ! 24: # and converts the Makefile macros in Tcl variables that control the ! 25: # installation. The following variables are currently used: ! 26: # ! 27: # TCL_UCB_DIR TCL_DEFAULT TCL_OWNER ! 28: # TCL_GROUP TCL_BINDIR TCL_LIBDIR ! 29: # TCL_INCLUDEDIR TCL_TCLDIR TCL_MAN_INSTALL ! 30: # TCL_MAN_BASEDIR TCL_MAN_CMD_SECTION TCL_MAN_FUNC_SECTION ! 31: # TK_MAN_CMD_SECTION TK_MAN_FUNC_SECTION TCL_MAN_STYLE* ! 32: # TCL_MAN_INDEX* TCL_TK_SHELL* ! 33: # ! 34: # (ones marked with * are optional) ! 35: # ! 36: # Notes: ! 37: # o Must be run in the Extended Tcl top level directory. ! 38: # o The routine InstallManPages has code to determine if a manual page ! 39: # belongs to a command or function. For Tcl the commands are assumed ! 40: # to be in "Tcl.man", for TclX functions are in TclX.man. All others ! 41: # are assumed to be functions. For Tk, all manuals starting with Tk_ ! 42: # are assumed to be functions, all others are assumed to be commands. ! 43: #:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ! 44: ! 45: #------------------------------------------------------------------------------ ! 46: # ParseConfigFile -- ! 47: # ! 48: # Parse a configure file in the current directory and convert all make ! 49: # macros to global Tcl variables. ! 50: ! 51: proc ParseConfigFile {configFile} { ! 52: set cfgFH [open $configFile] ! 53: ! 54: while {[gets $cfgFH line] >= 0} { ! 55: if {[string match {[A-Za-z]*} $line]} { ! 56: set idx [string first "=" $line] ! 57: if {$idx < 0} { ! 58: error "no `=' in: $line"} ! 59: set name [string trim [csubstr $line 0 $idx]] ! 60: set value [string trim [crange $line [expr $idx+1] end]] ! 61: global $name ! 62: set $name $value ! 63: } ! 64: } ! 65: close $cfgFH ! 66: ! 67: } ! 68: ! 69: #------------------------------------------------------------------------------ ! 70: # GiveAwayFile -- ! 71: # Give away a file to the Tcl owner and group and set its permissions. ! 72: # ! 73: # Globals: ! 74: # TCL_OWNER - Owner name for Tcl files. ! 75: # TCL_GROUP - Group nmae for Tcl file. ! 76: #------------------------------------------------------------------------------ ! 77: ! 78: proc GiveAwayFile {file} { ! 79: global TCL_OWNER TCL_GROUP ! 80: ! 81: if {[file isdirectory $file]} { ! 82: chmod a+rx,go-w $file ! 83: } else { ! 84: chmod a+r,go-w $file ! 85: } ! 86: chown [list $TCL_OWNER $TCL_GROUP] $file ! 87: ! 88: } ;# GiveAwayFile ! 89: ! 90: #------------------------------------------------------------------------------ ! 91: # MakePath -- ! 92: # ! 93: # Make sure all directories in a directory path exists, if not, create them. ! 94: #------------------------------------------------------------------------------ ! 95: proc MakePath {pathlist} { ! 96: foreach path $pathlist { ! 97: set exploded_path [split $path /] ! 98: set thisdir {} ! 99: foreach element $exploded_path { ! 100: append thisdir $element ! 101: if {![file isdirectory $thisdir]} { ! 102: mkdir $thisdir ! 103: GiveAwayFile $thisdir ! 104: } ! 105: append thisdir / ! 106: } ! 107: } ! 108: } ! 109: ! 110: #------------------------------------------------------------------------------ ! 111: # CopyFile -- ! 112: # ! 113: # Copy the specified file and change the ownership. If target is a directory, ! 114: # then the file is copied to it, otherwise target is a new file name. ! 115: #------------------------------------------------------------------------------ ! 116: ! 117: proc CopyFile {sourceFile target} { ! 118: ! 119: if {[file isdirectory $target]} { ! 120: set targetFile "$target/[file tail $sourceFile]" ! 121: } else { ! 122: set targetFile $target ! 123: } ! 124: ! 125: unlink -nocomplain $targetFile ! 126: set sourceFH [open $sourceFile r] ! 127: set targetFH [open $targetFile w] ! 128: copyfile $sourceFH $targetFH ! 129: close $sourceFH ! 130: close $targetFH ! 131: GiveAwayFile $targetFile ! 132: ! 133: } ;# CopyFile ! 134: ! 135: #------------------------------------------------------------------------------ ! 136: # CopyManPage -- ! 137: # ! 138: # Copy the specified manual page and change the ownership. The manual page ! 139: # is edited to remove change bars (.VS and .VE macros). If target is a ! 140: # directory, then the file is copied to it, otherwise target is a new file ! 141: # name. ! 142: #------------------------------------------------------------------------------ ! 143: ! 144: proc CopyManPage {sourceFile target} { ! 145: ! 146: if {[file isdirectory $target]} { ! 147: set targetFile "$target/[file tail $sourceFile]" ! 148: } else { ! 149: set targetFile $target ! 150: } ! 151: ! 152: unlink -nocomplain $targetFile ! 153: set sourceFH [open $sourceFile r] ! 154: set targetFH [open $targetFile w] ! 155: while {[gets $sourceFH line] >= 0} { ! 156: if [string match {.V[SE]*} $line] continue ! 157: puts $targetFH $line ! 158: } ! 159: close $sourceFH ! 160: close $targetFH ! 161: GiveAwayFile $targetFile ! 162: ! 163: } ;# CopyManPage ! 164: ! 165: #------------------------------------------------------------------------------ ! 166: # CopySubDir -- ! 167: # ! 168: # Recursively copy part of a directory tree, changing ownership and ! 169: # permissions. This is a utility routine that actually does the copying. ! 170: #------------------------------------------------------------------------------ ! 171: ! 172: proc CopySubDir {sourceDir destDir} { ! 173: foreach sourceFile [glob -nocomplain $sourceDir/*] { ! 174: ! 175: if [file isdirectory $sourceFile] { ! 176: set destFile $destDir/[file tail $sourceFile] ! 177: if {![file exists $destFile]} { ! 178: mkdir $destFile} ! 179: GiveAwayFile $destFile ! 180: CopySubDir $sourceFile $destFile ! 181: } else { ! 182: CopyFile $sourceFile $destDir ! 183: } ! 184: } ! 185: } ;# CopySubDir ! 186: ! 187: #------------------------------------------------------------------------------ ! 188: # CopyDir -- ! 189: # ! 190: # Recurisvely copy a directory tree. ! 191: #------------------------------------------------------------------------------ ! 192: ! 193: proc CopyDir {sourceDir destDir} { ! 194: ! 195: set cwd [pwd] ! 196: if ![file exists $sourceDir] { ! 197: error "\"$sourceDir\" does not exist" ! 198: } ! 199: if ![file isdirectory $sourceDir] { ! 200: error "\"$sourceDir\" isn't a directory" ! 201: } ! 202: if {![file exists $destDir]} { ! 203: mkdir $destDir ! 204: GiveAwayFile $destDir ! 205: } ! 206: if ![file isdirectory $destDir] { ! 207: error "\"$destDir\" isn't a directory" ! 208: } ! 209: cd $sourceDir ! 210: set status [catch {CopySubDir . $destDir} msg] ! 211: cd $cwd ! 212: if {$status != 0} { ! 213: global errorInfo errorCode ! 214: error $msg $errorInfo $errorCode ! 215: } ! 216: } ! 217: ! 218: #------------------------------------------------------------------------------ ! 219: # GenDefaultFile -- ! 220: # ! 221: # Generate the tcl defaults file. ! 222: #------------------------------------------------------------------------------ ! 223: ! 224: proc GenDefaultFile {defaultFileBase sourceDir} { ! 225: ! 226: set defaultFile "$defaultFileBase[infox version]" ! 227: ! 228: if ![file writable [file dirname $defaultFile]] { ! 229: puts stderr "Can't create $defaultFile -- directory is not writable" ! 230: puts stderr "Please reinstall with correct permissions or rebuild" ! 231: puts stderr "Tcl to select a default file where the directory path" ! 232: puts stderr "you specify is writable by you." ! 233: puts stderr "" ! 234: exit 1 ! 235: } ! 236: ! 237: set fp [open $defaultFile w] ! 238: ! 239: puts $fp "# Extended Tcl [infox version] default file" ! 240: puts $fp "" ! 241: puts $fp "set TCLINIT $sourceDir/TclInit.tcl" ! 242: puts $fp "" ! 243: puts $fp "set TCLPATH $sourceDir" ! 244: ! 245: close $fp ! 246: GiveAwayFile $defaultFile ! 247: ! 248: } ;# GenDefaultFile ! 249: ! 250: #------------------------------------------------------------------------------ ! 251: # GetManNames -- ! 252: # ! 253: # Search a manual page (nroff source) for the name line. Parse the name ! 254: # line into all of the functions or commands that it references. This isn't ! 255: # comprehensive, but it works for all of the Tcl, TclX and Tk man pages. ! 256: # ! 257: # Parameters: ! 258: # o manFile (I) - The path to the manual page file. ! 259: # Returns: ! 260: # A list contain the functions or commands or {} if the name line can't be ! 261: # found or parsed. ! 262: #------------------------------------------------------------------------------ ! 263: ! 264: proc GetManNames {manFile} { ! 265: ! 266: set manFH [open $manFile] ! 267: ! 268: # ! 269: # Search for name line. Once found, grab the next line that is not a ! 270: # nroff macro. If we end up with a blank line, we didn't find it. ! 271: # ! 272: while {[gets $manFH line] >= 0} { ! 273: if [regexp {^.SH NAME.*$} $line] { ! 274: break ! 275: } ! 276: } ! 277: while {[gets $manFH line] >= 0} { ! 278: if {![string match ".*" $line]} break ! 279: } ! 280: close $manFH ! 281: ! 282: set line [string trim $line] ! 283: if {$line == ""} return ! 284: ! 285: # ! 286: # Lets try and parse the name list out of the line ! 287: # ! 288: if {![regexp {^(.*)(\\-)} $line {} namePart]} { ! 289: if {![regexp {^(.*)(-)} $line {} namePart]} return ! 290: } ! 291: ! 292: # ! 293: # This magic converts the name line into a list ! 294: # ! 295: ! 296: if {[catch {join [split $namePart ,] " "} namePart] != 0} return ! 297: ! 298: return $namePart ! 299: ! 300: } ! 301: ! 302: #------------------------------------------------------------------------------ ! 303: # SetUpManIndex -- ! 304: # Setup generation of manual page index for short manual pages, if required. ! 305: # Globals: ! 306: # o TCL_MAN_INDEX - Boolean indicating if a manual page is to be created. ! 307: # If it does not exists, false is assumed. ! 308: # o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* ! 309: # directories live. ! 310: # Returns: ! 311: # The manual index file handle, or {} if the manual index is not to be ! 312: # generated. ! 313: #------------------------------------------------------------------------------ ! 314: ! 315: proc SetUpManIndex {} { ! 316: global TCL_MAN_BASEDIR TCL_MAN_INDEX ! 317: ! 318: if {!([info exists TCL_MAN_INDEX] && [set TCL_MAN_INDEX])} { ! 319: return {} ! 320: } ! 321: set tclIndexFile $TCL_MAN_BASEDIR/index.TCL ! 322: return [open $tclIndexFile w] ! 323: } ! 324: ! 325: #------------------------------------------------------------------------------ ! 326: # FinishUpManIndex -- ! 327: # Finish generation of manual page index for short manual pages, if required. ! 328: # Parameters: ! 329: # o indexFileHdl - The file handle returned by SetUpManIndex, maybe {}. ! 330: # Globals: ! 331: # o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* ! 332: # directories live. ! 333: #------------------------------------------------------------------------------ ! 334: ! 335: proc FinishUpManIndex {indexFileHdl} { ! 336: global TCL_MAN_BASEDIR TCL_MAN_INDEX_MERGE ! 337: ! 338: if [lempty $indexFileHdl] return ! 339: ! 340: set tclIndexFile $TCL_MAN_BASEDIR/index.TCL ! 341: close $indexFileHdl ! 342: GiveAwayFile $tclIndexFile ! 343: ! 344: } ! 345: ! 346: #------------------------------------------------------------------------------ ! 347: # InstallShortMan -- ! 348: # Install a manual page on a system that does not have long file names, ! 349: # optionally adding an entry to the man index. ! 350: # ! 351: # Parameters: ! 352: # o sourceFile - Manual page source file path. ! 353: # o section - Section to install the manual page in. ! 354: # o indexFileHdl - File handle of the current index file being created, or ! 355: # empty if no index is to be created. ! 356: # Globals: ! 357: # o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* ! 358: # directories live. ! 359: # o TCL_MAN_SEPARATOR - The name separator between the directory and the ! 360: # section. ! 361: #------------------------------------------------------------------------------ ! 362: ! 363: proc InstallShortMan {sourceFile section indexFileHdl} { ! 364: global TCL_MAN_BASEDIR TCL_MAN_SEPARATOR ! 365: ! 366: set manNames [GetManNames $sourceFile] ! 367: if [lempty $manNames] { ! 368: set baseName [file tail [file root $sourceFile]] ! 369: puts stderr "Warning: can't parse NAME line for man page: $sourceFile." ! 370: puts stderr " Manual page only available as: $baseName" ! 371: } ! 372: ! 373: set manFileBase [file tail [file root $sourceFile]] ! 374: set manFileName "$manFileBase.$section" ! 375: ! 376: set destManDir "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$section" ! 377: set destCatDir "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$section" ! 378: ! 379: CopyManPage $sourceFile "$destManDir/$manFileName" ! 380: unlink -nocomplain "$destCatDir/$manFileName" ! 381: ! 382: if {![lempty $indexFileHdl]} { ! 383: foreach name $manNames { ! 384: puts $indexFileHdl "$name\t$manFileBase\t$section" ! 385: } ! 386: } ! 387: } ! 388: ! 389: #------------------------------------------------------------------------------ ! 390: # InstallLongMan -- ! 391: # Install a manual page on a system that does have long file names. ! 392: # ! 393: # Parameters: ! 394: # o sourceFile - Manual page source file path. ! 395: # o section - Section to install the manual page in. ! 396: # Globals: ! 397: # o TCL_MAN_BASEDIR - Base manual directory where all of the man.* and cat.* ! 398: # directories live. ! 399: # o TCL_MAN_SEPARATOR - The name separator between the directory and the ! 400: # section. ! 401: #------------------------------------------------------------------------------ ! 402: ! 403: proc InstallLongMan {sourceFile section} { ! 404: global TCL_MAN_BASEDIR TCL_MAN_SEPARATOR ! 405: ! 406: set manNames [GetManNames $sourceFile] ! 407: if [lempty $manNames] { ! 408: set baseName [file tail [file root $sourceFile]] ! 409: puts stderr "Warning: can't parse NAME line for man page: $sourceFile." ! 410: puts stderr " Manual page only available as: $baseName" ! 411: set manNames $baseName ! 412: } ! 413: ! 414: set destManDir "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$section" ! 415: set destCatDir "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$section" ! 416: ! 417: # Copy file to the first name in the list. ! 418: ! 419: set firstFile [lvarpop manNames] ! 420: set firstFilePath "$destManDir/$firstFile.$section" ! 421: ! 422: CopyManPage $sourceFile $firstFilePath ! 423: unlink -nocomplain "$destCatDir/$firstFile.$section" ! 424: ! 425: # Link it to the rest of the names in the list. ! 426: ! 427: foreach manEntry $manNames { ! 428: set destFilePath "$destManDir/$manEntry.$section" ! 429: unlink -nocomplain $destFilePath ! 430: if {[catch { ! 431: link $firstFilePath $destFilePath ! 432: } msg] != 0} { ! 433: puts stderr "error from: link $firstFilePath $destFilePath" ! 434: puts stderr " $msg" ! 435: } ! 436: unlink -nocomplain "$destCatDir/$manEntry.$section" ! 437: } ! 438: ! 439: } ! 440: ! 441: #------------------------------------------------------------------------------ ! 442: # InstallManPage -- ! 443: # Install a manual page on a system. ! 444: # ! 445: # Parameters: ! 446: # o sourceFile - Manual page source file path. ! 447: # o section - Section to install the manual page in. ! 448: # o indexFileHdl - File handle of the current index file being created, or ! 449: # empty if no index is to be created. ! 450: # Globals ! 451: # o TCL_MAN_STYLE - SHORT if short manual page names are being used, ! 452: # LONG if long manual pages are being used. ! 453: #------------------------------------------------------------------------------ ! 454: ! 455: proc InstallManPage {sourceFile section indexFileHdl} { ! 456: global TCL_MAN_STYLE ! 457: ! 458: if {"$TCL_MAN_STYLE" == "SHORT"} { ! 459: InstallShortMan $sourceFile $section $indexFileHdl ! 460: } else { ! 461: InstallLongMan $sourceFile $section ! 462: } ! 463: } ! 464: ! 465: #------------------------------------------------------------------------------ ! 466: # InstallManPages -- ! 467: # Install the manual pages. ! 468: #------------------------------------------------------------------------------ ! 469: ! 470: proc InstallManPages {} { ! 471: global TCL_UCB_DIR TCL_TK_SHELL TCL_TK_DIR ! 472: global TCL_MAN_BASEDIR TCL_MAN_SEPARATOR TCL_MAN_STYLE ! 473: global TCL_MAN_CMD_SECTION TCL_MAN_FUNC_SECTION ! 474: global TK_MAN_CMD_SECTION TK_MAN_FUNC_SECTION ! 475: ! 476: if {![info exists TCL_MAN_STYLE]} { ! 477: set TCL_MAN_STYLE LONG ! 478: } ! 479: set TCL_MAN_STYLE [string toupper $TCL_MAN_STYLE] ! 480: case $TCL_MAN_STYLE in { ! 481: {SHORT} {} ! 482: {LONG} {} ! 483: default {error "invalid value for TCL_MAN_STYLE: `$TCL_MAN_STYLE'"} ! 484: } ! 485: ! 486: MakePath $TCL_MAN_BASEDIR ! 487: MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TCL_MAN_CMD_SECTION" ! 488: MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TCL_MAN_CMD_SECTION" ! 489: MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TCL_MAN_FUNC_SECTION" ! 490: MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TCL_MAN_FUNC_SECTION" ! 491: ! 492: set indexFileHdl [SetUpManIndex] ! 493: ! 494: # Install all of the actual files. ! 495: ! 496: echo " Installing Tcl [info tclversion] man files" ! 497: foreach fileName [glob $TCL_UCB_DIR/doc/*.man] { ! 498: if {[file root $fileName] == "Tcl.man"} { ! 499: set section $TCL_MAN_CMD_SECTION ! 500: } else { ! 501: set section $TCL_MAN_FUNC_SECTION ! 502: } ! 503: InstallManPage $fileName $section $indexFileHdl ! 504: } ! 505: ! 506: echo " Installing Extended Tcl [infox version] man files" ! 507: ! 508: foreach fileName [glob man/*.man] { ! 509: if {[file root $fileName] == "TclX.man"} { ! 510: set section $TCL_MAN_CMD_SECTION ! 511: } else { ! 512: set section $TCL_MAN_FUNC_SECTION ! 513: } ! 514: InstallManPage $fileName $section $indexFileHdl ! 515: } ! 516: ! 517: if {![info exists TCL_TK_SHELL]} { ! 518: FinishUpManIndex $indexFileHdl ! 519: return ! 520: } ! 521: ! 522: MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TK_MAN_CMD_SECTION" ! 523: MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TK_MAN_CMD_SECTION" ! 524: MakePath "$TCL_MAN_BASEDIR/man$TCL_MAN_SEPARATOR$TK_MAN_FUNC_SECTION" ! 525: MakePath "$TCL_MAN_BASEDIR/cat$TCL_MAN_SEPARATOR$TK_MAN_FUNC_SECTION" ! 526: ! 527: echo " Installing Tk man files" ! 528: ! 529: foreach fileName [glob $TCL_TK_DIR/doc/*.man] { ! 530: if {![string match "Tk_*" [file root $fileName]]} { ! 531: set section $TK_MAN_CMD_SECTION ! 532: } else { ! 533: set section $TK_MAN_FUNC_SECTION ! 534: } ! 535: InstallManPage $fileName $section $indexFileHdl ! 536: } ! 537: ! 538: FinishUpManIndex $indexFileHdl ! 539: ! 540: } ;# InstallLongManPages ! 541: ! 542: #------------------------------------------------------------------------------ ! 543: # Main program code. ! 544: #------------------------------------------------------------------------------ ! 545: ! 546: echo "" ! 547: echo ">>> Installing Extended Tcl [infox version] <<<" ! 548: ! 549: set argc [llength $argv] ! 550: if {$argc != 0} { ! 551: puts stderr "usage: tcl installTcl.tcl" ! 552: exit 1 ! 553: } ! 554: ! 555: # ! 556: # Bring in all of the macros defined bu the configuration file. ! 557: # ! 558: ParseConfigFile Config.mk ! 559: ParseConfigFile config/$TCL_CONFIG_FILE ! 560: ! 561: # ! 562: # Make sure all directories exists that we will be installing in. ! 563: # ! 564: ! 565: MakePath [list $TCL_TCLDIR [file dirname $TCL_DEFAULT] $TCL_BINDIR] ! 566: MakePath [list $TCL_LIBDIR $TCL_INCLUDEDIR $TCL_TCLDIR] ! 567: ! 568: echo " Creating default file: $TCL_DEFAULT[infox version]" ! 569: GenDefaultFile $TCL_DEFAULT $TCL_TCLDIR ! 570: ! 571: echo " Installing `tcl' program in: $TCL_BINDIR" ! 572: CopyFile tcl $TCL_BINDIR ! 573: chmod +rx $TCL_BINDIR/tcl ! 574: ! 575: echo " Installing `libtcl.a' library in: $TCL_LIBDIR" ! 576: CopyFile libtcl.a $TCL_LIBDIR ! 577: ! 578: echo " Installing Tcl .h files in: $TCL_INCLUDEDIR" ! 579: CopyFile $TCL_UCB_DIR/tcl.h $TCL_INCLUDEDIR ! 580: CopyFile $TCL_UCB_DIR/tclHash.h $TCL_INCLUDEDIR ! 581: CopyFile src/tclExtend.h $TCL_INCLUDEDIR ! 582: CopyFile src/tcl++.h $TCL_INCLUDEDIR ! 583: ! 584: echo " Installing Tcl run-time files in: $TCL_TCLDIR" ! 585: foreach srcFile [glob tcllib/*] { ! 586: if {![file isdirectory $srcFile]} { ! 587: CopyFile $srcFile $TCL_TCLDIR ! 588: } ! 589: } ! 590: ! 591: echo " Installing Tcl help files in: $TCL_TCLDIR/help" ! 592: if [file exists $TCL_TCLDIR/help] { ! 593: echo " Purging old help tree" ! 594: exec rm -rf $TCL_TCLDIR/help ! 595: } ! 596: CopyDir tcllib/help $TCL_TCLDIR/help ! 597: ! 598: if [info exists TCL_TK_SHELL] { ! 599: echo " Installing `wish' program in: $TCL_BINDIR" ! 600: CopyFile wish $TCL_BINDIR ! 601: chmod +rx $TCL_BINDIR/wish ! 602: ! 603: echo " Installing `libtk.a' library in: $TCL_LIBDIR" ! 604: CopyFile libtk.a $TCL_LIBDIR ! 605: ! 606: echo " Installing `tk.h' in: $TCL_INCLUDEDIR" ! 607: CopyFile $TCL_TK_DIR/tk.h $TCL_INCLUDEDIR ! 608: } ! 609: ! 610: foreach file [glob $TCL_TCLDIR/*.tlib] { ! 611: buildpackageindex $file ! 612: } ! 613: ! 614: if {$TCL_MAN_INSTALL} { ! 615: InstallManPages ! 616: } ! 617: ! 618: echo " *** TCL IS NOW INSTALLED ***" ! 619:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.