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