#!/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.11

=cut

=head1 SYNOPSIS

    PAR assistant
    
    run 'wxpar' exactly as you would run pp.
        
    e.g.  wxpar --gui --icon=myicon.ico -o myprog.exe myscript.pl
    
    NOTE: For PAR::Packer, if you are distributing wxWidgets libs with
    GDI+ support (wxGraphicsContext) and you don't use wxpar, you must
    distribute gdiplus.dll separately for those Windows operating systems
    that require it. If you use wxpar and the Alien::wxWidgets PPM's from
    http://www.wxperl.co.uk/ it is packaged for you and loaded where the
    operating system requires.

    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.
 

=cut
use File::Copy;
my @args = @ARGV;
my $VERSION = 0.11;

# 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));

# look for gdiplus lib
my $gdidir = $wxdir;
$gdidir =~ s/lib$/os/;
my $srcgdi = qq($gdidir/gdiplus.dl_);
mkdir('gdilib', 0777);
my $targetgdidll = qq(gdilib/gdiplus.dll);
if(-e $srcgdi ) {
    File::Copy::copy($srcgdi, $targetgdidll) or die qq(unable to create GDI+ lib: $!);
    unshift(@fileargs, qq(--addfile $targetgdidll));
}


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 );

unlink($targetgdidll);
unlink('gdilib');

1;

__END__
