Updated 2009-06-02 12:26:01 by Cameron

This page is for tips about deploying standalone applications with Freewrap. Please add to it!

I (EKB) have decided to stick with Freewrap, in spite of the excitement over Starkits, partly because it's got BLT already packaged and ready to go, and partly because it works just fine and I'm used to it.

Some deployment tips

I develop on Windows, and create build scripts that are a mix of batch files and tcl scripts. One quick-and-dirty small project looks like this:

The first thing I do is to modify freewrap.exe so that it has the icon for my program and information about my program. I went ahead and paid the $40 or so for Heaventools' Resource Tuner [1] to do it.

The batch file _BuildAll.bat has contents
 call replaceSnippets.bat
 call wrapDrivingForce.bat

(In larger projects, "_BuildAll.bat" checks out all the files from a CVS or Subversion repository and creates an installer using InnoSetup.)

This batch file calls two other batch files: replaceSnippets.bat:
 tclsh ReplaceSnippets.script "drivingforce.tcl" snippets.txt
 del "drivingforce.tcl"
 ren "drivingforce_snipped.tcl" "drivingforce.tcl"

and wrapDrivingForce.bat:
 freewrap drivingforce.tcl drivingforce.ico

The "wrapDrivingForce.bat" batch file is standard for calling freewrap. The "replaceSnippets.bat" file calls a utility that I use to convert from a development version of a script to a freewrap-ready release version. It goes through and replaces anything between "## SNIP" and "## PINS" with corresponding code in a "snippets.txt" file. For example, in this file, it replaces
 ## SNIP
 set appdir [file dirname [info script]]
 ## PINS

and
 ## SNIP
    wm iconbitmap . -default drivingforce.ico
 ## PINS

with
 ## SNIP
 set appdir [file dirname [info nameofexecutable]]
 ## PINS

and
 ## SNIP
    wm iconbitmap . -default "/development/DrivingForce/drivingforce.ico"
 ## PINS

The ReplaceSnippets.script code is available under the No Obligation License (NOL), and is:
 # Look for sections bracketed by "## SNIP" & "## PINS" and from
 # second arg into first arg. Put into "firstarg_snipped.tcl"
 #
 # (c) 2005 Eric Kemp-Benedict
 # Released under the "No Obligation License":
 #    "No obligation for you, no obligation for me."

 # This is called from a batch file or other automatic process, so
 # checking is minimal!

 set initfile [lindex $argv 0]
 set snipfile [lindex $argv 1]
 set outfile "[file rootname $initfile]_snipped.tcl"

 set infp [open $initfile r]
 set snfp [open $snipfile r]
 set outfp [open $outfile w]

 set insnip_in false
 set insnip_snip false

 while {[gets $infp currline] != -1} {
    if {$insnip_in} {
        if {[regexp -- {##\s*PINS} $currline] == 1} {
            set insnip_in false
        }
        continue
    }
    if {[regexp -- {##\s*SNIP} $currline] == 1} {
        set insnip_in true
        # Read from snip file
        while {[gets $snfp snipline] != -1} {
            if {$insnip_snip} {
                if {[regexp -- {##\s*PINS} $snipline] == 1} {
                    set insnip_snip false
                    break
                }
                puts $outfp $snipline
            } elseif {[regexp -- {##\s*SNIP} $snipline] == 1} {
                set insnip_snip true
            }
        }
        continue
    }
    puts $outfp $currline
 }

 close $infp
 close $snfp
 close $outfp

"Internet Explorer doesn't execute my Tcl application after downloading it"

Category Deployment