/inc/My/Builder/Darwin.pm

http://github.com/PerlGameDev/SDL · Perl · 127 lines · 110 code · 15 blank · 2 comment · 17 complexity · e94c5213d64725cdf3fb6b86304b5938 MD5 · raw file

  1. #!/usr/bin/env perl
  2. package My::Builder::Darwin;
  3. use strict;
  4. use warnings;
  5. use Alien::SDL;
  6. use File::Find qw(find);
  7. use Data::Dumper;
  8. use Cwd;
  9. use Config;
  10. use File::Copy;
  11. use File::Spec;
  12. use base 'My::Builder';
  13. sub special_build_settings {
  14. my $self = shift;
  15. $self->{c_source} = [ 'src', 'main.c' ];
  16. $self->{c_sources} = 'MacOSX';
  17. $self->{install_base} = "SDLPerl.app/Contents/Resources";
  18. }
  19. sub build_bundle {
  20. my $self = shift;
  21. system "mkdir -p blib/script";
  22. my $Perl = ( $ENV{'FULLPERL'} or $^X or 'perl' );
  23. my $cflags =
  24. `$Perl -MExtUtils::Embed -e ccopts` . ' ' . Alien::SDL->config('cflags');
  25. my $libs =
  26. `$Perl -MExtUtils::Embed -e ldopts` . ' '
  27. . Alien::SDL->config('libs')
  28. . ' -lSDLmain';
  29. my $arch = '';
  30. my $sdl_lib = '';
  31. $sdl_lib =
  32. Alien::SDL->config('ld_shlib_map')
  33. && Alien::SDL->config('ld_shlib_map')->{SDL}
  34. ? Alien::SDL->config('ld_shlib_map')->{SDL}
  35. : _find_SDL_lib();
  36. $arch = $1 if $sdl_lib && `lipo -info $sdl_lib` =~ m/\s(\w+)s*$/;
  37. $arch = $ENV{SDL_ARCH} if $ENV{SDL_ARCH};
  38. if ($arch) {
  39. $cflags =~ s/\b-arch \w+\s//g;
  40. $libs =~ s/\b-arch \w+\s//g;
  41. $arch = "-arch $arch";
  42. }
  43. my $cmd =
  44. "gcc $arch -o \"blib/script/SDLPerl\" MacOSX/main.c $cflags $libs";
  45. $cmd =~ s/\s+/ /g;
  46. unless(-e 'blib/script/SDLPerl') {
  47. print STDERR $cmd . "\n";
  48. system($cmd);
  49. }
  50. }
  51. sub ACTION_test {
  52. my $self = shift;
  53. $self->depends_on('build');
  54. $self->build_bundle() if !( -e 'blib/script/SDLPerl' );
  55. if( $ENV{SDL_RELEASE_TESTING} ) {
  56. if ( $ENV{SDL_PERL_TEST} ) {
  57. $self->Module::Build::ACTION_test;
  58. $ENV{SDL_PERL_TEST} = 0; #unset it again
  59. }
  60. else {
  61. my $cmd = 'blib/script/SDLPerl Build test';
  62. $ENV{SDL_PERL_TEST} = 1;
  63. system( split ' ', $cmd );
  64. die 'Errors in Testing. Can\'t continue' if $?;
  65. }
  66. }
  67. else {
  68. $self->Module::Build::ACTION_test;
  69. }
  70. }
  71. sub _find_SDL_lib {
  72. my $inc_lib_candidates = {
  73. '/usr/local/include' => '/usr/local/lib',
  74. '/usr/include' => '/usr/lib',
  75. '/usr/X11R6/include' => '/usr/X11R6/lib',
  76. };
  77. if ( -e '/usr/lib64' && $Config{'myarchname'} =~ /64/ ) {
  78. $inc_lib_candidates->{'/usr/include'} = '/usr/lib64';
  79. }
  80. if ( exists $ENV{SDL_LIB} && exists $ENV{SDL_INC} ) {
  81. $inc_lib_candidates->{ $ENV{SDL_INC} } = $ENV{SDL_LIB};
  82. }
  83. foreach ( keys %$inc_lib_candidates ) {
  84. my $ld = $inc_lib_candidates->{$_};
  85. next unless -d $ld;
  86. my ($found_lib) = _find_file( $ld,
  87. qr/[\/\\]lib\QSDLmain\E[\-\d\.]*\.(so|dylib|bundle[\d\.]*|a|dll.a)$/
  88. );
  89. return $found_lib if $found_lib;
  90. }
  91. return 0;
  92. }
  93. sub _find_file {
  94. my ( $dir, $re ) = @_;
  95. my @files;
  96. $re ||= qr/.*/;
  97. {
  98. #hide warning "Can't opendir(...): Permission denied - fix for http://rt.cpan.org/Public/Bug/Display.html?id=57232
  99. no warnings;
  100. find(
  101. {
  102. wanted => sub { push @files, File::Spec->rel2abs($_) if /$re/ },
  103. follow => 1,
  104. no_chdir => 1,
  105. follow_skip => 2
  106. },
  107. $dir
  108. );
  109. };
  110. return @files;
  111. }
  112. 1;