Blame t/lib/t/LoadXS.pm

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;