################################################################################### # Distribution Wx::Perl::Packager # File Wx/Perl/Packager/MSWin.pm # Description: module for MSWin specific handlers # File Revision: $Id: MSWin.pm 48 2010-04-25 00:26:34Z $ # License: This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself # Copyright: Copyright (c) 2006 - 2010 Mark Dootson ################################################################################### package Wx::Perl::Packager::MSWin; use strict; use warnings; require Wx::Perl::Packager::Base; use base qw( Wx::Perl::Packager::Base ); use Win32; use Win32::File; our $VERSION = '0.27'; sub new { my $class = shift; my $self = $class->SUPER::new( @_ ); return $self; } sub config_system { my $self = shift; $self->set_so_module_suffix(''); # different linux dists symlink the .so libraries differently # BAH. the loaders in Wx::Perl::Packager will look for # modules ending in '.so' - If your modules get packaged # differently, put the suffix here. # e.g. if your module when packaged is # wxlibs_gcc_base.so.0.6.0 # you should $self->set_so_module_suffix('.0.6.0') $self->set_relocate_pdkcheck(0); # relocate the Wx dlls during PDK Check - never necessary it seems $self->set_relocate_packaged(1); # relocate the Wx Dlls when running as PerlApp $self->set_relocate_wx_main(1); # if set_relocate_packaged is true and we find 'wxmain.dll' # as a bound file, we load it as Wx.dll ( which it should be # if user as bound it). This is the current fix for PerlApp # segmentation fault on exit in Linux. Makes no difference # in MSWin $self->set_unlink_relocated(1); # delete the extracted files - ensures relocated are loaded $self->set_loadmode_pdkcheck('nullsub'); # standard | nullsub | packload during pdkcheck # standard uses normal Wx loading # nullsub - no extensions are loaded # packload - extensions are loaded by Wx::Perl::Packager $self->set_loadmode_packaged('packload');# as above, when running as PerlApp $self->set_loadcore_pdkcheck(0); # use DynaLoader to load wx modules listed by # get_core_modules method (below)during pdkcheck $self->set_loadcore_packaged(1); # as above, when running as PerlApp $self->set_unload_loaded_core(1);# unload any librefs we loaded # (uses DynaLoader in an END block ) $self->set_unload_loaded_plugins(1); # unload plugins ( html, stc, gl .. etc) that are # loaded via 'packload'. This seems to be necessary # to ensure correct unloading order. # Note - plugins are loaded using # Wx::_load_plugin (not DynaLoader); $self->set_pdkcheck_exit(0); # because of the current seg fault on exit in linux # you can't package using PerlApp # setting this to '1' calls 'exit(0)' after # Wx has loaded during pdkcheck # Drastic - but it is the current hack for this failure on linux $self->set_pdkcheck_handle(1); # if true, use special handling during pdkcheck # if false, treat as standard perl ( all other pdkcheck # options are ignored) $self->SUPER::config_system; } sub delete_file { my( $self, $target) = @_; return if !-f $target; my $attribs = Win32::File::NORMAL|Win32::File::TEMPORARY; Win32::File::SetAttributes($target, $attribs); unlink $target; } sub compare_paths { my($self, $one, $two) = @_; $one =~ s/\//\\/g; $two =~ s/\//\\/g; $one = lc(Win32::GetLongPathName($one)); $two = lc(Win32::GetLongPathName($two)); return ( $one eq $two ); } sub get_core_modules { (qw( mingw gdiplus base core adv )) } sub config_modules { my $self = shift; $self->get_modules->{wx} = { filename => 'wxmain.dll', loaded => 0, libref => undef, missing_fatal => 0 }; $self->get_modules->{mingw} = { filename => 'mingwm10.dll', loaded => 0, libref => undef, missing_fatal => 0 }; # keep backwards compatibility with gdiplus hack $self->get_modules->{gdiplus} = { filename => 'gdiplus.dll', loaded => 0, libref => undef, missing_fatal => 0 }; $self->SUPER::config_modules; } sub setsys_filepath { my($self, $filepath) = @_; $filepath =~ s/\//\\/g; $filepath = Win32::GetLongPathName($filepath) || $filepath; return $filepath; } sub prepare_perl { my $self = shift; $self->_set_mingwdll( $self->get_wx_load_path ); }; sub prepare_pdkcheck { my $self = shift; $self->_set_mingwdll( $self->get_wx_load_path ); $ENV{PATH} = $self->get_wx_load_path . ';' . $ENV{PATH}; # mingw-w64 built Wx will fault on pdkcheck exit ? my $mdll = $self->get_modules->{mingw}->{filename}; if($mdll =~ /^libgcc/) { $self->set_pdkcheck_exit(1); } } sub prepare_perlapp { my $self = shift; require Wx::Perl::Packager::Mini; $self->_set_mingwdll( $self->get_app_extract_path ); } sub _set_mingwdll { my($self, $dir) = @_; my $defaultmingw = 'mingwm10.dll'; opendir(MYWXDIR, $dir) or die qq(Unable to open directory $dir : $!); my @mingfiles = grep { /^libgcc_/ } readdir(MYWXDIR); closedir(MYWXDIR); if($mingfiles[0] && (-f qq($dir/$mingfiles[0]))) { $defaultmingw = $mingfiles[0]; } $self->debug_print(qq(mingw runtime is $defaultmingw)); $self->get_modules->{mingw}->{filename} = $defaultmingw; } 1;