use alienfile;
use Env::ShellWords qw( @LDFLAGS );
use Text::ParseWords qw( shellwords );
use FFI::CheckLib qw( find_lib_or_die );
configure { requires 'Env::ShellWords' => 0; requires 'FFI::CheckLib' => 0 };
plugin 'PkgConfig' => 'libcurl';
plugin 'Probe::CommandLine' => (
command => $_,
secondary => 1,
) for qw( curl-config curl );
meta->around_hook(probe => sub {
my $orig = shift;
my $build = shift;
my $type = $orig->($build,@_);
if($type eq 'system')
{
find_lib_or_die lib => 'curl';
}
$type;
});
share {
my $alien_ssl = 'Alien::OpenSSL';
my @acflags;
# - schannel is the native SSL on windows
if($^O eq 'MSWin32')
{
unshift @acflags, '--with-schannel';
undef $alien_ssl;
}
# - libressl is the native SSL on openbsd and would be expected to be used there.
elsif($^O eq 'openbsd')
{
$alien_ssl = 'Alien::LibreSSL';
unshift @acflags, '--with-openssl';
}
# - macOS has its own native SSL implementation which is supported by curl
elsif($^O eq 'darwin')
{
unshift @acflags, '--with-secure-transport';
undef $alien_ssl;
}
# - elsewhere OpenSSL is probably a reasonable option
else
{
unshift @acflags, '--with-openssl';
}
if($alien_ssl)
{
if($alien_ssl eq 'Alien::OpenSSL')
{
requires $alien_ssl => '0.15';
}
else
{
requires $alien_ssl => 0;
}
# Build::SearchDep should have an option to do just this
# without modifying the build stage
# https://github.com/PerlAlien/Alien-Build/issues/373
meta->after_hook(
gather_share => sub {
my($build) = @_;
$build->runtime_prop->{$_} .= $alien_ssl->$_ for qw( libs libs_static cflags cflags_static );
}
);
}
plugin Download => (
url => 'https://curl.haxx.se/download/',
version => qr/^curl-([0-9\.]+)\.tar\.gz$/,
);
plugin Extract => 'tar.gz';
# make sure that curl uses the linker flags
# from our Alien SSL
if($alien_ssl)
{
meta->around_hook( $_ => sub {
my $orig = shift;
my $build = shift;
local $ENV{LDFLAGS} = $ENV{LDFLAGS};
unshift @LDFLAGS, grep /^-L/, shellwords( $alien_ssl->libs );
log "using LDFLAGS = $ENV{LDFLAGS}";
$orig->($build, @_);
}) for qw( build build_ffi );
}
plugin 'Build::Autoconf' => ();
build [
"%{configure} --disable-shared --enable-static @acflags",
'%{make}',
'%{make} install',
];
after gather => sub {
my $build = shift;
return unless $alien_ssl;
$build->install_prop->{libs_static} = join(' ',
$build->install_prop->{libs_static},
grep /^-L/,
shellwords( $alien_ssl->libs ),
);
};
requires 'Path::Tiny';
my $ffi_target = '%{.install.autoconf_prefix}/dynamic';
ffi {
my $patch_makefile = sub {
my ($build) = @_;
# should also check curl version as change is not needed from 7.88
return if $^O ne 'MSWin32';
my $target_file = "src/Makefile";
$build->log ("Patching $target_file for share build");
my $target_text
= quotemeta '$(LIBTOOL) --tag=RC --mode=compile $(RC) -I$(top_srcdir)/include';
my $new_text
= '$(RC) -I$(top_srcdir)/include';
Path::Tiny->new($target_file)->edit_raw(sub {s/^(\s+)$target_text/$1$new_text/ms});
return;
};
build [
"%{configure} --enable-shared --disable-static --bindir=$ffi_target --libdir=$ffi_target @acflags",
$patch_makefile,
'%{make}',
'%{make} install',
sub {
my $build = shift;
return unless $^O eq 'MSWin32';
my $root = Path::Tiny->new($ENV{DESTDIR})->child($build->install_prop->{autoconf_prefix});
log "re-routing DLLs in $root";
foreach my $from (grep /\.dll$/i, $root->child('bin')->children)
{
my $to = $root->child('dynamic', $from->basename);
log "move $from => $to";
$from->move($to);
}
},
];
};
};