use 5.010;
use alienfile;
use Sort::Versions;
use Path::Tiny qw /path/;
my $on_windows = $^O =~ /mswin/i;
my $on_automated_rig
= $ENV{PERL_CPAN_REPORTER_DIR}
|| $ENV{PERL_CPAN_REPORTER_CONFIG}
|| $ENV{AUTOMATED_TESTING}
|| $ENV{TRAVIS}
|| $ENV{APPVEYOR}
|| $ENV{CI};
use Cwd;
my $base_dir = getcwd();
# make libtool noisy for debug purposes
#$ENV{LTFLAGS} = "--debug --verbose" if $on_windows;
use Env qw { @PATH };
my $min_target_version = '3.26.0';
plugin 'PkgConfig' => (
pkg_name => 'sqlite3',
minimum_version => $min_target_version,
);
plugin 'Probe::CommandLine' => (
command => 'sqlite3',
#args => [ '--version' ],
#match => qr/\d+\.\d+\.\d+ \d{4}-\d{2}-\d{2}/,
#version => qr/gzip ([0-9\.]+)/,
secondary => 1, # secondary to pkgconf probe
);
# need to check if we have sqlite headers
# as dependent aliens like proj need them
#probe sub {
# my($build) = @_; # $build is the Alien::Build instance.
# system 'pkg-config --exists libfoo';
# $? == 0 ? 'system' : 'share';
#};
share {
my $with_local = '';
my $with_cpp11 = '';
# need to work out how to get latest without updating next lines
start_url 'https://www.sqlite.org/2022/sqlite-autoconf-3390300.tar.gz';
plugin Download => (
version => '3.39.3',
);
my $lib_version = get_lib_version() // 'not yet defined';
say "Downloaded version is $lib_version";
plugin Extract => (format => 'tar.gz');
plugin 'Build::Autoconf' => ();
my $build_static = ($^O =~ /mswin/i) ? '' : '--disable-shared';
$build_static = '';
$build_static = '--enable-static=no'; # override - needed? leftover from gdal
$build_static = '' if $ENV{FORCE_DYNAMIC};
if ($^O =~ /bsd/) {
plugin 'Build::Make' => 'gmake';
if (-d '/usr/local') {
$with_local = ' --with-local=/usr/local ';
}
}
elsif ($^O =~ /dragonfly/) {
# might need to be combined with bsd check above
# but not sure if /usr/local is needed yet
plugin 'Build::Make' => 'gmake';
}
my $make_cmd = '%{make}';
my $make_inst_cmd = '%{make} install';
my @make_clean;
# try not to exceed the cpan-testers log limits
if ($on_automated_rig) {
say "Running under CI or automated testing";
$make_cmd .= q/ | perl -ne "BEGIN {$|=1; open our $log, q|>|, q|build.log|}; print qq|\n| if 0 == ($. %% 100); print q|.|; print {$log} $_;" || type build.log/;
$make_inst_cmd .= q/ | perl -ne "BEGIN {$|=1; open our $log, q|>|, q|install.log|}; print qq|\n| if 0 == ($. %% 100); print q|.|; print {$log} $_;" || type install.log/;
if (!$on_windows) {
$make_cmd =~ s/%%/%/;
$make_cmd =~ s/type/cat/;
$make_cmd =~ s/"/'/g;
$make_inst_cmd =~ s/%%/%/;
$make_inst_cmd =~ s/type/cat/;
$make_inst_cmd =~ s/"/'/g;
}
#if (! ($ENV{TRAVIS} || $ENV{APPVEYOR})) {
# push @make_clean, '%{make} clean';
#}
# clean up the build dir on cpan testers etc
plugin 'Cleanse::BuildDir';
}
meta->around_hook( build => \&remove_gitfw_from_path );
meta->around_hook(
build => sub {
my ($orig, $build, @args) = @_;
$build->log("Setting CCACHE_BASEDIR to " . getcwd());
local $ENV{CCACHE_BASEDIR} = getcwd();
$orig->($build, @args);
}
);
build [
"%{configure} $with_local $with_cpp11 $build_static",
\&pause,
$make_cmd,
$make_inst_cmd,
#@make_clean,
];
};
# git for windows clashes with MSYS
# if its /usr/bin dir is in the path
sub remove_gitfw_from_path {
my ($orig, $build, @args) = @_;
return $orig->($build, @args)
if !$on_windows;
local $ENV{PATH} = $ENV{PATH};
my $msys_path = eval {
path('Alien::MSYS'->msys_path())
};
return if !defined $msys_path;
my $count = @PATH;
@PATH
= grep {path($_)->stringify =~ m|/usr/bin$| && path($_) ne $msys_path ? () : $_}
grep {defined $_} # undef paths cause issues with Path::Tiny
@PATH;
my $removed = $count - @PATH;
if ($removed) {
$build->log ("$removed additional .../usr/bin dirs were removed from the path for compilation");
}
$orig->($build, @args);
}
sub pause {
return; # re-enable in case of debug
return if $on_automated_rig;
return if !$on_windows;
say "CONTINUE?";
my $response = <>;
while (not $response =~ /yes/) {
$response = <>;
}
}
sub get_lib_version {
my $h = get_alien_state_hash();
return $h->{runtime}{version};
}
sub get_alien_state_hash {
use JSON::PP;
my $root = "$base_dir/_alien";
my $f = "$root/state.json";
my $h = {};
if (-e $f) {
open my $fh, '<', $f or die $!;
my $d = do {
local $/ = undef;
<$fh>;
};
$h = JSON::PP::decode_json($d);
}
return $h;
}