Alien-SDL2
view release on metacpan or search on metacpan
inc/My/Utility.pm view on Meta::CPAN
else {
$ret = 0;
}
}
return $ret;
}
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, rel2abs($_) if /$re/ }, follow => 1, no_chdir => 1 , follow_skip => 2}, $dir);
};
return @files;
}
sub find_SDL2_dir {
my $root = shift;
my ($version, $prefix, $incdir, $libdir);
return unless $root;
# try to find SDL_version.h
my ($found) = find_file($root, qr/SDL_version\.h$/i ); # take just the first one
return unless $found;
# get version info
open(DAT, $found) || return;
my @raw=<DAT>;
close(DAT);
my ($v_maj) = grep(/^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+/, @raw);
$v_maj =~ s/^#define[ \t]+SDL_MAJOR_VERSION[ \t]+([0-9]+)[.\r\n]*$/$1/;
my ($v_min) = grep(/^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+/, @raw);
$v_min =~ s/^#define[ \t]+SDL_MINOR_VERSION[ \t]+([0-9]+)[.\r\n]*$/$1/;
my ($v_pat) = grep(/^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+/, @raw);
$v_pat =~ s/^#define[ \t]+SDL_PATCHLEVEL[ \t]+([0-9]+)[.\r\n]*$/$1/;
return if (($v_maj eq '')||($v_min eq '')||($v_pat eq ''));
$version = "$v_maj.$v_min.$v_pat";
# get prefix dir
my ($v, $d, $f) = splitpath($found);
my @pp = reverse splitdir($d);
shift(@pp) if(defined($pp[0]) && $pp[0] eq '');
shift(@pp) if(defined($pp[0]) && $pp[0] eq 'SDL2');
if(defined($pp[0]) && $pp[0] eq 'include') {
shift(@pp);
@pp = reverse @pp;
return (
$version,
catpath($v, catdir(@pp), ''),
catpath($v, catdir(@pp, 'include'), ''),
catpath($v, catdir(@pp, 'lib'), ''),
);
}
}
sub check_header {
my ($cflags, @header) = @_;
print STDERR "Testing header(s): " . join(', ', @header) . "\n";
my $cb = ExtUtils::CBuilder->new(quiet => 1);
my ($fs, $src) = File::Temp->tempfile( 'XXXX', SUFFIX => 'aa.c', UNLINK => 1);
my $inc = '';
$inc .= "#include <$_>\n" for @header;
syswrite($fs, <<MARKER); # write test source code
#if defined(_WIN32) && !defined(__CYGWIN__)
#include <stdio.h>
/* GL/gl.h on Win32 requires windows.h being included before */
#include <windows.h>
#endif
$inc
int demofunc(void) { return 0; }
MARKER
close($fs);
my $obj = eval { $cb->compile( source => $src, extra_compiler_flags => $cflags); };
if($obj) {
unlink $obj;
return 1;
}
else {
print STDERR "###TEST FAILED### for: " . join(', ', @header) . "\n";
return 0;
}
}
sub sed_inplace {
# we expect to be called like this:
# sed_inplace("filename.txt", 's/0x([0-9]*)/n=$1/g');
my ($file, $re) = @_;
if (-e $file) {
cp($file, "$file.bak") or die "###ERROR### cp: $!";
open INPF, "<", "$file.bak" or die "###ERROR### open<: $!";
open OUTF, ">", $file or die "###ERROR### open>: $!";
binmode OUTF; # we do not want Windows newlines
while (<INPF>) {
eval( "$re" );
print OUTF $_;
}
close INPF;
close OUTF;
}
}
sub get_dlext {
if($^O =~ /darwin/) { # there can be .dylib's on a mac even if $Config{dlext} is 'bundle'
return 'so|dylib|bundle';
}
elsif( $^O =~ /cygwin/) {
return 'la';
}
else {
return $Config{dlext};
}
}
sub get_header_version {
my $file = shift;
# get version info
open(DAT, $file) || return;
my @raw = <DAT>;
close(DAT);
# generic magic how to get version major/minor/patchlevel
my ($v_maj) = grep(/^#define[ \t]+[A-Z_]+?MAJOR[A-Z_]*[ \t]+[0-9]+/, @raw);
$v_maj = '' unless defined $v_maj;
$v_maj =~ s/^#define[ \t]+[A-Z_]+[ \t]+([0-9]+)[.\r\n]*$/$1/;
my ($v_min) = grep(/^#define[ \t]+[A-Z_]+MINOR[A-Z_]*[ \t]+[0-9]+/, @raw);
$v_min = '' unless defined $v_min;
$v_min =~ s/^#define[ \t]+[A-Z_]+[ \t]+([0-9]+)[.\r\n]*$/$1/;
my ($v_pat) = grep(/^#define[ \t]+[A-Z_]+(PATCHLEVEL|MICRO|RELEASE)[A-Z_]*[ \t]+[0-9]+/, @raw);
$v_pat = '' unless defined $v_pat;
$v_pat =~ s/^#define[ \t]+[A-Z_]+[ \t]+([0-9]+)[.\r\n]*$/$1/;
if(($v_maj eq '')||($v_min eq '')||($v_pat eq '')) {
my ($rev) = grep(/\$Revision:\s*[0-9\.]+\s*\$/, @raw);
return unless defined $rev;
( run in 0.381 second using v1.01-cache-2.11-cpan-acebb50784d )