# -*- mode: perl -*-
use alienfile 1.68;
use Alien::Build::CommandSequence;
use lib q{lib};
use Alien::OpenMP::configure;

configure {
  if ($^O eq 'darwin') {
    requires 'File::Which' => '1.27';
    requires 'Path::Tiny'  => '0.053';
  }
  unless (Alien::OpenMP::configure->is_known) {
    Alien::OpenMP::configure->unsupported(__PACKAGE__);
    die "Unsupported platform (no OpenMP)";
  }
};

meta->interpolator->replace_helper(cc => sub { $Alien::OpenMP::configure::CCNAME });

plugin 'Probe::CBuilder' => (
  lang    => 'C',
  cflags  => Alien::OpenMP::configure->cflags,
  libs    => Alien::OpenMP::configure->libs,
  options => { quiet => 0 },
  program => join("\n" => <DATA>),
);

after probe => sub {
  my $build = shift;
  $build->install_prop->{'alien_openmp_compiler_has_openmp'} = 1;
  $build->runtime_prop->{auto_include} = Alien::OpenMP::configure->auto_include;
  $build->runtime_prop->{version} = $Alien::OpenMP::VERSION;

  my $seq = Alien::Build::CommandSequence->new([
    join(' ', '%{cc}', '-dM', Alien::OpenMP::configure->cflags, '-E', '-', '<', '%{devnull}'),
    sub {
      my ($build, $args) = @_;
      my @props = qw{openmp_version version};
      my $runtime = Alien::OpenMP::configure->version_from_preprocessor($args->{out});
      @{$build->runtime_prop}{@props} = @$runtime{@props};
    }
  ]);
  $seq->execute($build);
};

share {
  before download => sub {
    my $build = shift;
    Alien::OpenMP::configure->unsupported($build);
    die "Unsupported platform, OpenMP will not be built";
  };
};

__DATA__
/* OpenMP detection test program */
#include <omp.h>
int main () {
  omp_set_num_threads(3);
  int ans = 42;
#pragma omp parallel
#pragma omp master
  ans = omp_get_num_threads();
  if (3 == ans)
    return 0;
  return 1;
}

