Alien-MSYS

 view release on metacpan or  search on metacpan

alienfile  view on Meta::CPAN

if($^O eq 'MSWin32')
{
  my $ver;
  my $err;
  {
    local $@;
    $err = $@ || 'Error' unless eval {
      require Win32;
      $ver = (Win32::GetOSVersion())[1];
    };
  }
  if($err || $ver < 6)
  {
    print "Please upgrade to Windows 7 or better (ideally Windows 10).\n";
    print "The native crypto libraries on Windows XP, used by mingw-gwt\n";
    print "no longer work with sourceforge.\n";
    exit;
  }
  else
  {
    log "Windows major version $ver ok.\n";
  }
}

configure {
  requires 'Alien::Build' => '0.99';
  requires 'Path::Tiny' => 0;
  requires 'File::Glob' => 0;
};

my @exes_to_check = qw( sh.exe perl.exe m4.exe mktemp.exe readlink.exe );
sub msys_is_okay
{
  my($dir) = @_;
     -d path($dir)
  && (
    all { -x path($dir)->child($_ ) } @exes_to_check
  )
}

probe sub {
  my($build) = @_;

  if($^O eq 'MSWin32' || $ENV{PERL_ALIEN_MSYS_FAUX})
  {
    return 'share'
      if defined $ENV{ALIEN_MSYS_INSTALL_TYPE} && $ENV{ALIEN_MSYS_INSTALL_TYPE} eq 'share';

    if(defined $ENV{PERL_ALIEN_MSYS_BIN})
    {
      if(msys_is_okay($ENV{PERL_ALIEN_MSYS_BIN}))
      {
        $build->runtime_prop->{my_type} = 'PERL_ALIEN_MSYS_BIN';
        $build->runtime_prop->{my_bin} = path($ENV{PERL_ALIEN_MSYS_BIN})->stringify;
        return 'system';
      }
    }

    if(my $uname_exe = which('uname'))
    {
      my $bin_dir = path($uname_exe)->parent->stringify;
      my $uname = `$uname_exe`;
      if($uname =~ /^(MSYS|MINGW(32|64))_NT/ && msys_is_okay($bin_dir)) {
        $build->runtime_prop->{my_type} =  'found uname in PATH';
        $build->runtime_prop->{my_bin} = $bin_dir;
        return 'system';
      }
    }

    if(my $mingw_get = which('mingw-get.exe'))
    {
      my $bin_dir = path($mingw_get)->parent->parent->child('msys/1.0/bin')->stringify;
      if(msys_is_okay($bin_dir))
      {
        $build->runtime_prop->{my_type} =  'relative to mingw-get.exe';
        $build->runtime_prop->{my_bin} = $bin_dir;
        return 'system';
      }
    }

    foreach my $maybe (qw( C:\MinGW\msys\1.0\bin ))
    {
      my $bin_dir = path($maybe)->stringify;
      if(msys_is_okay($bin_dir))
      {
        $build->runtime_prop->{my_type} =  'default install location';
        $build->runtime_prop->{my_bin} = $bin_dir;
        return 'system';
      }
    }

    my $path = eval {
      require Win32;
      require Win32::Shortcut;
      my $lnk_name = path(Win32::GetFolderPath(Win32::CSIDL_DESKTOP(), 1))->child('MinGW Installer.lnk')->canonpath;
      die "No MinGW Installer.lnk" unless -r $lnk_name;
      my $lnk = Win32::Shortcut->new;
      $lnk->Load($lnk_name);
      my $mingw_get = path($lnk->{Path});
      my $bin_dir = path($mingw_get)->parent->child('msys/1.0/bin');
      if(msys_is_okay($bin_dir))
      {
        $build->runtime_prop->{my_type} =  'MinGW Installer shortcut';
        $build->runtime_prop->{my_bin} = $bin_dir;
        return 'system';
      }
    };

    return 'share';
  }
  else
  {
    return 'system';
  }
};

share {

  meta->prop->{start_url} = 'https://sourceforge.net/projects/mingw/files/Installer/mingw-get/';

  plugin 'Download';
  plugin 'Decode::Mojo';
  plugin 'Decode::SourceForge';
  plugin 'Extract' => 'zip';

  download sub {
    my($build) = @_;

    $build->log("GET @{[ meta->prop->{start_url} ]}");

    my $mingw_get_index_url = do {
      my $ret = $build->decode($build->fetch);
      my($first) = grep { $_->{filename} =~ /mingw-get-.*?-([0-9]{8})-([0-9]+)/ } @{ $ret->{list} };
      die 'unable to find the correct directory for mingw-get' unless $first;
      $first->{url};
    };

    $build->log("GET $mingw_get_index_url");

    my $mingw_get_url = do {
      my $ret = $build->decode($build->fetch($mingw_get_index_url));
      my($first) = grep { $_->{filename} =~ /mingw-get-.*?-bin.zip/ } @{ $ret->{list} };
      $first->{url};
    };

    $build->log("GET $mingw_get_url");

    {
      my $ret = $build->fetch($mingw_get_url);

      if(defined $ret->{content})
      {
        path($ret->{filename})->spew_raw($ret->{content});
      }
      elsif(defined $ret->{path})
      {
        my $from = path($ret->{path});
        my $to   = $ret->{filename};
        if($ret->{tmp})
        {



( run in 0.465 second using v1.01-cache-2.11-cpan-385001e3568 )