0 | |
use v5.14;
|
|
0 |
use strict;
|
1 | 1 |
use warnings;
|
2 | 2 |
|
3 | 3 |
use Config ();
|
|
7 | 7 |
$args{text} || ''
|
8 | 8 |
}
|
9 | 9 |
|
10 | |
my $preload_libasan;
|
11 | |
|
12 | |
my @ccflags;
|
13 | |
my @otherldflags;
|
14 | |
|
15 | |
if (-e '/dev/null') {
|
16 | |
my $good_cc_flag = sub {
|
17 | |
system("echo 'int main(void) { return 0; }' | \Q$Config::Config{cc}\E @_ -xc - -o /dev/null") == 0
|
18 | |
};
|
19 | |
for my $flag (qw(-fsanitize=address -fsanitize=undefined)) {
|
20 | |
if (!$good_cc_flag->($flag)) {
|
21 | |
warn "!! Your C compiler ($Config::Config{cc}) doesn't seem to support '$flag'. Skipping ...\n";
|
22 | |
next;
|
23 | |
}
|
24 | |
push @ccflags, $flag;
|
25 | |
push @otherldflags, $flag;
|
26 | |
}
|
27 | |
|
28 | |
{
|
29 | |
local $ENV{LD_PRELOAD} = 'libasan.so ' . ($ENV{LD_PRELOAD} // '');
|
30 | |
my $out = `"$^X" -e 0 2>&1`;
|
31 | |
if ($out eq '') {
|
32 | |
$preload_libasan = 1;
|
33 | |
} else {
|
34 | |
warn qq{LD_PRELOAD="$ENV{LD_PRELOAD}" "$^X" failed:\n${out}Skipping ...\n};
|
35 | |
}
|
36 | |
}
|
37 | |
}
|
38 | |
|
39 | 10 |
sub {
|
40 | 11 |
my ($opt) = @_;
|
41 | 12 |
|
42 | |
$opt->{test}{TESTS} .= ' ' . join(' ', map 'xt' . '/*' x $_ . '.t', 1 .. 4);
|
|
13 |
$opt->{depend}{Makefile} .= ' ' . __FILE__;
|
43 | 14 |
|
44 | |
$opt->{postamble}{text} .= <<"__EOT__";
|
|
15 |
$opt->{test}{TESTS} .= ' ' . find_tests_recursively_in 'xt';
|
|
16 |
|
|
17 |
$opt->{postamble}{text} .= <<'__EOT__';
|
45 | 18 |
export RELEASE_TESTING=1
|
46 | 19 |
export HARNESS_OPTIONS=c
|
|
20 |
__EOT__
|
47 | 21 |
|
|
22 |
if (exists $opt->{PREREQ_PM}{XSLoader}) {
|
|
23 |
my $preload_libasan;
|
|
24 |
|
|
25 |
my @ccflags;
|
|
26 |
my @otherldflags;
|
|
27 |
|
|
28 |
if (-e '/dev/null') {
|
|
29 |
my $good_cc_flag = sub {
|
|
30 |
system("echo 'int main(void) { return 0; }' | \Q$Config::Config{cc}\E @_ -xc - -o /dev/null") == 0
|
|
31 |
};
|
|
32 |
for my $flag (qw(-fsanitize=address -fsanitize=undefined)) {
|
|
33 |
if (!$good_cc_flag->($flag)) {
|
|
34 |
warn "!! Your C compiler ($Config::Config{cc}) doesn't seem to support '$flag'. Skipping ...\n";
|
|
35 |
next;
|
|
36 |
}
|
|
37 |
push @ccflags, $flag;
|
|
38 |
push @otherldflags, $flag;
|
|
39 |
}
|
|
40 |
|
|
41 |
{
|
|
42 |
local $ENV{LD_PRELOAD} = 'libasan.so ' . ($ENV{LD_PRELOAD} || '');
|
|
43 |
my $out = `"$^X" -e 0 2>&1`;
|
|
44 |
if ($out eq '') {
|
|
45 |
$preload_libasan = 1;
|
|
46 |
} else {
|
|
47 |
warn qq{LD_PRELOAD="$ENV{LD_PRELOAD}" "$^X" failed:\n${out}Skipping ...\n};
|
|
48 |
}
|
|
49 |
}
|
|
50 |
}
|
|
51 |
|
|
52 |
$opt->{postamble}{text} .= <<"__EOT__";
|
48 | 53 |
CCFLAGS += @ccflags -DDEVEL
|
49 | 54 |
OTHERLDFLAGS += @otherldflags
|
50 | |
|
51 | 55 |
__EOT__
|
52 | 56 |
|
53 | |
if ($preload_libasan) {
|
54 | |
$opt->{postamble}{text} .= <<'__EOT__';
|
|
57 |
if ($preload_libasan) {
|
|
58 |
$opt->{postamble}{text} .= <<'__EOT__';
|
55 | 59 |
FULLPERLRUN := LD_PRELOAD="libasan.so $$LD_PRELOAD" $(FULLPERLRUN)
|
56 | |
|
57 | 60 |
__EOT__
|
|
61 |
}
|
58 | 62 |
}
|
59 | 63 |
|
60 | |
$opt->{postamble}{text} .= <<'__EOT__';
|
|
64 |
my $perl_pattern = '*';
|
|
65 |
if ($opt->{MIN_PERL_VERSION}) {
|
|
66 |
my ($ver, $subver) = $opt->{MIN_PERL_VERSION} =~ /\A5\.(\d{1,3})\.(\d{1,3})\z/
|
|
67 |
or die "Can't parse MIN_PERL_VERSION '$opt->{MIN_PERL_VERSION}'";
|
|
68 |
|
|
69 |
my $genverpat = sub {
|
|
70 |
my ($num, $width) = @_;
|
|
71 |
$num = sprintf '%0*d', $width, $num
|
|
72 |
if $width;
|
|
73 |
|
|
74 |
my $i_last = length($num) - 1;
|
|
75 |
|
|
76 |
my @pat;
|
|
77 |
for my $i (0 .. $i_last) {
|
|
78 |
my $pre = substr $num, 0, $i;
|
|
79 |
$pre =~ s/\A0+//;
|
|
80 |
my $x = substr $num, $i, 1;
|
|
81 |
if ($i < $i_last) {
|
|
82 |
next if $x eq '9';
|
|
83 |
$x++;
|
|
84 |
}
|
|
85 |
$x = "[$x-9]"
|
|
86 |
unless $x eq '9';
|
|
87 |
my $post = '[0-9]' x ($i_last - $i);
|
|
88 |
push @pat, $pre . $x . $post;
|
|
89 |
}
|
|
90 |
|
|
91 |
'{' . join(',', reverse @pat) . '}'
|
|
92 |
};
|
|
93 |
|
|
94 |
my $pat = $genverpat->($ver + ($subver != 0), 3) . '.[0-9]';
|
|
95 |
if ($subver) {
|
|
96 |
$pat = "{$ver." . $genverpat->($subver, 3) . ",$pat}";
|
|
97 |
}
|
|
98 |
|
|
99 |
$perl_pattern = "*5.$pat*";
|
|
100 |
}
|
|
101 |
|
|
102 |
my $multitest = <<'__EOT__';
|
61 | 103 |
.PHONY: multitest
|
62 | 104 |
multitest:
|
63 | |
f=''; k=''; \
|
64 | |
for i in "$$PERLBREW_ROOT"/perls/*5.{1[46789],2}*/bin/perl perl; do \
|
|
105 |
shopt -s nullglob; f=''; k=''; \
|
|
106 |
for i in "$$PERLBREW_ROOT"/perls/<PERL_PATTERN>/bin/perl perl; do \
|
65 | 107 |
echo "Trying $$i ..."; \
|
66 | 108 |
if $$i Makefile.PL && make && make test; then \
|
67 | 109 |
k="$$k $$i"; \
|
|
73 | 115 |
[ -z "$$k" ] || { echo "OK: $$k" >&2; } ; \
|
74 | 116 |
[ -z "$$f" ] || { echo "Failed:$$f" >&2; exit 1; }
|
75 | 117 |
__EOT__
|
|
118 |
$multitest =~ s/<PERL_PATTERN>/$perl_pattern/g;
|
|
119 |
$opt->{postamble}{text} .= $multitest;
|
76 | 120 |
}
|