#!/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.15 =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.15; # 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__