tags:

views:

379

answers:

1

Here are my specs: OS X Tiger Perl 5.8 Using Tkx bundled with ActiveTcl v8.5

I've successfully created a standalone app with the above configuration using PAR/pp, but it's not a completely satisfactory solution:

  • still requires Tcl/Tk to be installed
  • opens up in a Tcl/Tk window with a default menu
  • opens Terminal every time I run the application

Is there another route I can take that would bypass these issues?

+3  A: 

If you're using ActivePerl it should come bundled with shared objects for Tcl and Tk. The files are Tcl.so and tkkit.so (Tcl.dll and tkkit.dll on Windows). You'll want to configure pp to bundle them with your self-contained executable using the -l option. For example (on Windows):

-l C:/Perl/lib/auto/Tcl/tkkit.dll
-l C:/Perl/lib/auto/Tcl/Tcl.dll

Unfortunately PAR doesn't unpack shared objects in the right place for Tkx applications to find them. You can get around this by setting $ENV{PERL_TCL_DL_PATH} before loading Tkx. To make an application that is usable either with or without PAR, use a BEGIN block to detect when it's being run under PAR:

use strict;
use warnings;
use File::Spec::Functions;

BEGIN {
    if (exists $ENV{PAR_PROGNAME}) {
        use Config ();
        $ENV{PERL_TCL_DL_PATH} = catfile(
            $ENV{PAR_TEMP},
            'tkkit.' . $Config::Config{dlext},
        );
    }
}

use Tkx;
# remainder of script...

pp has a -g (or --gui) option to build applications without a console window but it only works on Windows. I don't know if there's a way to hid the console on OS X.

As for the application opening in a Tcl/Tk window with a default menu, I don't know. I suspect that's because you're using the ActiveTcl installation instead of the shared objects bundled with ActivePerl.

Michael Carman
I read about the -g switch too. At this point I think my best bet would be to look for other options. Thank you.
Goose Bumper