package t::LoadXS;
use warnings;
use strict;
use DynaLoader ();
use ExtUtils::CBuilder ();
use ExtUtils::ParseXS ();
use File::Spec ();
our @todelete;
END { unlink @todelete; }
sub load_xs($$$) {
my($basename, $dir, $extralibs) = @_;
my $xs_file = File::Spec->catdir("t", "$basename.xs");
my $c_file = File::Spec->catdir("t", "$basename.c");
ExtUtils::ParseXS::process_file(
filename => $xs_file,
output => $c_file,
);
push @todelete, $c_file;
my $cb = ExtUtils::CBuilder->new(quiet => 1);
my $o_file = $cb->compile(source => $c_file);
push @todelete, $o_file;
my($so_file, @so_tmps) = $cb->link(objects => [ $o_file, @$extralibs ],
module_name => "t::$basename");
push @todelete, $so_file, @so_tmps;
my $boot_symbol = "boot_t__$basename";
@DynaLoader::dl_require_symbols = ($boot_symbol);
my $so_handle = DynaLoader::dl_load_file($so_file, 0);
defined $so_handle or die(DynaLoader::dl_error());
my $boot_func = DynaLoader::dl_find_symbol($so_handle, $boot_symbol);
defined $boot_func or die "symbol $boot_symbol not found in $so_file";
my $boot_perlname = "t::${basename}::bootstrap";
DynaLoader::dl_install_xsub($boot_perlname, $boot_func, $so_file)->();
}
1;