Alien-SDL
view release on metacpan or search on metacpan
lib/Alien/SDL.pm view on Meta::CPAN
# try to find header
my $root = Alien::SDL->config('prefix');
#warn 'Finding in '.$root.'/include';
my $include = File::Spec->catfile($root, 'include');
my @files;
find({ wanted => sub { push @files, rel2abs($_) if /\Q$header\E$/ }, follow => 1, no_chdir => 1, follow_skip => 2 }, $include);
return unless @files;
# get version info
open(DAT, $files[0]) || 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 =~ 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 =~ 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 =~ s/^#define[ \t]+[A-Z_]+[ \t]+([0-9]+)[.\r\n]*$/$1/;
return if (($v_maj eq '')||($v_min eq '')||($v_pat eq ''));
return "$v_maj.$v_min.$v_pat";
}
### check presence of header(s) specified as params
sub check_header {
my ($package, @header) = @_;
print STDERR "[$package] Testing header(s): " . join(', ', @header);
require ExtUtils::CBuilder; # PAR packer workaround
my $config = {};
if($^O eq 'cygwin') {
my $ccflags = $Config{ccflags};
$ccflags =~ s/-fstack-protector//;
$config = { ld => 'gcc', cc => 'gcc', ccflags => $ccflags };
}
my $cb = ExtUtils::CBuilder->new( quiet => 1, config => $config );
my ($fs, $src) = File::Temp::tempfile('aaXXXX', SUFFIX => '.c', UNLINK => 1);
my $inc = '';
my $i = 0;
foreach (@header) {
@header = (splice(@header, 0, $i) , 'stdio.h', splice(@header, $i)) if $_ eq 'jpeglib.h';
$i++;
}
$inc .= "#include <$_>\n" for @header;
syswrite($fs, <<MARKER); # write test source code
#if defined(_WIN32) && !defined(__CYGWIN__)
/* 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;
my $stdout = '';
my $stderr = '';
($stdout, $stderr) = Capture::Tiny::capture {
$obj = eval { $cb->compile( source => $src, extra_compiler_flags => Alien::SDL->config('cflags')); };
};
if($obj) {
print STDERR "\n";
unlink $obj;
return 1;
}
else {
if( $stderr ) {
$stderr =~ s/[\r\n]$//;
$stderr =~ s/^\Q$src\E[\d\s:]*//;
print STDERR " NOK: ($stderr)\n";
}
# on Windows (MSVC) stdout is set, but not stderr
else {
$stdout =~ s/[\r\n]$//;
$stdout =~ s/.+[\r\n]//;
$stdout =~ s/^\Q$src\E[\(\)\d\s:]*//;
print STDERR " NOK: ($stdout)\n";
}
return 0;
}
}
### internal functions
sub _sdl_config_via_script
{
my $param = shift;
my @add_libs = @_;
my $devnull = File::Spec->devnull();
my $script = Alien::SDL::ConfigData->config('script');
return unless ($script && ($param =~ /[a-z0-9_]*/i));
my $val = `$script --$param 2>$devnull`;
$val =~ s/[\r\n]*$//;
if($param eq 'cflags') {
$val .= ' ' . Alien::SDL::ConfigData->config('additional_cflags');
}
elsif($param eq 'libs') {
$val .= ' ' . join(' ', @add_libs) if scalar @add_libs;
$val .= ' ' . Alien::SDL::ConfigData->config('additional_libs');
}
elsif($param =~ /^(ld_shlib_map|ld_shared_libs|ld_paths)$/) {
$val = Alien::SDL::ConfigData->config('config')->{$param};
}
return $val;
}
sub _sdl_config_via_config_data
{
my $param = shift;
my @add_libs = @_;
my $share_dir = dist_dir('Alien-SDL');
my $subdir = Alien::SDL::ConfigData->config('share_subdir');
return unless $subdir;
my $real_prefix = catdir($share_dir, $subdir);
return unless ($param =~ /[a-z0-9_]*/i);
my $val = Alien::SDL::ConfigData->config('config')->{$param};
return unless $val;
# handle additional flags
if($param eq 'cflags') {
$val .= ' ' . Alien::SDL::ConfigData->config('additional_cflags');
}
elsif($param eq 'libs') {
$val .= ' ' . join(' ', @add_libs) if scalar @add_libs;
$val .= ' ' . Alien::SDL::ConfigData->config('additional_libs');
}
# handle @PrEfIx@ replacement
if ($param =~ /^(ld_shared_libs|ld_paths)$/) {
s/\@PrEfIx\@/$real_prefix/g foreach (@{$val});
}
elsif ($param =~ /^(ld_shlib_map)$/) {
while (my ($k, $v) = each %$val ) {
$val->{$k} =~ s/\@PrEfIx\@/$real_prefix/g;
( run in 1.653 second using v1.01-cache-2.11-cpan-7fcb06a456a )