/scripts/SDLpp.pl

http://github.com/PerlGameDev/SDL · Perl · 231 lines · 144 code · 55 blank · 32 comment · 27 complexity · f47e9f1da2dab1ca19057796b8ecb6d7 MD5 · raw file

  1. =pod
  2. =head1 NAME
  3. SDLpp - Package your SDL games
  4. =head1 SETUP
  5. cpan Alien::SDL SDL
  6. cpan Module::ScanDeps
  7. version 0.97 needed
  8. cpan PAR::Packer
  9. version 1.004 needed
  10. pip http://strawberryperl.com/package/kmx/perl-modules-patched/PAR-1.000_patched.tar.gz
  11. =head1 USAGE
  12. perl SDLpp.pl --output=a.exe --input=script.pl --nclude=./lib --more=Foo::Bar,Bar::Foo
  13. =head1 AUTHOR
  14. kthakore
  15. =cut
  16. use strict;
  17. use warnings;
  18. use SDL;
  19. use Alien::SDL;
  20. use Getopt::Long;
  21. use File::Spec;
  22. use File::Find qw/finddepth/;
  23. use Data::Dumper;
  24. use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
  25. #Checking if we have the pp installed
  26. die 'Need PAR::Packer' if !( eval ' use PAR::Packer; 1' );
  27. #Default out put is a or a.exe for windows
  28. my $output = 'a';
  29. $output .= '.exe' if $^O =~ /win32/ig;
  30. my $libs = 'SDL,SDL-1.2,SDLmain';
  31. my $input;
  32. my $Include = '';
  33. my $extra = '';
  34. my $result = GetOptions(
  35. "output=s" => \$output,
  36. "libs=s" => \$libs,
  37. "input=s" => \$input,
  38. "nclude=s" => \$Include,
  39. "more=s" => \$extra,
  40. "help" => sub { usage() },
  41. );
  42. $extra = '-M ' . $extra if $extra;
  43. $extra =~ s/,/ \-M /g;
  44. my @sdl_libs = split ',', $libs;
  45. sub usage {
  46. print
  47. " perl SDLpp.pl --output=a.exe --libs=SDL,SDL_main,SDL_gfx --input=script.pl --nclude=./lib --more=Foo::Bar,Bar::Foo \n"
  48. . " if --libs is not define only SDL,SDL-1.2,SDLmain libs are packaged \n";
  49. exit;
  50. }
  51. if ( !$input ) {
  52. warn 'Input needs to be specified.';
  53. usage;
  54. }
  55. print "BUILDING PAR \n";
  56. my $exclude_modules = '-X Alien::SDL::ConfigData -X SDL::ConfigData';
  57. my $include_modules = '-M ExtUtils::CBuilder::Base -M Data::Dumper -M SDL -M Alien::SDL';
  58. $include_modules .= " $extra" if $extra;
  59. my $out_par = $output . '.par';
  60. my $par_cmd = "pp -B $exclude_modules $include_modules";
  61. $par_cmd .= " -I $Include" if $Include;
  62. $par_cmd .= " -p -o $out_par $input";
  63. print "\t $par_cmd \n";
  64. `$par_cmd` if !-e $out_par;
  65. print "PAR: $out_par\n" if -e $out_par;
  66. print "SEARCHING FOR ConfigData files \n";
  67. my $lib;
  68. my $AS_path;
  69. my $SD_path;
  70. finddepth( \&wanted, @INC );
  71. sub wanted {
  72. if ( $_ =~ /ConfigData/ ) {
  73. $AS_path = $File::Find::name
  74. if $File::Find::name =~ 'Alien/SDL/ConfigData.pm';
  75. $SD_path = $File::Find::name
  76. if $File::Find::name =~ 'SDL/ConfigData.pm'
  77. && $File::Find::name !~ 'Alien/SDL/ConfigData.pm';
  78. $lib = $File::Find::dir if ( $AS_path && $SD_path );
  79. }
  80. }
  81. die "Cannot find lib/SDL/ConfigData.pm or lib/Alien/SDL/ConfigData.pm \n"
  82. if ( !$AS_path || !$SD_path );
  83. print "Found ConfigData files in $lib \n";
  84. print "READING PAR FILE \n";
  85. my $par_file = Archive::Zip->new();
  86. unless ( $par_file->read($out_par) == AZ_OK ) {
  87. die 'read error on ' . $out_par;
  88. }
  89. $par_file->addFile( $AS_path, 'lib/Alien/SDL/ConfigData.pm' );
  90. $par_file->addFile( $SD_path, 'lib/SDL/ConfigData.pm' );
  91. my $share = Alien::SDL::ConfigData->config('share_subdir');
  92. my @shares = $par_file->membersMatching($share);
  93. my $alien_sdl_auto = $shares[0]->fileName;
  94. $alien_sdl_auto =~ s/$share(\S+)// if $alien_sdl_auto;
  95. my @auto_folder = $par_file->membersMatching("$alien_sdl_auto(?!$share)");
  96. my @sdl_not_runtime = $par_file->membersMatching( $share . '/include' ); #TODO remove extra fluff in share_dri
  97. push @sdl_not_runtime, @auto_folder; #remove non share dir stuff
  98. push @sdl_not_runtime, $par_file->membersMatching( $share . '/etc' );
  99. push @sdl_not_runtime, $par_file->membersMatching( $share . '/share' );
  100. push @sdl_not_runtime, $par_file->membersMatching( $share . '/lib' )
  101. if $^O =~ /win32/ig;
  102. my @non = ();
  103. my @sdl_libs_to_keep = ();
  104. foreach (@sdl_libs) {
  105. if ( $^O =~ /win32/ig ) {
  106. @non = $par_file->membersMatching( $share . "/bin(\\S+)" );
  107. #push @sdl_not_runtime ,$par_file->membersMatching( $share."/bin(\\S+)(?!$_)" )
  108. } else {
  109. @non = $par_file->membersMatching( $share . "/lib(\\S+)" );
  110. }
  111. print "Removing non $_ shared objs \n";
  112. my $lib_look = 'lib' . $_;
  113. map {
  114. my $n = $_->fileName;
  115. if ( $n =~ /$lib_look\.(so|a|dll|dylib)/ ) {
  116. push( @sdl_libs_to_keep, $_ );
  117. }
  118. } @non;
  119. }
  120. print "found $#sdl_libs_to_keep sdl libs to keep \n";
  121. my $regex_search = ']';
  122. map {
  123. print "\t " . $_->fileName . "\n";
  124. $regex_search .= ']' . $_->fileName
  125. } @sdl_libs_to_keep;
  126. $regex_search =~ s/\]\]//g;
  127. $regex_search =~ s/\]/\|/g;
  128. $regex_search = '(' . $regex_search . ')';
  129. map {
  130. my $n = $_->fileName;
  131. my $star = ' ';
  132. if ( $n !~ $regex_search ) {
  133. push @sdl_not_runtime, $_;
  134. }
  135. } @non;
  136. push @sdl_not_runtime, $par_file->membersMatching( $share . '/bin' )
  137. unless $^O =~ /win32/ig;
  138. print "REMOVING NON RUNTIME $#sdl_not_runtime files from \n";
  139. open( my $FH, '>', 'DeleteRecords.txt' ) or die $!;
  140. foreach (@sdl_not_runtime) {
  141. if ( $_->fileName eq $alien_sdl_auto . $share ) {
  142. print $FH "Not deleting " . $_->fileName . " \n";
  143. } else {
  144. $par_file->removeMember($_);
  145. print $FH $_->fileName . "\n";
  146. }
  147. }
  148. close $FH;
  149. my @config_members = $par_file->membersMatching('ConfigData.pm');
  150. foreach (@config_members) {
  151. $_->desiredCompressionLevel(1);
  152. $_->unixFileAttributes(0644);
  153. }
  154. unlink $out_par . '2';
  155. unless ( $par_file->writeToFileNamed( $out_par . '2' ) == AZ_OK ) {
  156. die 'write error';
  157. }
  158. $par_cmd = "pp -o $output " . $out_par . "2";
  159. `$par_cmd`;
  160. print "MADE $output \n" if -e $output;
  161. unlink $out_par . '2';
  162. unlink $out_par;