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 )