Alien-OpenMP

 view release on metacpan or  search on metacpan

t/03-configure.t  view on Meta::CPAN

BEGIN { $ENV{CC} = 'xyz-cc' }
use strict;
use warnings;
use Test::More;
use Test::Alien;
use Alien::OpenMP::configure;
use Path::Tiny;
use Capture::Tiny qw(capture);

subtest 'CC environment variable' => sub {
  local $Alien::OpenMP::configure::OS = 'linux';
  Alien::OpenMP::configure->_reset;
  is $Alien::OpenMP::configure::CCNAME, 'xyz-cc', 'esoteric compiler name';
  ok !Alien::OpenMP::configure->is_known, q{not known};
};

subtest 'gcc' => sub {
  local $Alien::OpenMP::configure::CCNAME = 'gcc';
  local $Alien::OpenMP::configure::OS     = 'linux';
  my $omp_flag = q{-fopenmp};
  Alien::OpenMP::configure->_reset;
  is +Alien::OpenMP::configure->is_known,  1, q{known};
  is +Alien::OpenMP::configure->cflags,    $omp_flag, q{Found expected OpenMP compiler switch for gcc.};
  is +Alien::OpenMP::configure->lddlflags, $omp_flag, q{Found expected OpenMP linker switch for gcc.};
};

subtest 'darwin clang/gcc homebrew' => sub {
  local $Alien::OpenMP::configure::CCNAME = 'gcc';
  local $Alien::OpenMP::configure::OS     = 'darwin';
  local $ENV{PATH}                        = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin";
  Alien::OpenMP::configure->_reset;
  is +Alien::OpenMP::configure->is_known, 1,                    q{known};
  like +Alien::OpenMP::configure->cflags, qr{-Xclang -fopenmp}, q{Found expected OpenMP compiler switch for gcc/clang.};
  like +Alien::OpenMP::configure->lddlflags, qr{-lomp},         q{Found expected OpenMP linker switch for gcc/clang.};
  like +Alien::OpenMP::configure->cflags,    qr{-I/usr/local/include}, q{Found path to include headers};
};

subtest 'darwin clang/gcc macports' => sub {
  plan skip_all => 'Mocking does not work on MSWin32'
    if $^O eq 'MSWin32';
  local $Alien::OpenMP::configure::CCNAME = 'gcc';
  local $Alien::OpenMP::configure::OS     = 'darwin';
  local $ENV{PATH}                        = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin";

  # create a mock port executable
  my $tempdir = Path::Tiny->tempdir();
  my $port    = $tempdir->child('bin', 'port');
  $port->parent->mkpath;
  $port->spew("#!/bin/bash");
  $port->chmod(0755);
  $ENV{PATH} .= ":$tempdir/bin";
  Alien::OpenMP::configure->_reset;
  is +Alien::OpenMP::configure->is_known, 1,                    q{known};
  like +Alien::OpenMP::configure->cflags, qr{-Xclang -fopenmp}, q{Found expected OpenMP compiler switch for gcc/clang.};
  like +Alien::OpenMP::configure->lddlflags, qr{-lomp},         q{Found expected OpenMP linker switch for gcc/clang.};
  like +Alien::OpenMP::configure->cflags,    qr{-I$tempdir/include/libomp}, q{Found path to include headers};
  like +Alien::OpenMP::configure->libs,      qr{-L$tempdir/lib/libomp},     q{Found path to library};
};

subtest 'unknown and therefore unsupported' => sub {
  local $Alien::OpenMP::configure::CCNAME = q{unsupported xyz};
  local $Alien::OpenMP::configure::OS     = q{foobar-os};
  Alien::OpenMP::configure->_reset;

  ok !Alien::OpenMP::configure->is_known, 'not known AKA unsupported';
  is +Alien::OpenMP::configure->cflags, q{}, 'empty string';
  is +Alien::OpenMP::configure->libs,   q{}, 'empty string';

  my ($stdout, $stderr, @result) = capture { Alien::OpenMP::configure->unsupported; 1 };
  is_deeply \@result, [1], 'no errors';
  like $stdout, qr{^OS Unsupported},                                         'Message for ExtUtils::MakeMaker';
  like $stderr, qr{This version of unsupported xyz does not support OpenMP}, 'unsupported compiler name';
};

subtest 'darwin, missing dependencies' => sub {
  local $Alien::OpenMP::configure::CCNAME = q{clang};
  local $Alien::OpenMP::configure::OS     = q{darwin};
  local $ENV{PATH}                        = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin";
  Alien::OpenMP::configure->_reset;
  ok +Alien::OpenMP::configure->is_known, 'known';

  my ($stdout, $stderr, @result) = capture { Alien::OpenMP::configure->unsupported; 1 };
  is_deeply \@result, [1], 'no errors';
  like $stdout, qr{^OS Unsupported},                                      'Message for ExtUtils::MakeMaker';
  like $stderr, qr{This version of clang does not support OpenMP},        'clang missing openmp support';
  like $stderr, qr{Support can be enabled by using Homebrew or Macports}, 'unsupported compiler name';
};


done_testing;



( run in 0.854 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )