On 05/01/2012 1:42 AM, Laurence Anthony wrote:
I've tried many times to add Tcl packages to the Tkkit in ActiveState Perl
to use with a standalone Tkx application (built with perlapp). The only
documentation online seems to be the long thread below, which contains some
code snippets and various corrections (but doesn't seem to be complete).
http://www.nntp.perl.org/group/perl.tcltk/2008/11/msg187.html

Can someone post a definitive code snippet that will allow a package that
is installed into Tcl (e.g. pdf4tcl) to be added to the Tkkit.

It's a rather simple script (just a few lines), but I've attached something that adds more magic and assistance.

Jeff
#!/usr/bin/env tclsh

# Extend ActivePerl Tkx tkkits
#
# Copyright 2011 Jeffrey Hobbs, ActiveState Software Inc.

package require Tcl 8.5
package require vfs::mk4

proc usage {{msg {}}} {
    if {$msg ne ""} { puts stderr $msg }
    puts stderr "Usage: $::argv0 ?-kit tkkit? -add module_dir ?-add ...?"
    exit
}

if {$argc < 2 || $argc % 2} { usage }

set tkkit ""
set modules [list]
foreach {key val} $argv {
    if {$key eq "-kit"} {
        if {![file readable $val]} { usage "tkkit '$val' doesn't exist" }
        set tkkit $val
    } elseif {$key eq "-add"} {
        if {![file isdirectory $val]} {
            usage "No such directory '$val'"
        }
        lappend modules $val
        if {![file readable $val/pkgIndex.tcl]} {
            puts stderr "WARN: no pkgIndex.tcl in module dir '$val'"
        }
    } else {
        usage
    }
}

if {$tkkit eq ""} {
    set tkkit [exec perl -MTcl -e {print $Tcl::DL_PATH;}]
}
if {![file readable $tkkit]} { usage "tkkit '$val' doesn't exist"  }
if {[llength $modules] == 0} { usage "no modules specified"  }

puts stdout "Extending tkkit '$tkkit' with module(s) $modules"

file attributes $tkkit -readonly 0 ; # needs to be writable
vfs::mk4::Mount $tkkit tkkit ; # mounts file as dir 'tkkit'

set target [pwd]/tkkit/lib
if {![file isdirectory $target]} {
    puts stderr "integrity failure in tkkit structure (no lib dir)"
    vfs::unmount tkkit
    exit
}

foreach module $modules {
    file copy -force $module $target
}

puts stdout "lib: [glob -tails -directory $target *]"

vfs::unmount tkkit

puts stdout "Completed"

exit

Reply via email to