#!/usr/bin/perl

############################################################
#
# Simple assistant for use with wxPerl and PAR
#
# Copyright (c) 2006 & 2007 Mark Dootson mdootson@cpan.org
#
############################################################

=head1 NAME

wxpar

=head1 VERSION

Version 0.10

=cut

=head1 SYNOPSIS

    PAR assistant

    At the start of your script ...
    
    #!c:/path/to/perl.exe
    use Wx::Perl::Packager;
    .....
    
    or if you use threads with your application
    #!c:/path/to/perl.exe
    use threads;
    use threads::shared;
    use Wx::Perl::Packager;
    
    Wx::Perl::Packager must be loaded before any part of Wx so should appear at the
    top of your main script. If you load any part of Wx in a BEGIN block, then you
    must load Wx::Perl::Packager before it in your first BEGIN block. This may cause
    you problems if you use threads within your Wx application. The threads
    documentation advises against loading threads in a BEGIN block - so don't do it.

    Then, run 'wxpar' exactly as you would run pp.
    
    e.g.  wxpar --gui --icon=myicon.ico -o myprog.exe myscript.pl    

=cut

my @args = @ARGV;
my $VERSION = 0.10;

# get the outputpath, get argfilepath
my ($i, $ix, $execpath, $argfile);

for ($i = 0; $i < @args; $i++) {
    if($ix) {
        $execpath = $args[$i];
        last;
    }
    if(($args[$i] eq '-o') || ($args[$i] eq '--output')) { $ix = 1; }
}
if($execpath) {
    my @parts = split(/[\\\/]/, $execpath);
    if( (scalar @parts) > 1 ) {
        my $exec = pop(@parts);
        $exec =~ s/\.exe$//i;
        my $dirpath = join('/', @parts);
        if(-d $dirpath) {
            if($^O =~ /^MSWin/) { $dirpath = Win32::GetShortPathName($dirpath); }
        } else {
            die qq(target directory $dirpath does not exist);
        }
        $argfile = qq($dirpath/$exec.wxparargs);
    } elsif( (scalar @parts) == 1 ) {
        my $exec = pop(@parts);
        $exec =~ s/\.exe$//i;
        $argfile = "$exec.wxparargs";
    }
}

require Wx::Mini;
    
my $wxdir = $Wx::wx_path;
my $wxdlls = $Wx::dlls;

my @fileargs = ();

foreach my $dllname(keys(%$wxdlls)) {
    my $filepath = $wxdir . '/' . $wxdlls->{$dllname};
    $filepath =~ s/\\/\//g;
    unshift(@fileargs, qq(-l $filepath));
}

# add mingw32 runtime if present
my $mingw32dll = qq($wxdir/mingwm10.dll);
$mingw32dll =~ s/\\/\//g;
if(-f $mingw32dll) {
    unshift(@fileargs, qq(-l $mingw32dll));
}

# add attributes - always needed by Wx

unshift(@fileargs, qq(-M attributes.pm));

my $command = 'pp';
my $arglist = '';

if($argfile) {
    open my $fh, '>', $argfile;
    print $fh q(# wxpar Getopt::Argfile for PAR::Packer pp) . "\n\n";
    print$fh qq($_\n) for(@fileargs);
    close($fh);
    unshift(@args, qq(\@$argfile));
}   

for my $argument (@args) {
    if($argument =~ /\s/) {
        $arglist .= '"' . $argument . '" ';
    } else {
        $arglist .= $argument . ' ';
    }
}

print qq(\nRunning Command .....\n\n);
print qq($command $arglist\n);
print qq(\n .....\n\n);

system($command, @args );

1;

__END__
