Skip to content

Commit 5dbcdf8

Browse files
committed
add test of XS loading other XS, using C symbols within
1 parent 38d3269 commit 5dbcdf8

File tree

1 file changed

+94
-0
lines changed
  • t/lib/MakeMaker/Test/Setup

1 file changed

+94
-0
lines changed

t/lib/MakeMaker/Test/Setup/XS.pm

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,98 @@ $label2files{subdirs} = +{
179179
};
180180
virtual_rename('subdirs', 'lib/XS/Test.pm', 'Test.pm');
181181

182+
# to mimic ExtUtils::Depends-facilitated B::Hooks::OP::Check
183+
$label2files{eud_produce} = +{
184+
%{ $label2files{basic} }, # make copy
185+
'Makefile.PL' => sprintf(
186+
$MAKEFILEPL, 'Other', 'Other.pm', qq{},
187+
q{
188+
DEFINE => '-DINVAR=input',
189+
FUNCLIST => [qw(is_odd)],
190+
DL_FUNCS => { 'XS::Other' => [] },
191+
},
192+
),
193+
'Other.pm' => do {
194+
my $t = $PM_OTHER; $t =~ s:bootstrap:sub dl_load_flags { 0x01 }\n$&:g; $t
195+
},
196+
'Other.xs' => $XS_OTHER,
197+
't/is_even.t' => $T_OTHER,
198+
};
199+
delete @{ $label2files{eud_produce} }{qw(lib/XS/Test.pm Test.xs)};
200+
201+
# to mimic ExtUtils::Depends-facilitated consuming B::Hooks::OP::Check
202+
$label2files{eud_consume} = +{
203+
%{ $label2files{basic} }, # make copy
204+
'Makefile.PL' => <<'EOF' .
205+
use File::Spec::Functions;
206+
my $root; BEGIN {$root = catdir(updir, qw(XS-Testeud_produce blib));}
207+
EOF
208+
sprintf(
209+
$MAKEFILEPL, 'Test', 'Test.pm', qq{'$typemap'},
210+
q{
211+
DEFINE => '-DINVAR=input',
212+
LIBS => join(' ', find_extra_libs({'XS::Other'=>undef}, [
213+
map catdir($root, $_), qw(lib arch)
214+
])),
215+
},
216+
) . <<'EOF',
217+
use Config;
218+
sub _quote_if_space { $_[0] =~ / / ? qq{"$_[0]"} : $_[0] }
219+
my %mappers; BEGIN { %mappers = (
220+
MSWin32 => sub { $_[0] . '\.(?:lib|a)' },
221+
cygwin => sub { $_[0] . '\.dll'},
222+
android => sub { $_[0] . '\.' . $Config{dlext} },
223+
); }
224+
sub find_extra_libs {
225+
my ($deps, $search) = @_;
226+
return () if !keys %$deps;
227+
my $mapper = $mappers{$^O};
228+
return () unless defined $mapper;
229+
require File::Find;
230+
my @found_libs = ();
231+
foreach my $name (keys %$deps) {
232+
my @parts = split /::/, $name;
233+
my ($stem) = defined &DynaLoader::mod2fname
234+
? DynaLoader::mod2fname(\@parts) : $parts[-1];
235+
my $lib = $mapper->($stem);
236+
my ($pattern, $matching_dir, $matching_file) = qr/$lib$/;
237+
File::Find::find(sub {
238+
return if !$matching_file or !/$pattern/;
239+
($matching_dir, $matching_file) = ($File::Find::dir, $File::Find::name);
240+
}, grep -d, @$search); # only extant dirs
241+
if ($matching_file && -f $matching_file) {
242+
push @found_libs,
243+
'-L' . _quote_if_space($matching_dir),
244+
'-l' . $stem;
245+
$found_libs[-1] = "-l:$stem.$Config{dlext}" if $^O eq 'android';
246+
}
247+
}
248+
@found_libs;
249+
}
250+
EOF
251+
'Test.pm' => do {
252+
my $t = $PM_TEST; $t =~ s:is_even:is_odd:g;
253+
$t =~ s/bootstrap/
254+
use File::Spec::Functions;
255+
my \$root; BEGIN {\$root = catdir(updir, qw(XS-Testeud_produce blib));}
256+
use lib map catdir(\$root, \$_), qw(lib arch);
257+
require XS::Other;\n$&
258+
/g;
259+
$t
260+
},
261+
'Test.xs' => do {
262+
my $t = $XS_OTHER; $t =~ s:Other:Test:g; $t =~ s:\{.*?\}:;:; $t
263+
},
264+
't/is_even.t' => <<'END',
265+
use strict;
266+
use warnings;
267+
use Test::More tests => 3;
268+
use_ok "XS::Test";
269+
ok XS::Test::is_odd(1);
270+
ok !XS::Test::is_odd(2);
271+
END
272+
};
273+
182274
# to mimic behaviour of Unicode-LineBreak version 2015.07.16
183275
$label2files{subdirscomplex} = +{
184276
%{ $label2files{'subdirs'} }, # make copy
@@ -412,6 +504,8 @@ sub list_dynamic {
412504
$^O !~ m!^(VMS|aix)$! ? ([ 'subdirscomplex', '', '' ]) : (),
413505
) : (), # DynaLoader different
414506
[ 'subdirs', '', '' ],
507+
[ 'eud_produce', '', '', 1 ],
508+
[ 'eud_consume', '', '' ],
415509
# https://github.com/Perl/perl5/issues/17601
416510
# https://rt.cpan.org/Ticket/Display.html?id=115321
417511
$^O ne 'MSWin32' ? (

0 commit comments

Comments
 (0)