Codebase list libfunction-parameters-perl / f202d3c
try to make maint/eumm-fixup.pl fully generic Lukas Mai 8 years ago
2 changed file(s) with 117 addition(s) and 51 deletion(s). Raw diff Collapse all Expand all
00 use strict;
11 use warnings;
22 use ExtUtils::MakeMaker;
3 use File::Spec ();
4 use File::Find ();
35
4 sub merge_key_into {
5 my ($href, $target, $source) = @_;
6 %{$href->{$target}} = (%{$href->{$target}}, %{delete $href->{$source}});
6 sub find_tests_recursively_in {
7 my ($dir) = @_;
8 -d $dir or die "$dir is not a directory";
9
10 my %seen;
11 my $wanted = sub {
12 /\.t\z/ or return;
13 my $directories = (File::Spec->splitpath($File::Find::name))[1];
14 my $depth = grep $_ ne '', File::Spec->splitdir($directories);
15 $seen{$depth} = 1;
16 };
17 File::Find::find($wanted, $dir);
18
19 join ' ',
20 map { $dir . '/*' x $_ . '.t' }
21 sort { $a <=> $b }
22 keys %seen
723 }
824
925 my %opt = (
3248 '$(OBJECT)' => join(' ', glob 'hax/*.c.inc'),
3349 },
3450
35 test => { TESTS => join(' ', map 't' . '/*' x $_ . '.t', 1 .. 4) },
51 test => { TESTS => find_tests_recursively_in('t') },
3652 );
3753
3854 {
4258 $opt{CONFIGURE_REQUIRES}{strict} ||= 0;
4359 $opt{CONFIGURE_REQUIRES}{warnings} ||= 0;
4460 $opt{CONFIGURE_REQUIRES}{'ExtUtils::MakeMaker'} ||= '6.48';
61 $opt{CONFIGURE_REQUIRES}{'File::Find'} ||= 0;
62 $opt{CONFIGURE_REQUIRES}{'File::Spec'} ||= 0;
4563
4664 my $module_file = $opt{NAME};
4765 $module_file =~ s!::!/!g;
8199 *ExtUtils::MM_Any::_add_requirements_to_meta_v1_4 = \&ExtUtils::MM_Any::_add_requirements_to_meta_v2;
82100 }
83101
84 if ($mm_version < 6.63_03) {
85 merge_key_into \%opt, 'BUILD_REQUIRES', 'TEST_REQUIRES';
86 }
102 {
103 my $merge_key_into = sub {
104 my ($target, $source) = @_;
105 %{$opt{$target}} = (%{$opt{$target}}, %{delete $opt{$source}});
106 };
87107
88 if ($mm_version < 6.55_01) {
89 merge_key_into \%opt, 'CONFIGURE_REQUIRES', 'BUILD_REQUIRES';
90 }
108 $merge_key_into->('BUILD_REQUIRES', 'TEST_REQUIRES')
109 if $mm_version < 6.63_03;
91110
92 if ($mm_version < 6.51_03) {
93 merge_key_into \%opt, 'PREREQ_PM', 'CONFIGURE_REQUIRES';
111 $merge_key_into->('CONFIGURE_REQUIRES', 'BUILD_REQUIRES')
112 if $mm_version < 6.55_01;
113
114 $merge_key_into->('PREREQ_PM', 'CONFIGURE_REQUIRES')
115 if $mm_version < 6.51_03;
94116 }
95117
96118 WriteMakefile %opt;
0 use v5.14;
0 use strict;
11 use warnings;
22
33 use Config ();
77 $args{text} || ''
88 }
99
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
3910 sub {
4011 my ($opt) = @_;
4112
42 $opt->{test}{TESTS} .= ' ' . join(' ', map 'xt' . '/*' x $_ . '.t', 1 .. 4);
13 $opt->{depend}{Makefile} .= ' ' . __FILE__;
4314
44 $opt->{postamble}{text} .= <<"__EOT__";
15 $opt->{test}{TESTS} .= ' ' . find_tests_recursively_in 'xt';
16
17 $opt->{postamble}{text} .= <<'__EOT__';
4518 export RELEASE_TESTING=1
4619 export HARNESS_OPTIONS=c
20 __EOT__
4721
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__";
4853 CCFLAGS += @ccflags -DDEVEL
4954 OTHERLDFLAGS += @otherldflags
50
5155 __EOT__
5256
53 if ($preload_libasan) {
54 $opt->{postamble}{text} .= <<'__EOT__';
57 if ($preload_libasan) {
58 $opt->{postamble}{text} .= <<'__EOT__';
5559 FULLPERLRUN := LD_PRELOAD="libasan.so $$LD_PRELOAD" $(FULLPERLRUN)
56
5760 __EOT__
61 }
5862 }
5963
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__';
61103 .PHONY: multitest
62104 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 \
65107 echo "Trying $$i ..."; \
66108 if $$i Makefile.PL && make && make test; then \
67109 k="$$k $$i"; \
73115 [ -z "$$k" ] || { echo "OK: $$k" >&2; } ; \
74116 [ -z "$$f" ] || { echo "Failed:$$f" >&2; exit 1; }
75117 __EOT__
118 $multitest =~ s/<PERL_PATTERN>/$perl_pattern/g;
119 $opt->{postamble}{text} .= $multitest;
76120 }