Updated 2011-06-24 17:04:24 by RLE

Script below converts many installed packages into the Tcl Module format (TIP 189 [1]) built on the trofs package.

I ran it on one of my systems and produced 178 *.tm files.
 package require Tcl 8.5
 package require trofs 0.4
 eval [package unknown] Tcl [package provide Tcl]
 foreach p [package names] {
    if {[string match *::* $p]} {
        # Don't handle this case yet;  TM file names can't contain ::
        continue
    }
    foreach v [package versions $p] {
        set loadScript [package ifneeded $p $v]
        if {[catch {llength $loadScript} l]} {continue}
        if {[lindex $loadScript 0] ne "source"} {continue}
        set file [lindex $loadScript 1]
        if {![file readable $file]} {continue}
        set dir [file dirname $file]
        set tail [file tail $file]
        if {[string match *.tm $tail]} {continue}
        set numFiles [llength [glob -directory $dir *]]
        if {($numFiles == 2)
                && ([catch {glob -directory $dir pkgIndex.tcl}] == 0)} {
            # Installed package is just script + pkgIndex.
            # It's very likely already in suitable TM format
            file copy -force $file $p-$v.tm
            continue
        }
        set f [open $p-$v.tm w]
        puts $f {package require Tcl 8.5}
        puts $f {package require trofs 0.4}
        puts $f [subst -nocommands {
                source [file join [trofs::mount [info script]] $tail]
        }]
        close $f
        trofs::archive $dir $p-$v.tm
    }
 }

See also: