Alien-SWIProlog
view release on metacpan or search on metacpan
return 0;
}
EOF
my $PLVARS;
my $PL;
my $PL_path;
sub find_PL {
my $build = shift;
for $PL (@SWIPL_BIN_NAMES) {
$PL_path = File::Which::which($PL) or next;
$build->log("Trying SWI-Prolog binary $PL ($PL_path)");
$PLVARS = Alien::SWIProlog::Util::get_plvars($PL);
keys %$PLVARS and last;
};
}
probe sub {
my $build = shift;
eval 'require Alien::SWIProlog::Util';
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Sortkeys = 1;
find_PL($build);
# when not found
return 'share' unless keys %$PLVARS;
$build->log( Dumper($PLVARS) );
my %threads_support = (
swipl_threads => $PLVARS->{PLTHREADS} eq 'yes',
perl_usethreads => defined($Config::Config{usethreads}),
perl_useithreads => defined($Config::Config{useithreads}),
);
my $all_threads = List::Util::all(
sub { $threads_support{$_} },
keys %threads_support );
my $all_nonthreads = List::Util::all(
sub { ! $threads_support{$_} },
keys %threads_support );
unless( $all_threads || $all_nonthreads ) {
$build->log(
"Threading models of SWI-Prolog and Perl do not match: "
. Dumper(\%threads_support)
);
return 'share';
}
my $prop = Alien::SWIProlog::Util::plvars_to_props($PL_path, $PLVARS);
eval {
require ExtUtils::CBuilder;
my $b = ExtUtils::CBuilder->new();
my $src = Path::Tiny->tempfile( SUFFIX => '.c' );
$src->spew_utf8($test_program);
$build->log('Compiling/linking test program');
my $obj = $b->compile(
source => "$src",
extra_compiler_flags => $prop->{cflags},
);
my $exe = $b->link_executable(
objects => $obj,
extra_linker_flags => $prop->{libs},
);
$build->log('Compiling/linking successful');
1;
} and return 'system';
$build->log('Compiling/linking unsuccessful');
return 'share';
};
sys {
gather sub {
my ($build) = @_;
eval 'require Alien::SWIProlog::Util';
find_PL($build);
my $prop = Alien::SWIProlog::Util::plvars_to_props($PL_path, $PLVARS);
$build->runtime_prop->{$_} = $prop->{$_} for keys %$prop;
};
};
share {
my $release_type = 'stable';
die "Release type must be either 'stable' or 'devel'"
unless $release_type =~ /^(stable|devel)$/;
plugin Download => (
# https://www.swi-prolog.org/download/stable/src/
# https://www.swi-prolog.org/download/devel/src/
url => "https://www.swi-prolog.org/download/$release_type/src/",
version => qr/swipl-([\d\.]+)\.tar\.gz/,
);
plugin Extract => 'tar.gz';
plugin 'Build::CMake';
patch sub {
my @files = qw( src/SWI-Prolog.h src/os/pl-prologflag.c src/pl-fli.c );
system( $^X, qw(-pi -e), q{ s/\bPL_version\b/Swi$&/ }, @files );
};
my $threads = $Config{useithreads} ? '-DMULTI_THREADED=ON' : '-DMULTI_THREADED=OFF';
my @other_cmake_args = ();
my $is_msys2_mingw = $^O eq 'MSWin32' && exists $ENV{MSYSTEM} && $ENV{MSYSTEM} =~ /^mingw(32|64)$/i;
if( $is_msys2_mingw && File::Which::which('cygpath') ) {
# Running under MSYS2
chomp( my $MINGW_ROOT = `cygpath -m /$ENV{MSYSTEM}` );
push @other_cmake_args, "-DMINGW_ROOT=$MINGW_ROOT";
# current build not set up to link with libarchive correctly
push @other_cmake_args, '-DSWIPL_PACKAGES_ARCHIVE=OFF';
}
my $is_strawberry = $^O eq 'MSWin32' && $Config{myuname} =~ /^Win32 strawberry-perl/;
( run in 0.662 second using v1.01-cache-2.11-cpan-e93a5daba3e )