/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
- #!/usr/bin/env perl
- package My::Builder::Darwin;
- use strict;
- use warnings;
- use Alien::SDL;
- use File::Find qw(find);
- use Data::Dumper;
- use Cwd;
- use Config;
- use File::Copy;
- use File::Spec;
- use base 'My::Builder';
- sub special_build_settings {
- my $self = shift;
- $self->{c_source} = [ 'src', 'main.c' ];
- $self->{c_sources} = 'MacOSX';
- $self->{install_base} = "SDLPerl.app/Contents/Resources";
- }
- sub build_bundle {
- my $self = shift;
- system "mkdir -p blib/script";
- my $Perl = ( $ENV{'FULLPERL'} or $^X or 'perl' );
- my $cflags =
- `$Perl -MExtUtils::Embed -e ccopts` . ' ' . Alien::SDL->config('cflags');
- my $libs =
- `$Perl -MExtUtils::Embed -e ldopts` . ' '
- . Alien::SDL->config('libs')
- . ' -lSDLmain';
- my $arch = '';
- my $sdl_lib = '';
- $sdl_lib =
- Alien::SDL->config('ld_shlib_map')
- && Alien::SDL->config('ld_shlib_map')->{SDL}
- ? Alien::SDL->config('ld_shlib_map')->{SDL}
- : _find_SDL_lib();
- $arch = $1 if $sdl_lib && `lipo -info $sdl_lib` =~ m/\s(\w+)s*$/;
- $arch = $ENV{SDL_ARCH} if $ENV{SDL_ARCH};
- if ($arch) {
- $cflags =~ s/\b-arch \w+\s//g;
- $libs =~ s/\b-arch \w+\s//g;
- $arch = "-arch $arch";
- }
- my $cmd =
- "gcc $arch -o \"blib/script/SDLPerl\" MacOSX/main.c $cflags $libs";
- $cmd =~ s/\s+/ /g;
- unless(-e 'blib/script/SDLPerl') {
- print STDERR $cmd . "\n";
- system($cmd);
- }
- }
- sub ACTION_test {
- my $self = shift;
- $self->depends_on('build');
- $self->build_bundle() if !( -e 'blib/script/SDLPerl' );
- if( $ENV{SDL_RELEASE_TESTING} ) {
- if ( $ENV{SDL_PERL_TEST} ) {
- $self->Module::Build::ACTION_test;
- $ENV{SDL_PERL_TEST} = 0; #unset it again
- }
- else {
- my $cmd = 'blib/script/SDLPerl Build test';
- $ENV{SDL_PERL_TEST} = 1;
- system( split ' ', $cmd );
- die 'Errors in Testing. Can\'t continue' if $?;
- }
- }
- else {
- $self->Module::Build::ACTION_test;
- }
- }
- sub _find_SDL_lib {
- my $inc_lib_candidates = {
- '/usr/local/include' => '/usr/local/lib',
- '/usr/include' => '/usr/lib',
- '/usr/X11R6/include' => '/usr/X11R6/lib',
- };
- if ( -e '/usr/lib64' && $Config{'myarchname'} =~ /64/ ) {
- $inc_lib_candidates->{'/usr/include'} = '/usr/lib64';
- }
- if ( exists $ENV{SDL_LIB} && exists $ENV{SDL_INC} ) {
- $inc_lib_candidates->{ $ENV{SDL_INC} } = $ENV{SDL_LIB};
- }
- foreach ( keys %$inc_lib_candidates ) {
- my $ld = $inc_lib_candidates->{$_};
- next unless -d $ld;
- my ($found_lib) = _find_file( $ld,
- qr/[\/\\]lib\QSDLmain\E[\-\d\.]*\.(so|dylib|bundle[\d\.]*|a|dll.a)$/
- );
- return $found_lib if $found_lib;
- }
- return 0;
- }
- sub _find_file {
- my ( $dir, $re ) = @_;
- my @files;
- $re ||= qr/.*/;
- {
- #hide warning "Can't opendir(...): Permission denied - fix for http://rt.cpan.org/Public/Bug/Display.html?id=57232
- no warnings;
- find(
- {
- wanted => sub { push @files, File::Spec->rel2abs($_) if /$re/ },
- follow => 1,
- no_chdir => 1,
- follow_skip => 2
- },
- $dir
- );
- };
- return @files;
- }
- 1;