diff options
author | hobbs <hobbs> | 1999-08-19 02:59:40 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 1999-08-19 02:59:40 (GMT) |
commit | 827f1718a3c6ad6738473fca1d9ca562ece38f91 (patch) | |
tree | ad660b8fb995c85c6ffd337c8056ed293d139e53 /library/ldAout.tcl | |
parent | 92e37b2bd18d8a5451699c466c1664e53403da57 (diff) | |
download | tcl-827f1718a3c6ad6738473fca1d9ca562ece38f91.zip tcl-827f1718a3c6ad6738473fca1d9ca562ece38f91.tar.gz tcl-827f1718a3c6ad6738473fca1d9ca562ece38f91.tar.bz2 |
1999-08-18 Jeff Hobbs <hobbs@scriptics.com>
* library/auto.tcl:
* library/init.tcl:
* library/ldAout.tcl:
* library/package.tcl:
* library/safe.tcl:
* library/word.tcl:
* library/http2.1/http.tcl:
* library/msgcat1.0/msgcat.tcl: updated libraries to better
Tcl style guide (no more string comparisons with == or !=, spacing
changes).
Diffstat (limited to 'library/ldAout.tcl')
-rw-r--r-- | library/ldAout.tcl | 367 |
1 files changed, 180 insertions, 187 deletions
diff --git a/library/ldAout.tcl b/library/ldAout.tcl index ad12624..e602e3a 100644 --- a/library/ldAout.tcl +++ b/library/ldAout.tcl @@ -18,7 +18,7 @@ # its .o file placed before all others in the command; then # "ld" is executed to bind the objects together. # -# RCS: @(#) $Id: ldAout.tcl,v 1.3 1998/11/11 02:39:31 welch Exp $ +# RCS: @(#) $Id: ldAout.tcl,v 1.4 1999/08/19 02:59:40 hobbs Exp $ # # Copyright (c) 1995, by General Electric Company. All rights reserved. # @@ -30,211 +30,204 @@ # F33615-94-C-4400. proc tclLdAout {{cc {}} {shlib_suffix {}} {shlib_cflags none}} { - global env - global argv - - if {$cc==""} { - set cc $env(CC) - } - - # if only two parameters are supplied there is assumed that the - # only shlib_suffix is missing. This parameter is anyway available - # as "info sharedlibextension" too, so there is no need to transfer - # 3 parameters to the function tclLdAout. For compatibility, this - # function now accepts both 2 and 3 parameters. - - if {$shlib_suffix==""} { - set shlib_cflags $env(SHLIB_CFLAGS) - } else { - if {$shlib_cflags=="none"} { - set shlib_cflags $shlib_suffix + global env + global argv + + if {[string equal $cc ""]} { + set cc $env(CC) } - } - # seenDotO is nonzero if a .o or .a file has been seen + # if only two parameters are supplied there is assumed that the + # only shlib_suffix is missing. This parameter is anyway available + # as "info sharedlibextension" too, so there is no need to transfer + # 3 parameters to the function tclLdAout. For compatibility, this + # function now accepts both 2 and 3 parameters. - set seenDotO 0 + if {[string equal $shlib_suffix ""]} { + set shlib_cflags $env(SHLIB_CFLAGS) + } elseif {[string equal $shlib_cflags "none"]} { + set shlib_cflags $shlib_suffix + } - # minusO is nonzero if the last command line argument was "-o". + # seenDotO is nonzero if a .o or .a file has been seen + set seenDotO 0 - set minusO 0 + # minusO is nonzero if the last command line argument was "-o". + set minusO 0 - # head has command line arguments up to but not including the first - # .o or .a file. tail has the rest of the arguments. + # head has command line arguments up to but not including the first + # .o or .a file. tail has the rest of the arguments. + set head {} + set tail {} - set head {} - set tail {} + # nmCommand is the "nm" command that lists global symbols from the + # object files. + set nmCommand {|nm -g} - # nmCommand is the "nm" command that lists global symbols from the - # object files. + # entryProtos is the table of _Init and _SafeInit prototypes found in the + # module. + set entryProtos {} - set nmCommand {|nm -g} + # entryPoints is the table of _Init and _SafeInit entries found in the + # module. + set entryPoints {} - # entryProtos is the table of _Init and _SafeInit prototypes found in the - # module. + # libraries is the list of -L and -l flags to the linker. + set libraries {} + set libdirs {} - set entryProtos {} + # Process command line arguments + foreach a $argv { + if {!$minusO && [regexp {\.[ao]$} $a]} { + set seenDotO 1 + lappend nmCommand $a + } + if {$minusO} { + set outputFile $a + set minusO 0 + } elseif {![string compare $a -o]} { + set minusO 1 + } + if {[regexp {^-[lL]} $a]} { + lappend libraries $a + if {[regexp {^-L} $a]} { + lappend libdirs [string range $a 2 end] + } + } elseif {$seenDotO} { + lappend tail $a + } else { + lappend head $a + } + } + lappend libdirs /lib /usr/lib + + # MIPS -- If there are corresponding G0 libraries, replace the + # ordinary ones with the G0 ones. + + set libs {} + foreach lib $libraries { + if {[regexp {^-l} $lib]} { + set lname [string range $lib 2 end] + foreach dir $libdirs { + if {[file exists [file join $dir lib${lname}_G0.a]]} { + set lname ${lname}_G0 + break + } + } + lappend libs -l$lname + } else { + lappend libs $lib + } + } + set libraries $libs - # entryPoints is the table of _Init and _SafeInit entries found in the - # module. + # Extract the module name from the "-o" option - set entryPoints {} + if {![info exists outputFile]} { + error "-o option must be supplied to link a Tcl load module" + } + set m [file tail $outputFile] + if {[regexp {\.a$} $outputFile]} { + set shlib_suffix .a + } else { + set shlib_suffix "" + } + if {[regexp {\..*$} $outputFile match]} { + set l [expr {[string length $m] - [string length $match]}] + } else { + error "Output file does not appear to have a suffix" + } + set modName [string tolower $m 0 [expr {$l-1}]] + if {[regexp {^lib} $modName]} { + set modName [string range $modName 3 end] + } + if {[regexp {[0-9\.]*(_g0)?$} $modName match]} { + set modName [string range $modName 0 [expr {[string length $modName]-[string length $match]-1}]] + } + set modName [string totitle $modName] + + # Catalog initialization entry points found in the module + + set f [open $nmCommand r] + while {[gets $f l] >= 0} { + if {[regexp {T[ ]*_?([A-Z][a-z0-9_]*_(Safe)?Init(__FP10Tcl_Interp)?)$} $l trash symbol]} { + if {![regexp {_?([A-Z][a-z0-9_]*_(Safe)?Init)} $symbol trash s]} { + set s $symbol + } + append entryProtos {extern int } $symbol { (); } \n + append entryPoints { } \{ { "} $s {", } $symbol { } \} , \n + } + } + close $f - # libraries is the list of -L and -l flags to the linker. + if {[string equal $entryPoints ""]} { + error "No entry point found in objects" + } - set libraries {} - set libdirs {} + # Compose a C function that resolves the initialization entry points and + # embeds the required libraries in the object code. + + set C {#include <string.h>} + append C \n + append C {char TclLoadLibraries_} $modName { [] =} \n + append C { "@LIBS: } $libraries {";} \n + append C $entryProtos + append C {static struct } \{ \n + append C { char * name;} \n + append C { int (*value)();} \n + append C \} {dictionary [] = } \{ \n + append C $entryPoints + append C { 0, 0 } \n \} \; \n + append C {typedef struct Tcl_Interp Tcl_Interp;} \n + append C {typedef int Tcl_PackageInitProc (Tcl_Interp *);} \n + append C {Tcl_PackageInitProc *} \n + append C TclLoadDictionary_ $modName { (symbol)} \n + append C { char * symbol;} \n + append C { + { + int i; + for (i = 0; dictionary [i] . name != 0; ++i) { + if (!strcmp (symbol, dictionary [i] . name)) { + return dictionary [i].value; + } + } + return 0; + } + } + append C \n - # Process command line arguments - foreach a $argv { - if {!$minusO && [regexp {\.[ao]$} $a]} { - set seenDotO 1 - lappend nmCommand $a - } - if {$minusO} { - set outputFile $a - set minusO 0 - } elseif {![string compare $a -o]} { - set minusO 1 - } - if {[regexp {^-[lL]} $a]} { - lappend libraries $a - if {[regexp {^-L} $a]} { - lappend libdirs [string range $a 2 end] - } - } elseif {$seenDotO} { - lappend tail $a + # Write the C module and compile it + + set cFile tcl$modName.c + set f [open $cFile w] + puts -nonewline $f $C + close $f + set ccCommand "$cc -c $shlib_cflags $cFile" + puts stderr $ccCommand + eval exec $ccCommand + + # Now compose and execute the ld command that packages the module + + if {[string equal $shlib_suffix ".a"]} { + set ldCommand "ar cr $outputFile" + regsub { -o} $tail {} tail } else { - lappend head $a - } - } - lappend libdirs /lib /usr/lib - - # MIPS -- If there are corresponding G0 libraries, replace the - # ordinary ones with the G0 ones. - - set libs {} - foreach lib $libraries { - if {[regexp {^-l} $lib]} { - set lname [string range $lib 2 end] - foreach dir $libdirs { - if {[file exists [file join $dir lib${lname}_G0.a]]} { - set lname ${lname}_G0 - break - } - } - lappend libs -l$lname - } else { - lappend libs $lib - } - } - set libraries $libs - - # Extract the module name from the "-o" option - - if {![info exists outputFile]} { - error "-o option must be supplied to link a Tcl load module" - } - set m [file tail $outputFile] - if {[regexp {\.a$} $outputFile]} { - set shlib_suffix .a - } else { - set shlib_suffix "" - } - if {[regexp {\..*$} $outputFile match]} { - set l [expr {[string length $m] - [string length $match]}] - } else { - error "Output file does not appear to have a suffix" - } - set modName [string tolower [string range $m 0 [expr {$l-1}]]] - if {[regexp {^lib} $modName]} { - set modName [string range $modName 3 end] - } - if {[regexp {[0-9\.]*(_g0)?$} $modName match]} { - set modName [string range $modName 0 [expr {[string length $modName]-[string length $match]-1}]] - } - set modName "[string toupper [string index $modName 0]][string range $modName 1 end]" - - # Catalog initialization entry points found in the module - - set f [open $nmCommand r] - while {[gets $f l] >= 0} { - if {[regexp {T[ ]*_?([A-Z][a-z0-9_]*_(Safe)?Init(__FP10Tcl_Interp)?)$} $l trash symbol]} { - if {![regexp {_?([A-Z][a-z0-9_]*_(Safe)?Init)} $symbol trash s]} { - set s $symbol - } - append entryProtos {extern int } $symbol { (); } \n - append entryPoints { } \{ { "} $s {", } $symbol { } \} , \n + set ldCommand ld + foreach item $head { + lappend ldCommand $item + } } - } - close $f - - if {$entryPoints==""} { - error "No entry point found in objects" - } - - # Compose a C function that resolves the initialization entry points and - # embeds the required libraries in the object code. - - set C {#include <string.h>} - append C \n - append C {char TclLoadLibraries_} $modName { [] =} \n - append C { "@LIBS: } $libraries {";} \n - append C $entryProtos - append C {static struct } \{ \n - append C { char * name;} \n - append C { int (*value)();} \n - append C \} {dictionary [] = } \{ \n - append C $entryPoints - append C { 0, 0 } \n \} \; \n - append C {typedef struct Tcl_Interp Tcl_Interp;} \n - append C {typedef int Tcl_PackageInitProc (Tcl_Interp *);} \n - append C {Tcl_PackageInitProc *} \n - append C TclLoadDictionary_ $modName { (symbol)} \n - append C { char * symbol;} \n - append C {{ - int i; - for (i = 0; dictionary [i] . name != 0; ++i) { - if (!strcmp (symbol, dictionary [i] . name)) { - return dictionary [i].value; - } + lappend ldCommand tcl$modName.o + foreach item $tail { + lappend ldCommand $item } - return 0; -}} \n - - # Write the C module and compile it - - set cFile tcl$modName.c - set f [open $cFile w] - puts -nonewline $f $C - close $f - set ccCommand "$cc -c $shlib_cflags $cFile" - puts stderr $ccCommand - eval exec $ccCommand - - # Now compose and execute the ld command that packages the module - - if {$shlib_suffix == ".a"} { - set ldCommand "ar cr $outputFile" - regsub { -o} $tail {} tail - } else { - set ldCommand ld - foreach item $head { - lappend ldCommand $item + puts stderr $ldCommand + eval exec $ldCommand + if {[string equal $shlib_suffix ".a"]} { + exec ranlib $outputFile } - } - lappend ldCommand tcl$modName.o - foreach item $tail { - lappend ldCommand $item - } - puts stderr $ldCommand - eval exec $ldCommand - if {$shlib_suffix == ".a"} { - exec ranlib $outputFile - } - - # Clean up working files - - exec /bin/rm $cFile [file rootname $cFile].o + + # Clean up working files + exec /bin/rm $cFile [file rootname $cFile].o } |