Commit | Line | Data |
---|---|---|
6a8dbfd7 NC |
1 | #!/usr/bin/perl -w |
2 | use strict; | |
3 | ||
390a69a9 | 4 | use Getopt::Long qw(:config bundling no_auto_abbrev); |
77ae6092 | 5 | use Pod::Usage; |
2526f4b8 | 6 | use Config; |
6a8dbfd7 | 7 | |
2526f4b8 NC |
8 | my @targets |
9 | = qw(config.sh config.h miniperl lib/Config.pm Fcntl perl test_prep); | |
6a8dbfd7 | 10 | |
e4516dd0 NC |
11 | my $cpus; |
12 | if (open my $fh, '<', '/proc/cpuinfo') { | |
13 | while (<$fh>) { | |
14 | ++$cpus if /^processor\s+:\s+\d+$/; | |
15 | } | |
d64af352 NC |
16 | } elsif (-x '/sbin/sysctl') { |
17 | $cpus = 1 + $1 if `/sbin/sysctl hw.ncpu` =~ /^hw\.ncpu: (\d+)$/; | |
da83cd31 NC |
18 | } elsif (-x '/usr/bin/getconf') { |
19 | $cpus = 1 + $1 if `/usr/bin/getconf _NPROCESSORS_ONLN` =~ /^(\d+)$/; | |
e4516dd0 NC |
20 | } |
21 | ||
f4800c99 NC |
22 | my %options = |
23 | ( | |
e4516dd0 | 24 | jobs => defined $cpus ? $cpus + 1 : 2, |
f4800c99 NC |
25 | 'expect-pass' => 1, |
26 | clean => 1, # mostly for debugging this | |
27 | ); | |
6a8dbfd7 | 28 | |
fdbac266 NC |
29 | my $linux64 = `uname -sm` eq "Linux x86_64\n" ? '64' : ''; |
30 | ||
599ee4f7 NC |
31 | my @paths; |
32 | ||
33 | if ($^O eq 'linux') { | |
34 | # This is the search logic for a multi-arch library layout | |
35 | # added to linux.sh in commits 40f026236b9959b7 and dcffd848632af2c7. | |
36 | my $gcc = -x '/usr/bin/gcc' ? '/usr/bin/gcc' : 'gcc'; | |
37 | ||
38 | foreach (`$gcc -print-search-dirs`) { | |
39 | next unless /^libraries: =(.*)/; | |
40 | foreach (split ':', $1) { | |
41 | next if m/gcc/; | |
42 | next unless -d $_; | |
43 | s!/$!!; | |
44 | push @paths, $_; | |
45 | } | |
46 | } | |
47 | } | |
48 | ||
49 | push @paths, map {$_ . $linux64} qw(/usr/local/lib /lib /usr/lib); | |
390a69a9 NC |
50 | |
51 | my %defines = | |
52 | ( | |
53 | usedevel => '', | |
54 | optimize => '-g', | |
55 | cc => 'ccache gcc', | |
56 | ld => 'gcc', | |
fdbac266 | 57 | ($linux64 ? (libpth => \@paths) : ()), |
390a69a9 NC |
58 | ); |
59 | ||
f4800c99 NC |
60 | unless(GetOptions(\%options, |
61 | 'target=s', 'jobs|j=i', 'expect-pass=i', | |
62 | 'expect-fail' => sub { $options{'expect-pass'} = 0; }, | |
63 | 'clean!', 'one-liner|e=s', 'match=s', 'force-manifest', | |
77ae6092 | 64 | 'test-build', 'check-args', 'A=s@', 'usage|help|?', |
390a69a9 NC |
65 | 'D=s@' => sub { |
66 | my (undef, $val) = @_; | |
67 | if ($val =~ /\A([^=]+)=(.*)/s) { | |
68 | $defines{$1} = length $2 ? $2 : "\0"; | |
69 | } else { | |
70 | $defines{$val} = ''; | |
71 | } | |
72 | }, | |
73 | 'U=s@' => sub { | |
74 | $defines{$_[1]} = undef; | |
75 | }, | |
6a8dbfd7 | 76 | )) { |
77ae6092 | 77 | pod2usage(exitval => 255, verbose => 1); |
6a8dbfd7 NC |
78 | } |
79 | ||
f4800c99 | 80 | my ($target, $j, $match) = @options{qw(target jobs match)}; |
e295b7be | 81 | |
77ae6092 NC |
82 | pod2usage(exitval => 255, verbose => 1) if $options{usage}; |
83 | pod2usage(exitval => 255, verbose => 1) | |
84 | unless @ARGV || $match || $options{'test-build'} || defined $options{'one-liner'}; | |
6a8dbfd7 | 85 | |
f4800c99 | 86 | exit 0 if $options{'check-args'}; |
6a8dbfd7 | 87 | |
77ae6092 NC |
88 | =head1 NAME |
89 | ||
90 | bisect.pl - use git bisect to pinpoint changes | |
91 | ||
92 | =head1 SYNOPSIS | |
93 | ||
94 | # When did this become an error? | |
95 | .../Porting/bisect.pl -e 'my $a := 2;' | |
71d80638 | 96 | # When did this stop being an error? |
77ae6092 NC |
97 | .../Porting/bisect.pl --expect-fail -e '1 // 2' |
98 | # When did this stop matching? | |
99 | .../Porting/bisect.pl --match '\b(?:PL_)hash_seed_set\b' | |
100 | # When did this start matching? | |
101 | .../Porting/bisect.pl --expect-fail --match '\buseithreads\b' | |
102 | # When did this test program stop working? | |
d398528a | 103 | .../Porting/bisect.pl -- ./perl -Ilib ../test_prog.pl |
77ae6092 NC |
104 | # When did this first become valid syntax? |
105 | .../Porting/bisect.pl --target=miniperl --end=v5.10.0 \ | |
106 | --expect-fail -e 'my $a := 2;' | |
107 | # What was the last revision to build with these options? | |
108 | .../Porting/bisect.pl --test-build -Dd_dosuid | |
109 | ||
110 | =head1 DESCRIPTION | |
111 | ||
facd1b88 | 112 | Together F<bisect.pl> and F<bisect-runner.pl> attempt to automate the use |
77ae6092 NC |
113 | of C<git bisect> as much as possible. With one command (and no other files) |
114 | it's easy to find out | |
115 | ||
116 | =over 4 | |
117 | ||
118 | =item * | |
119 | ||
120 | Which commit caused this example code to break? | |
121 | ||
122 | =item * | |
123 | ||
124 | Which commit caused this example code to start working? | |
125 | ||
126 | =item * | |
127 | ||
128 | Which commit added the first to match this regex? | |
129 | ||
130 | =item * | |
131 | ||
132 | Which commit removed the last to match this regex? | |
133 | ||
134 | =back | |
135 | ||
136 | usually without needing to know which versions of perl to use as start and | |
137 | end revisions. | |
138 | ||
facd1b88 | 139 | By default F<bisect.pl> will process all options, then use the rest of the |
77ae6092 NC |
140 | command line as arguments to list C<system> to run a test case. By default, |
141 | the test case should pass (exit with 0) on earlier perls, and fail (exit | |
facd1b88 | 142 | non-zero) on I<blead>. F<bisect.pl> will use F<bisect-runner.pl> to find the |
77ae6092 | 143 | earliest stable perl version on which the test case passes, check that it |
facd1b88 | 144 | fails on blead, and then use F<bisect-runner.pl> with C<git bisect run> to |
77ae6092 NC |
145 | find the commit which caused the failure. |
146 | ||
147 | Because the test case is the complete argument to C<system>, it is easy to | |
148 | run something other than the F<perl> built, if necessary. If you need to run | |
149 | the perl built, you'll probably need to invoke it as C<./perl -Ilib ...> | |
150 | ||
5842706e NC |
151 | You need a clean checkout to run a bisect, and you can't use the checkout |
152 | which contains F<Porting/bisect.pl> (because C<git bisect>) will check out | |
153 | a revision before F<Porting/bisect-runner.pl> was added, which | |
154 | C<git bisect run> needs). If your working checkout is called F<perl>, the | |
155 | simplest solution is to make a local clone, and run from that. I<i.e.>: | |
156 | ||
157 | cd .. | |
158 | git clone perl perl2 | |
159 | cd perl2 | |
160 | ../perl/Porting/bisect.pl ... | |
161 | ||
facd1b88 | 162 | By default, F<bisect-runner.pl> will automatically disable the build of |
cfadff5f NC |
163 | L<DB_File> for commits earlier than ccb44e3bf3be2c30, as it's not practical |
164 | to patch DB_File 1.70 and earlier to build with current Berkeley DB headers. | |
165 | (ccb44e3bf3be2c30 was in September 1999, between 5.005_62 and 5.005_63.) | |
166 | If your F<db.h> is old enough you can override this with C<-Unoextensions>. | |
167 | ||
77ae6092 NC |
168 | =head1 OPTIONS |
169 | ||
170 | =over 4 | |
171 | ||
172 | =item * | |
173 | ||
174 | --start I<commit-ish> | |
175 | ||
176 | Earliest revision to test, as a I<commit-ish> (a tag, commit or anything | |
facd1b88 | 177 | else C<git> understands as a revision). If not specified, F<bisect.pl> will |
77ae6092 NC |
178 | search stable perl releases from 5.002 to 5.14.0 until it finds one where |
179 | the test case passes. | |
180 | ||
181 | =item * | |
182 | ||
183 | --end I<commit-ish> | |
184 | ||
185 | Most recent revision to test, as a I<commit-ish>. If not specified, defaults | |
b4f0ec5f | 186 | to I<blead>. |
77ae6092 NC |
187 | |
188 | =item * | |
189 | ||
190 | --target I<target> | |
191 | ||
192 | F<Makefile> target (or equivalent) needed, to run the test case. If specified, | |
193 | this should be one of | |
194 | ||
195 | =over 4 | |
196 | ||
197 | =item * | |
198 | ||
199 | I<config.sh> | |
200 | ||
facd1b88 | 201 | Just run F<./Configure> |
77ae6092 NC |
202 | |
203 | =item * | |
204 | ||
205 | I<config.h> | |
206 | ||
207 | Run the various F<*.SH> files to generate F<Makefile>, F<config.h>, I<etc>. | |
208 | ||
209 | =item * | |
210 | ||
211 | I<miniperl> | |
212 | ||
213 | Build F<miniperl>. | |
214 | ||
215 | =item * | |
216 | ||
217 | I<lib/Config.pm> | |
218 | ||
219 | Use F<miniperl> to build F<lib/Config.pm> | |
220 | ||
221 | =item * | |
222 | ||
2526f4b8 NC |
223 | I<Fcntl> |
224 | ||
225 | Build F<lib/auto/Fcntl/Fnctl.so> (strictly, C<.$Config{so}>). As L<Fcntl> | |
226 | is simple XS module present since 5.000, this provides a fast test of | |
b4f0ec5f | 227 | whether XS modules can be built. Note, XS modules are built by F<miniperl>, |
2526f4b8 NC |
228 | hence this target will not build F<perl>. |
229 | ||
230 | =item * | |
231 | ||
77ae6092 NC |
232 | I<perl> |
233 | ||
234 | Build F<perl>. This also builds pure-Perl modules in F<cpan>, F<dist> and | |
2526f4b8 NC |
235 | F<ext>. XS modules (such as L<Fcntl>) are not built. |
236 | ||
237 | =item * | |
238 | ||
77ae6092 NC |
239 | I<test_prep> |
240 | ||
241 | Build everything needed to run the tests. This is the default if we're | |
242 | running test code, but is time consuming, as it means building all | |
b4f0ec5f | 243 | XS modules. For older F<Makefile>s, the previous name of C<test-prep> |
77ae6092 NC |
244 | is automatically substituted. For very old F<Makefile>s, C<make test> is |
245 | run, as there is no target provided to just get things ready, and for 5.004 | |
246 | and earlier the tests run very quickly. | |
247 | ||
248 | =back | |
249 | ||
250 | =item * | |
251 | ||
252 | --one-liner 'code to run' | |
253 | ||
254 | =item * | |
255 | ||
256 | -e 'code to run' | |
257 | ||
a1756669 | 258 | Example code to run, just like you'd use with C<perl -e>. |
77ae6092 NC |
259 | |
260 | This prepends C<./perl -Ilib -e 'code to run'> to the test case given, | |
facd1b88 | 261 | or F<./miniperl> if I<target> is C<miniperl>. |
77ae6092 NC |
262 | |
263 | (Usually you'll use C<-e> instead of providing a test case in the | |
facd1b88 | 264 | non-option arguments to F<bisect.pl>) |
77ae6092 NC |
265 | |
266 | C<-E> intentionally isn't supported, as it's an error in 5.8.0 and earlier, | |
267 | which interferes with detecting errors in the example code itself. | |
268 | ||
269 | =item * | |
270 | ||
271 | --expect-fail | |
272 | ||
273 | The test case should fail for the I<start> revision, and pass for the I<end> | |
274 | revision. The bisect run will find the first commit where it passes. | |
275 | ||
276 | =item * | |
277 | ||
af7c500f | 278 | -Dnoextensions=Encode |
77ae6092 NC |
279 | |
280 | =item * | |
281 | ||
282 | -Uusedevel | |
283 | ||
284 | =item * | |
285 | ||
286 | -Accflags=-DNO_MATHOMS | |
287 | ||
288 | Arguments to pass to F<Configure>. Repeated C<-A> arguments are passed | |
289 | through as is. C<-D> and C<-U> are processed in order, and override | |
af7c500f NC |
290 | previous settings for the same parameter. F<bisect-runner.pl> emulates |
291 | C<-Dnoextensions> when F<Configure> itself does not provide it, as it's | |
292 | often very useful to be able to disable some XS extensions. | |
77ae6092 NC |
293 | |
294 | =item * | |
295 | ||
b4f0ec5f | 296 | --jobs I<jobs> |
77ae6092 NC |
297 | |
298 | =item * | |
299 | ||
b4f0ec5f | 300 | -j I<jobs> |
77ae6092 | 301 | |
da83cd31 NC |
302 | Number of C<make> jobs to run in parallel. If F</proc/cpuinfo> exists and |
303 | can be parsed, or F</sbin/sysctl> exists and reports C<hw.ncpu>, or | |
304 | F</usr/bin/getconf> exists and reports C<_NPROCESSORS_ONLN> defaults to 1 + | |
305 | I<number of CPUs>. Otherwise defaults to 2. | |
77ae6092 NC |
306 | |
307 | =item * | |
308 | ||
b4f0ec5f | 309 | --match pattern |
77ae6092 NC |
310 | |
311 | Instead of running a test program to determine I<pass> or I<fail>, pass | |
312 | if the given regex matches, and hence search for the commit that removes | |
313 | the last matching file. | |
314 | ||
315 | If no I<target> is specified, the match is against all files in the | |
316 | repository (which is fast). If a I<target> is specified, that target is | |
317 | built, and the match is against only the built files. C<--expect-fail> can | |
318 | be used with C<--match> to search for a commit that adds files that match. | |
319 | ||
320 | =item * | |
321 | ||
322 | --test-build | |
323 | ||
324 | Test that the build completes, without running any test case. | |
325 | ||
326 | By default, if the build for the desired I<target> fails to complete, | |
327 | F<bisect-runner.pl> reports a I<skip> back to C<git bisect>, the assumption | |
328 | being that one wants to find a commit which changed state "builds && passes" | |
329 | to "builds && fails". If instead one is interested in which commit broke the | |
330 | build (possibly for particular F<Configure> options), use I<--test-build> | |
331 | to treat a build failure as a failure, not a "skip". | |
332 | ||
b4f0ec5f NC |
333 | Often this option isn't as useful as it first seems, because I<any> build |
334 | failure will be reported to C<git bisect> as a failure, not just the failure | |
335 | that you're interested in. Generally, to debug a particular problem, it's | |
336 | more useful to use a I<target> that builds properly at the point of interest, | |
337 | and then a test case that runs C<make>. For example: | |
338 | ||
339 | .../Porting/bisect.pl --start=perl-5.000 --end=perl-5.002 \ | |
340 | --expect-fail --force-manifest --target=miniperl make perl | |
341 | ||
facd1b88 NC |
342 | will find the first revision capable of building L<DynaLoader> and then |
343 | F<perl>, without becoming confused by revisions where F<miniperl> won't | |
b4f0ec5f NC |
344 | even link. |
345 | ||
77ae6092 NC |
346 | =item * |
347 | ||
b4f0ec5f NC |
348 | --force-manifest |
349 | ||
77ae6092 NC |
350 | By default, a build will "skip" if any files listed in F<MANIFEST> are not |
351 | present. Usually this is useful, as it avoids false-failures. However, there | |
352 | are some long ranges of commits where listed files are missing, which can | |
353 | cause a bisect to abort because all that remain are skipped revisions. | |
354 | ||
355 | In these cases, particularly if the test case uses F<miniperl> and no modules, | |
356 | it may be more useful to force the build to continue, even if files | |
357 | F<MANIFEST> are missing. | |
358 | ||
359 | =item * | |
360 | ||
361 | --expect-pass [0|1] | |
362 | ||
363 | C<--expect-pass=0> is equivalent to C<--expect-fail>. I<1> is the default. | |
364 | ||
365 | =item * | |
366 | ||
367 | --no-clean | |
368 | ||
369 | Tell F<bisect-runner.pl> not to clean up after the build. This allows one | |
370 | to use F<bisect-runner.pl> to build the current particular perl revision for | |
371 | interactive testing, or for debugging F<bisect-runner.pl>. | |
372 | ||
373 | Passing this to F<bisect.pl> will likely cause the bisect to fail badly. | |
374 | ||
375 | =item * | |
376 | ||
377 | --check-args | |
378 | ||
379 | Validate the options and arguments, and exit silently if they are valid. | |
380 | ||
381 | =item * | |
382 | ||
383 | --usage | |
384 | ||
385 | =item * | |
386 | ||
387 | --help | |
388 | ||
389 | =item * | |
390 | ||
391 | -? | |
392 | ||
393 | Display the usage information and exit. | |
394 | ||
395 | =back | |
396 | ||
397 | =cut | |
398 | ||
0afef97d | 399 | die "$0: Can't build $target" if defined $target && !grep {@targets} $target; |
6a8dbfd7 NC |
400 | |
401 | $j = "-j$j" if $j =~ /\A\d+\z/; | |
402 | ||
0142f0ce NC |
403 | # Sadly, however hard we try, I don't think that it will be possible to build |
404 | # modules in ext/ on x86_64 Linux before commit e1666bf5602ae794 on 1999/12/29, | |
405 | # which updated to MakeMaker 3.7, which changed from using a hard coded ld | |
406 | # in the Makefile to $(LD). On x86_64 Linux the "linker" is gcc. | |
407 | ||
6a8dbfd7 NC |
408 | sub extract_from_file { |
409 | my ($file, $rx, $default) = @_; | |
410 | open my $fh, '<', $file or die "Can't open $file: $!"; | |
411 | while (<$fh>) { | |
412 | my @got = $_ =~ $rx; | |
413 | return wantarray ? @got : $got[0] | |
414 | if @got; | |
415 | } | |
416 | return $default if defined $default; | |
417 | return; | |
418 | } | |
419 | ||
c59e8fd6 NC |
420 | sub edit_file { |
421 | my ($file, $munger) = @_; | |
422 | local $/; | |
423 | open my $fh, '<', $file or die "Can't open $file: $!"; | |
424 | my $orig = <$fh>; | |
425 | die "Can't read $file: $!" unless defined $orig && close $fh; | |
426 | my $new = $munger->($orig); | |
427 | return if $new eq $orig; | |
428 | open $fh, '>', $file or die "Can't open $file: $!"; | |
429 | print $fh $new or die "Can't print to $file: $!"; | |
430 | close $fh or die "Can't close $file: $!"; | |
431 | } | |
432 | ||
433 | sub apply_patch { | |
434 | my $patch = shift; | |
435 | ||
436 | my ($file) = $patch =~ qr!^diff.*a/(\S+) b/\1!; | |
437 | open my $fh, '|-', 'patch', '-p1' or die "Can't run patch: $!"; | |
438 | print $fh $patch; | |
5fceabf3 NC |
439 | return if close $fh; |
440 | print STDERR "Patch is <<'EOPATCH'\n${patch}EOPATCH\n"; | |
441 | die "Can't patch $file: $?, $!"; | |
c59e8fd6 NC |
442 | } |
443 | ||
ab4a15f9 | 444 | sub clean { |
f4800c99 | 445 | if ($options{clean}) { |
ab4a15f9 NC |
446 | # Needed, because files that are build products in this checked out |
447 | # version might be in git in the next desired version. | |
9da8cb0a | 448 | system 'git clean -dxf </dev/null'; |
ab4a15f9 NC |
449 | # Needed, because at some revisions the build alters checked out files. |
450 | # (eg pod/perlapi.pod). Also undoes any changes to makedepend.SH | |
9da8cb0a | 451 | system 'git reset --hard HEAD </dev/null'; |
ab4a15f9 NC |
452 | } |
453 | } | |
454 | ||
455 | sub skip { | |
456 | my $reason = shift; | |
457 | clean(); | |
458 | warn "skipping - $reason"; | |
459 | exit 125; | |
460 | } | |
461 | ||
f1050811 NC |
462 | sub report_and_exit { |
463 | my ($ret, $pass, $fail, $desc) = @_; | |
464 | ||
465 | clean(); | |
466 | ||
f4800c99 | 467 | my $got = ($options{'expect-pass'} ? !$ret : $ret) ? 'good' : 'bad'; |
f1050811 NC |
468 | if ($ret) { |
469 | print "$got - $fail $desc\n"; | |
470 | } else { | |
471 | print "$got - $pass $desc\n"; | |
472 | } | |
473 | ||
474 | exit($got eq 'bad'); | |
475 | } | |
476 | ||
0afef97d NC |
477 | sub match_and_exit { |
478 | my $target = shift; | |
479 | my $matches = 0; | |
480 | my $re = qr/$match/; | |
481 | my @files; | |
482 | ||
483 | { | |
484 | local $/ = "\0"; | |
485 | @files = defined $target ? `git ls-files -o -z`: `git ls-files -z`; | |
486 | chomp @files; | |
487 | } | |
488 | ||
489 | foreach my $file (@files) { | |
490 | open my $fh, '<', $file or die "Can't open $file: $!"; | |
491 | while (<$fh>) { | |
492 | if ($_ =~ $re) { | |
493 | ++$matches; | |
494 | if (tr/\t\r\n -~\200-\377//c) { | |
495 | print "Binary file $file matches\n"; | |
496 | } else { | |
497 | $_ .= "\n" unless /\n\z/; | |
498 | print "$file: $_"; | |
499 | } | |
500 | } | |
501 | } | |
502 | close $fh or die "Can't close $file: $!"; | |
503 | } | |
504 | report_and_exit(!$matches, | |
505 | $matches == 1 ? '1 match for' : "$matches matches for", | |
506 | 'no matches for', $match); | |
507 | } | |
508 | ||
6a8dbfd7 | 509 | # Not going to assume that system perl is yet new enough to have autodie |
9da8cb0a | 510 | system 'git clean -dxf </dev/null' and die; |
6a8dbfd7 | 511 | |
0afef97d NC |
512 | if (!defined $target) { |
513 | match_and_exit() if $match; | |
514 | $target = 'test_prep'; | |
bc96a05a NC |
515 | } |
516 | ||
4b081584 NC |
517 | skip('no Configure - is this the //depot/perlext/Compiler branch?') |
518 | unless -f 'Configure'; | |
519 | ||
dbcdc176 NC |
520 | # This changes to PERL_VERSION in 4d8076ea25903dcb in 1999 |
521 | my $major | |
522 | = extract_from_file('patchlevel.h', | |
523 | qr/^#define\s+(?:PERL_VERSION|PATCHLEVEL)\s+(\d+)\s/, | |
524 | 0); | |
525 | ||
0142f0ce NC |
526 | if ($major < 1) { |
527 | if (extract_from_file('Configure', | |
528 | qr/^ \*=\*\) echo "\$1" >> \$optdef;;$/)) { | |
529 | # This is " Spaces now allowed in -D command line options.", | |
530 | # part of commit ecfc54246c2a6f42 | |
531 | apply_patch(<<'EOPATCH'); | |
532 | diff --git a/Configure b/Configure | |
533 | index 3d3b38d..78ffe16 100755 | |
534 | --- a/Configure | |
535 | +++ b/Configure | |
536 | @@ -652,7 +777,8 @@ while test $# -gt 0; do | |
537 | echo "$me: use '-U symbol=', not '-D symbol='." >&2 | |
538 | echo "$me: ignoring -D $1" >&2 | |
539 | ;; | |
540 | - *=*) echo "$1" >> $optdef;; | |
541 | + *=*) echo "$1" | \ | |
542 | + sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> $optdef;; | |
543 | *) echo "$1='define'" >> $optdef;; | |
544 | esac | |
545 | shift | |
546 | EOPATCH | |
547 | } | |
548 | if (extract_from_file('Configure', qr/^if \$contains 'd_namlen' \$xinc\b/)) { | |
549 | # Configure's original simple "grep" for d_namlen falls foul of the | |
550 | # approach taken by the glibc headers: | |
551 | # #ifdef _DIRENT_HAVE_D_NAMLEN | |
552 | # # define _D_EXACT_NAMLEN(d) ((d)->d_namlen) | |
553 | # | |
554 | # where _DIRENT_HAVE_D_NAMLEN is not defined on Linux. | |
555 | # This is also part of commit ecfc54246c2a6f42 | |
556 | apply_patch(<<'EOPATCH'); | |
557 | diff --git a/Configure b/Configure | |
558 | index 3d3b38d..78ffe16 100755 | |
559 | --- a/Configure | |
560 | +++ b/Configure | |
561 | @@ -3935,7 +4045,8 @@ $rm -f try.c | |
562 | ||
563 | : see if the directory entry stores field length | |
564 | echo " " | |
565 | -if $contains 'd_namlen' $xinc >/dev/null 2>&1; then | |
566 | +$cppstdin $cppflags $cppminus < "$xinc" > try.c | |
567 | +if $contains 'd_namlen' try.c >/dev/null 2>&1; then | |
568 | echo "Good, your directory entry keeps length information in d_namlen." >&4 | |
569 | val="$define" | |
570 | else | |
571 | EOPATCH | |
572 | } | |
573 | } | |
d90ae42b | 574 | |
af7c500f NC |
575 | if ($major < 8 && !extract_from_file('Configure', |
576 | qr/^\t\tif test ! -t 0; then$/)) { | |
7c22f158 NC |
577 | # Before dfe9444ca7881e71, Configure would refuse to run if stdin was not a |
578 | # tty. With that commit, the tty requirement was dropped for -de and -dE | |
af7c500f | 579 | # Commit aaeb8e512e8e9e14 dropped the tty requirement for -S |
7c22f158 NC |
580 | # For those older versions, it's probably easiest if we simply remove the |
581 | # sanity test. | |
af7c500f NC |
582 | edit_file('Configure', sub { |
583 | my $code = shift; | |
584 | $code =~ s/test ! -t 0/test Perl = rules/; | |
585 | return $code; | |
586 | }); | |
7c22f158 NC |
587 | } |
588 | ||
d90ae42b | 589 | if ($major < 10 && extract_from_file('Configure', qr/^set malloc\.h i_malloc$/)) { |
5541f5e3 NC |
590 | # This is commit 01d07975f7ef0e7d, trimmed, with $compile inlined as |
591 | # prior to bd9b35c97ad661cc Configure had the malloc.h test before the | |
592 | # definition of $compile. | |
d90ae42b NC |
593 | apply_patch(<<'EOPATCH'); |
594 | diff --git a/Configure b/Configure | |
595 | index 3d2e8b9..6ce7766 100755 | |
596 | --- a/Configure | |
597 | +++ b/Configure | |
598 | @@ -6743,5 +6743,22 @@ set d_dosuid | |
599 | ||
600 | : see if this is a malloc.h system | |
601 | -set malloc.h i_malloc | |
602 | -eval $inhdr | |
603 | +: we want a real compile instead of Inhdr because some systems have a | |
604 | +: malloc.h that just gives a compile error saying to use stdlib.h instead | |
605 | +echo " " | |
606 | +$cat >try.c <<EOCP | |
607 | +#include <stdlib.h> | |
608 | +#include <malloc.h> | |
609 | +int main () { return 0; } | |
610 | +EOCP | |
611 | +set try | |
5541f5e3 | 612 | +if $cc $optimize $ccflags $ldflags -o try $* try.c $libs > /dev/null 2>&1; then |
d90ae42b NC |
613 | + echo "<malloc.h> found." >&4 |
614 | + val="$define" | |
615 | +else | |
616 | + echo "<malloc.h> NOT found." >&4 | |
617 | + val="$undef" | |
618 | +fi | |
619 | +$rm -f try.c try | |
620 | +set i_malloc | |
621 | +eval $setvar | |
622 | ||
623 | EOPATCH | |
624 | } | |
a1756669 | 625 | |
686af304 NC |
626 | # Cwd.xs added in commit 0d2079faa739aaa9. Cwd.pm moved to ext/ 8 years later |
627 | # in commit 403f501d5b37ebf0 | |
628 | if ($major > 0 && <*/Cwd/Cwd.xs>) { | |
629 | if ($major < 10 && !extract_from_file('Makefile.SH', qr/^extra_dep=''$/)) { | |
630 | # The Makefile.PL for Unicode::Normalize needs | |
631 | # lib/unicore/CombiningClass.pl. Even without a parallel build, we need | |
632 | # a dependency to ensure that it builds. This is a variant of commit | |
633 | # 9f3ef600c170f61e. Putting this for earlier versions gives us a spot | |
634 | # on which to hang the edits below | |
635 | apply_patch(<<'EOPATCH'); | |
6ff3edb1 NC |
636 | diff --git a/Makefile.SH b/Makefile.SH |
637 | index f61d0db..6097954 100644 | |
638 | --- a/Makefile.SH | |
639 | +++ b/Makefile.SH | |
640 | @@ -155,10 +155,20 @@ esac | |
641 | ||
642 | : Prepare dependency lists for Makefile. | |
643 | dynamic_list=' ' | |
644 | +extra_dep='' | |
645 | for f in $dynamic_ext; do | |
646 | : the dependency named here will never exist | |
647 | base=`echo "$f" | sed 's/.*\///'` | |
648 | - dynamic_list="$dynamic_list lib/auto/$f/$base.$dlext" | |
649 | + this_target="lib/auto/$f/$base.$dlext" | |
650 | + dynamic_list="$dynamic_list $this_target" | |
651 | + | |
652 | + : Parallel makes reveal that we have some interdependencies | |
653 | + case $f in | |
654 | + Math/BigInt/FastCalc) extra_dep="$extra_dep | |
655 | +$this_target: lib/auto/List/Util/Util.$dlext" ;; | |
656 | + Unicode/Normalize) extra_dep="$extra_dep | |
657 | +$this_target: lib/unicore/CombiningClass.pl" ;; | |
658 | + esac | |
659 | done | |
660 | ||
661 | static_list=' ' | |
662 | @@ -987,2 +997,9 @@ n_dummy $(nonxs_ext): miniperl$(EXE_EXT) preplibrary $(DYNALOADER) FORCE | |
663 | @$(LDLIBPTH) sh ext/util/make_ext nonxs $@ MAKE=$(MAKE) LIBPERL_A=$(LIBPERL) | |
664 | +!NO!SUBS! | |
665 | + | |
666 | +$spitshell >>Makefile <<EOF | |
667 | +$extra_dep | |
668 | +EOF | |
669 | + | |
670 | +$spitshell >>Makefile <<'!NO!SUBS!' | |
671 | ||
672 | EOPATCH | |
686af304 NC |
673 | } |
674 | if ($major < 14) { | |
675 | # Commits dc0655f797469c47 and d11a62fe01f2ecb2 | |
676 | edit_file('Makefile.SH', sub { | |
677 | my $code = shift; | |
678 | foreach my $ext (qw(Encode SDBM_File)) { | |
679 | next if $code =~ /\b$ext\) extra_dep=/s; | |
680 | $code =~ s!(\) extra_dep="\$extra_dep | |
681 | \$this_target: .*?" ;;) | |
682 | ( esac | |
683 | )!$1 | |
684 | $ext) extra_dep="\$extra_dep | |
685 | \$this_target: lib/auto/Cwd/Cwd.\$dlext" ;; | |
686 | $2!; | |
687 | } | |
688 | return $code; | |
689 | }); | |
690 | } | |
691 | } | |
692 | if ($major == 7) { | |
693 | # Remove commits 9fec149bb652b6e9 and 5bab1179608f81d8, which add/amend | |
694 | # rules to automatically run regen scripts that rebuild C headers. These | |
695 | # cause problems because a git checkout doesn't preserve relative file | |
696 | # modification times, hence the regen scripts may fire. This will obscure | |
697 | # whether the repository had the correct generated headers checked in. | |
698 | # Also, the dependency rules for running the scripts were not correct, | |
699 | # which could cause spurious re-builds on re-running make, and can cause | |
700 | # complete build failures for a parallel make. | |
701 | if (extract_from_file('Makefile.SH', | |
702 | qr/Writing it this way gives make a big hint to always run opcode\.pl before/)) { | |
703 | system 'git show 70c6e6715e8fec53 | patch -p1' | |
704 | and die; | |
705 | } elsif (extract_from_file('Makefile.SH', | |
706 | qr/^opcode\.h opnames\.h pp_proto\.h pp\.sym: opcode\.pl$/)) { | |
707 | system 'git show 9fec149bb652b6e9 | patch -p1 -R' | |
708 | and die; | |
709 | } | |
6ff3edb1 NC |
710 | } |
711 | ||
6a8dbfd7 NC |
712 | # There was a bug in makedepend.SH which was fixed in version 96a8704c. |
713 | # Symptom was './makedepend: 1: Syntax error: Unterminated quoted string' | |
714 | # Remove this if you're actually bisecting a problem related to makedepend.SH | |
9da8cb0a | 715 | system 'git show blead:makedepend.SH > makedepend.SH </dev/null' and die; |
6a8dbfd7 | 716 | |
d64af352 NC |
717 | if ($^O eq 'freebsd') { |
718 | # There are rather too many version-specific FreeBSD hints fixes to patch | |
719 | # individually. Also, more than once the FreeBSD hints file has been | |
720 | # written in what turned out to be a rather non-future-proof style, | |
721 | # with case statements treating the most recent version as the exception, | |
722 | # instead of treating previous versions' behaviour explicitly and changing | |
723 | # the default to cater for the current behaviour. (As strangely, future | |
724 | # versions inherit the current behaviour.) | |
9da8cb0a NC |
725 | system 'git show blead:hints/freebsd.sh > hints/freebsd.sh </dev/null' |
726 | and die; | |
641e2ba6 NC |
727 | |
728 | if ($major < 2) { | |
729 | # 5.002 Configure and later have code to | |
730 | # | |
731 | # : Try to guess additional flags to pick up local libraries. | |
732 | # | |
733 | # which will automatically add --L/usr/local/lib because libpth | |
734 | # contains /usr/local/lib | |
735 | # | |
736 | # Without it, if Configure finds libraries in /usr/local/lib (eg | |
737 | # libgdbm.so) and adds them to the compiler commandline (as -lgdbm), | |
738 | # then the link will fail. We can't fix this up in config.sh because | |
739 | # the link will *also* fail in the test compiles that Configure does | |
740 | # (eg $inlibc) which makes Configure get all sorts of things | |
741 | # wrong. :-( So bodge it here. | |
742 | # | |
743 | # Possibly other platforms will need something similar. (if they | |
744 | # have "wanted" libraries in /usr/local/lib, but the compiler | |
745 | # doesn't default to putting that directory in its link path) | |
746 | apply_patch(<<'EOPATCH'); | |
747 | --- perl2/hints/freebsd.sh.orig 2011-10-05 16:44:55.000000000 +0200 | |
748 | +++ perl2/hints/freebsd.sh 2011-10-05 16:45:52.000000000 +0200 | |
749 | @@ -125,7 +125,7 @@ | |
750 | else | |
751 | libpth="/usr/lib /usr/local/lib" | |
752 | glibpth="/usr/lib /usr/local/lib" | |
753 | - ldflags="-Wl,-E " | |
754 | + ldflags="-Wl,-E -L/usr/local/lib " | |
755 | lddlflags="-shared " | |
756 | fi | |
757 | cccdlflags='-DPIC -fPIC' | |
758 | @@ -133,7 +133,7 @@ | |
759 | *) | |
760 | libpth="/usr/lib /usr/local/lib" | |
761 | glibpth="/usr/lib /usr/local/lib" | |
762 | - ldflags="-Wl,-E " | |
763 | + ldflags="-Wl,-E -L/usr/local/lib " | |
764 | lddlflags="-shared " | |
765 | cccdlflags='-DPIC -fPIC' | |
766 | ;; | |
641e2ba6 NC |
767 | EOPATCH |
768 | } | |
915f531b NC |
769 | } elsif ($^O eq 'darwin') { |
770 | if ($major < 8) { | |
771 | my $faking_it; | |
772 | # We can't build on darwin without some of the data in the hints file. | |
773 | foreach ('ext/DynaLoader/dl_dyld.xs', 'hints/darwin.sh') { | |
774 | next if -f $_; | |
775 | ++$faking_it; | |
776 | # Probably less surprising to use the earliest version of | |
777 | # hints/darwin.sh and then edit in place just below, than use | |
778 | # blead's version, as that would create a discontinuity at | |
779 | # f556e5b971932902 - before it, hints bugs would be "fixed", after | |
780 | # it they'd resurface. This way, we should give the illusion of | |
781 | # monotonic bug fixing. | |
782 | system "git show f556e5b971932902:$_ >$_" | |
783 | and die "while attempting to extract $_"; | |
784 | } | |
785 | if ($faking_it) { | |
786 | apply_patch(<<'EOPATCH'); | |
787 | diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs | |
788 | --- a/ext/DynaLoader/dl_dyld.xs~ 2011-10-11 21:41:27.000000000 +0100 | |
789 | +++ b/ext/DynaLoader/dl_dyld.xs 2011-10-11 21:42:20.000000000 +0100 | |
790 | @@ -41,6 +41,35 @@ | |
791 | #include "perl.h" | |
792 | #include "XSUB.h" | |
793 | ||
794 | +#ifndef pTHX | |
795 | +# define pTHX void | |
796 | +# define pTHX_ | |
797 | +#endif | |
798 | +#ifndef aTHX | |
799 | +# define aTHX | |
800 | +# define aTHX_ | |
801 | +#endif | |
802 | +#ifndef dTHX | |
803 | +# define dTHXa(a) extern int Perl___notused(void) | |
804 | +# define dTHX extern int Perl___notused(void) | |
805 | +#endif | |
806 | + | |
807 | +#ifndef Perl_form_nocontext | |
808 | +# define Perl_form_nocontext form | |
809 | +#endif | |
810 | + | |
811 | +#ifndef Perl_warn_nocontext | |
812 | +# define Perl_warn_nocontext warn | |
813 | +#endif | |
814 | + | |
815 | +#ifndef PTR2IV | |
816 | +# define PTR2IV(p) (IV)(p) | |
817 | +#endif | |
818 | + | |
819 | +#ifndef get_av | |
820 | +# define get_av perl_get_av | |
821 | +#endif | |
822 | + | |
823 | #define DL_LOADONCEONLY | |
824 | ||
825 | #include "dlutils.c" /* SaveError() etc */ | |
826 | @@ -185,7 +191,7 @@ | |
827 | CODE: | |
828 | DLDEBUG(1,PerlIO_printf(Perl_debug_log, "dl_load_file(%s,%x):\n", filename,flags)); | |
829 | if (flags & 0x01) | |
830 | - Perl_warn(aTHX_ "Can't make loaded symbols global on this platform while loading %s",filename); | |
831 | + Perl_warn_nocontext("Can't make loaded symbols global on this platform while loading %s",filename); | |
832 | RETVAL = dlopen(filename, mode) ; | |
833 | DLDEBUG(2,PerlIO_printf(Perl_debug_log, " libref=%x\n", RETVAL)); | |
834 | ST(0) = sv_newmortal() ; | |
835 | EOPATCH | |
836 | if ($major < 4 && !extract_from_file('util.c', qr/^form/m)) { | |
837 | apply_patch(<<'EOPATCH'); | |
838 | diff -u a/ext/DynaLoader/dl_dyld.xs~ a/ext/DynaLoader/dl_dyld.xs | |
839 | --- a/ext/DynaLoader/dl_dyld.xs~ 2011-10-11 21:56:25.000000000 +0100 | |
840 | +++ b/ext/DynaLoader/dl_dyld.xs 2011-10-11 22:00:00.000000000 +0100 | |
841 | @@ -60,6 +60,18 @@ | |
842 | # define get_av perl_get_av | |
843 | #endif | |
844 | ||
845 | +static char * | |
846 | +form(char *pat, ...) | |
847 | +{ | |
848 | + char *retval; | |
849 | + va_list args; | |
850 | + va_start(args, pat); | |
851 | + vasprintf(&retval, pat, &args); | |
852 | + va_end(args); | |
853 | + SAVEFREEPV(retval); | |
854 | + return retval; | |
855 | +} | |
856 | + | |
857 | #define DL_LOADONCEONLY | |
858 | ||
859 | #include "dlutils.c" /* SaveError() etc */ | |
860 | EOPATCH | |
861 | } | |
862 | } | |
863 | ||
864 | edit_file('hints/darwin.sh', sub { | |
865 | my $code = shift; | |
866 | # Part of commit 8f4f83badb7d1ba9, which mostly undoes | |
867 | # commit 0511a818910f476c. | |
868 | $code =~ s/^cppflags='-traditional-cpp';$/cppflags="\${cppflags} -no-cpp-precomp"/m; | |
869 | # commit 14c11978e9b52e08/803bb6cc74d36a3f | |
870 | # Without this, code in libperl.bundle links against op.o | |
871 | # in preference to opmini.o on the linker command line, | |
872 | # and hence miniperl tries to use File::Glob instead of | |
873 | # csh | |
874 | $code =~ s/^(lddlflags=)/ldflags="\${ldflags} -flat_namespace"\n$1/m; | |
875 | # f556e5b971932902 also patches Makefile.SH with some | |
876 | # special case code to deal with useshrplib for darwin. | |
877 | # Given that post 5.8.0 the darwin hints default was | |
878 | # changed to false, and it would be very complex to splice | |
879 | # in that code in various versions of Makefile.SH back | |
880 | # to 5.002, lets just turn it off. | |
881 | $code =~ s/^useshrplib='true'/useshrplib='false'/m | |
882 | if $faking_it; | |
883 | return $code; | |
884 | }); | |
885 | } | |
283e4721 NC |
886 | } elsif ($^O eq 'netbsd') { |
887 | if ($major < 6) { | |
888 | # These are part of commit 099685bc64c7dbce | |
889 | edit_file('hints/netbsd.sh', sub { | |
890 | my $code = shift; | |
891 | my $fixed = <<'EOC'; | |
892 | case "$osvers" in | |
893 | 0.9|0.8*) | |
894 | usedl="$undef" | |
895 | ;; | |
896 | *) | |
897 | if [ -f /usr/libexec/ld.elf_so ]; then | |
898 | d_dlopen=$define | |
899 | d_dlerror=$define | |
900 | ccdlflags="-Wl,-E -Wl,-R${PREFIX}/lib $ccdlflags" | |
901 | cccdlflags="-DPIC -fPIC $cccdlflags" | |
902 | lddlflags="--whole-archive -shared $lddlflags" | |
903 | elif [ "`uname -m`" = "pmax" ]; then | |
904 | # NetBSD 1.3 and 1.3.1 on pmax shipped an `old' ld.so, which will not work. | |
905 | d_dlopen=$undef | |
906 | elif [ -f /usr/libexec/ld.so ]; then | |
907 | d_dlopen=$define | |
908 | d_dlerror=$define | |
909 | ccdlflags="-Wl,-R${PREFIX}/lib $ccdlflags" | |
910 | # we use -fPIC here because -fpic is *NOT* enough for some of the | |
911 | # extensions like Tk on some netbsd platforms (the sparc is one) | |
912 | cccdlflags="-DPIC -fPIC $cccdlflags" | |
913 | lddlflags="-Bforcearchive -Bshareable $lddlflags" | |
914 | else | |
915 | d_dlopen=$undef | |
916 | fi | |
917 | ;; | |
918 | esac | |
919 | EOC | |
920 | $code =~ s/^case "\$osvers" in\n0\.9\|0\.8.*?^esac\n/$fixed/ms; | |
921 | return $code; | |
922 | }); | |
923 | if (!extract_from_file('unixish.h', | |
924 | qr/defined\(NSIG\).*defined\(__NetBSD__\)/)) { | |
925 | apply_patch(<<'EOPATCH') | |
926 | diff --git a/unixish.h b/unixish.h | |
927 | index 2a6cbcd..eab2de1 100644 | |
928 | --- a/unixish.h | |
929 | +++ b/unixish.h | |
930 | @@ -89,7 +89,7 @@ | |
931 | */ | |
932 | /* #define ALTERNATE_SHEBANG "#!" / **/ | |
933 | ||
934 | -#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) | |
935 | +#if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX) || defined(__NetBSD__) | |
936 | # include <signal.h> | |
937 | #endif | |
938 | ||
939 | EOPATCH | |
940 | } | |
941 | } | |
6f8c21fa NC |
942 | } elsif ($^O eq 'openbsd') { |
943 | if (!-f 'hints/openbsd.sh') { | |
944 | system 'git show 43051805d53a3e4c:hints/openbsd.sh > hints/openbsd.sh' | |
945 | and die; | |
946 | } | |
947 | ||
948 | if ($major < 8) { | |
949 | my $which = extract_from_file('hints/openbsd.sh', | |
950 | qr/# from (2\.8|3\.1) onwards/, | |
951 | ''); | |
952 | if ($which eq '') { | |
953 | my $was = extract_from_file('hints/openbsd.sh', | |
954 | qr/(lddlflags="(?:-Bforcearchive )?-Bshareable)/); | |
955 | # This is commit 154d43cbcf57271c and parts of 5c75dbfa77b0949c | |
956 | # and 29b5585702e5e025 | |
957 | apply_patch(sprintf <<'EOPATCH', $was); | |
958 | diff --git a/hints/openbsd.sh b/hints/openbsd.sh | |
959 | index a7d8bf2..5b79709 100644 | |
960 | --- a/hints/openbsd.sh | |
961 | +++ b/hints/openbsd.sh | |
962 | @@ -37,7 +37,25 @@ OpenBSD.alpha|OpenBSD.mips|OpenBSD.powerpc|OpenBSD.vax) | |
963 | # we use -fPIC here because -fpic is *NOT* enough for some of the | |
964 | # extensions like Tk on some OpenBSD platforms (ie: sparc) | |
965 | cccdlflags="-DPIC -fPIC $cccdlflags" | |
966 | - %s $lddlflags" | |
967 | + case "$osvers" in | |
968 | + [01].*|2.[0-7]|2.[0-7].*) | |
969 | + lddlflags="-Bshareable $lddlflags" | |
970 | + ;; | |
971 | + 2.[8-9]|3.0) | |
972 | + ld=${cc:-cc} | |
973 | + lddlflags="-shared -fPIC $lddlflags" | |
974 | + ;; | |
975 | + *) # from 3.1 onwards | |
976 | + ld=${cc:-cc} | |
977 | + lddlflags="-shared -fPIC $lddlflags" | |
978 | + libswanted=`echo $libswanted | sed 's/ dl / /'` | |
979 | + ;; | |
980 | + esac | |
981 | + | |
982 | + # We need to force ld to export symbols on ELF platforms. | |
983 | + # Without this, dlopen() is crippled. | |
984 | + ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__` | |
985 | + test -n "$ELF" && ldflags="-Wl,-E $ldflags" | |
986 | ;; | |
987 | esac | |
988 | ||
989 | EOPATCH | |
990 | } elsif ($which eq '2.8') { | |
991 | # This is parts of 5c75dbfa77b0949c and 29b5585702e5e025, and | |
992 | # possibly eb9cd59d45ad2908 | |
993 | my $was = extract_from_file('hints/openbsd.sh', | |
994 | qr/lddlflags="(-shared(?: -fPIC)?) \$lddlflags"/); | |
995 | ||
996 | apply_patch(sprintf <<'EOPATCH', $was); | |
997 | --- a/hints/openbsd.sh 2011-10-21 17:25:20.000000000 +0200 | |
998 | +++ b/hints/openbsd.sh 2011-10-21 16:58:43.000000000 +0200 | |
999 | @@ -44,11 +44,21 @@ | |
1000 | [01].*|2.[0-7]|2.[0-7].*) | |
1001 | lddlflags="-Bshareable $lddlflags" | |
1002 | ;; | |
1003 | - *) # from 2.8 onwards | |
1004 | + 2.[8-9]|3.0) | |
1005 | ld=${cc:-cc} | |
1006 | - lddlflags="%s $lddlflags" | |
1007 | + lddlflags="-shared -fPIC $lddlflags" | |
1008 | + ;; | |
1009 | + *) # from 3.1 onwards | |
1010 | + ld=${cc:-cc} | |
1011 | + lddlflags="-shared -fPIC $lddlflags" | |
1012 | + libswanted=`echo $libswanted | sed 's/ dl / /'` | |
1013 | ;; | |
1014 | esac | |
1015 | + | |
1016 | + # We need to force ld to export symbols on ELF platforms. | |
1017 | + # Without this, dlopen() is crippled. | |
1018 | + ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__` | |
1019 | + test -n "$ELF" && ldflags="-Wl,-E $ldflags" | |
1020 | ;; | |
1021 | esac | |
1022 | ||
1023 | EOPATCH | |
1024 | } elsif ($which eq '3.1' | |
1025 | && !extract_from_file('hints/openbsd.sh', | |
1026 | qr/We need to force ld to export symbols on ELF platforms/)) { | |
1027 | # This is part of 29b5585702e5e025 | |
1028 | apply_patch(<<'EOPATCH'); | |
1029 | diff --git a/hints/openbsd.sh b/hints/openbsd.sh | |
1030 | index c6b6bc9..4839d04 100644 | |
1031 | --- a/hints/openbsd.sh | |
1032 | +++ b/hints/openbsd.sh | |
1033 | @@ -54,6 +54,11 @@ alpha-2.[0-8]|mips-*|vax-*|powerpc-2.[0-7]|m88k-*) | |
1034 | libswanted=`echo $libswanted | sed 's/ dl / /'` | |
1035 | ;; | |
1036 | esac | |
1037 | + | |
1038 | + # We need to force ld to export symbols on ELF platforms. | |
1039 | + # Without this, dlopen() is crippled. | |
1040 | + ELF=`${cc:-cc} -dM -E - </dev/null | grep __ELF__` | |
1041 | + test -n "$ELF" && ldflags="-Wl,-E $ldflags" | |
1042 | ;; | |
1043 | esac | |
1044 | ||
1045 | EOPATCH | |
1046 | } | |
1047 | } | |
1048 | if ($major < 4) { | |
1049 | my $bad; | |
1050 | # Need changes from commit a6e633defa583ad5. | |
1051 | # Commits c07a80fdfe3926b5 and f82b3d4130164d5f changed the same part | |
1052 | # of perl.h | |
1053 | ||
1054 | if (extract_from_file('perl.h', | |
1055 | qr/^#ifdef HAS_GETPGRP2$/)) { | |
1056 | $bad = <<'EOBAD'; | |
1057 | *************** | |
1058 | *** 57,71 **** | |
1059 | #define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s) | |
1060 | #define TAINT_ENV() if (tainting) taint_env() | |
1061 | ||
1062 | ! #ifdef HAS_GETPGRP2 | |
1063 | ! # ifndef HAS_GETPGRP | |
1064 | ! # define HAS_GETPGRP | |
1065 | ! # endif | |
1066 | ! #endif | |
1067 | ! | |
1068 | ! #ifdef HAS_SETPGRP2 | |
1069 | ! # ifndef HAS_SETPGRP | |
1070 | ! # define HAS_SETPGRP | |
1071 | ! # endif | |
1072 | #endif | |
1073 | ||
1074 | EOBAD | |
1075 | } elsif (extract_from_file('perl.h', | |
1076 | qr/Gack, you have one but not both of getpgrp2/)) { | |
1077 | $bad = <<'EOBAD'; | |
1078 | *************** | |
1079 | *** 56,76 **** | |
1080 | #define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s) | |
1081 | #define TAINT_ENV() if (tainting) taint_env() | |
1082 | ||
1083 | ! #if defined(HAS_GETPGRP2) && defined(HAS_SETPGRP2) | |
1084 | ! # define getpgrp getpgrp2 | |
1085 | ! # define setpgrp setpgrp2 | |
1086 | ! # ifndef HAS_GETPGRP | |
1087 | ! # define HAS_GETPGRP | |
1088 | ! # endif | |
1089 | ! # ifndef HAS_SETPGRP | |
1090 | ! # define HAS_SETPGRP | |
1091 | ! # endif | |
1092 | ! # ifndef USE_BSDPGRP | |
1093 | ! # define USE_BSDPGRP | |
1094 | ! # endif | |
1095 | ! #else | |
1096 | ! # if defined(HAS_GETPGRP2) || defined(HAS_SETPGRP2) | |
1097 | ! #include "Gack, you have one but not both of getpgrp2() and setpgrp2()." | |
1098 | ! # endif | |
1099 | #endif | |
1100 | ||
1101 | EOBAD | |
1102 | } elsif (extract_from_file('perl.h', | |
1103 | qr/^#ifdef USE_BSDPGRP$/)) { | |
1104 | $bad = <<'EOBAD' | |
1105 | *************** | |
1106 | *** 91,116 **** | |
1107 | #define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s) | |
1108 | #define TAINT_ENV() if (tainting) taint_env() | |
1109 | ||
1110 | ! #ifdef USE_BSDPGRP | |
1111 | ! # ifdef HAS_GETPGRP | |
1112 | ! # define BSD_GETPGRP(pid) getpgrp((pid)) | |
1113 | ! # endif | |
1114 | ! # ifdef HAS_SETPGRP | |
1115 | ! # define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp)) | |
1116 | ! # endif | |
1117 | ! #else | |
1118 | ! # ifdef HAS_GETPGRP2 | |
1119 | ! # define BSD_GETPGRP(pid) getpgrp2((pid)) | |
1120 | ! # ifndef HAS_GETPGRP | |
1121 | ! # define HAS_GETPGRP | |
1122 | ! # endif | |
1123 | ! # endif | |
1124 | ! # ifdef HAS_SETPGRP2 | |
1125 | ! # define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp)) | |
1126 | ! # ifndef HAS_SETPGRP | |
1127 | ! # define HAS_SETPGRP | |
1128 | ! # endif | |
1129 | ! # endif | |
1130 | #endif | |
1131 | ||
1132 | #ifndef _TYPES_ /* If types.h defines this it's easy. */ | |
1133 | EOBAD | |
1134 | } | |
1135 | if ($bad) { | |
1136 | apply_patch(<<"EOPATCH"); | |
1137 | *** a/perl.h 2011-10-21 09:46:12.000000000 +0200 | |
1138 | --- b/perl.h 2011-10-21 09:46:12.000000000 +0200 | |
1139 | $bad--- 91,144 ---- | |
1140 | #define TAINT_PROPER(s) if (tainting) taint_proper(no_security, s) | |
1141 | #define TAINT_ENV() if (tainting) taint_env() | |
1142 | ||
1143 | ! /* XXX All process group stuff is handled in pp_sys.c. Should these | |
1144 | ! defines move there? If so, I could simplify this a lot. --AD 9/96. | |
1145 | ! */ | |
1146 | ! /* Process group stuff changed from traditional BSD to POSIX. | |
1147 | ! perlfunc.pod documents the traditional BSD-style syntax, so we'll | |
1148 | ! try to preserve that, if possible. | |
1149 | ! */ | |
1150 | ! #ifdef HAS_SETPGID | |
1151 | ! # define BSD_SETPGRP(pid, pgrp) setpgid((pid), (pgrp)) | |
1152 | ! #else | |
1153 | ! # if defined(HAS_SETPGRP) && defined(USE_BSD_SETPGRP) | |
1154 | ! # define BSD_SETPGRP(pid, pgrp) setpgrp((pid), (pgrp)) | |
1155 | ! # else | |
1156 | ! # ifdef HAS_SETPGRP2 /* DG/UX */ | |
1157 | ! # define BSD_SETPGRP(pid, pgrp) setpgrp2((pid), (pgrp)) | |
1158 | ! # endif | |
1159 | ! # endif | |
1160 | ! #endif | |
1161 | ! #if defined(BSD_SETPGRP) && !defined(HAS_SETPGRP) | |
1162 | ! # define HAS_SETPGRP /* Well, effectively it does . . . */ | |
1163 | ! #endif | |
1164 | ! | |
1165 | ! /* getpgid isn't POSIX, but at least Solaris and Linux have it, and it makes | |
1166 | ! our life easier :-) so we'll try it. | |
1167 | ! */ | |
1168 | ! #ifdef HAS_GETPGID | |
1169 | ! # define BSD_GETPGRP(pid) getpgid((pid)) | |
1170 | ! #else | |
1171 | ! # if defined(HAS_GETPGRP) && defined(USE_BSD_GETPGRP) | |
1172 | ! # define BSD_GETPGRP(pid) getpgrp((pid)) | |
1173 | ! # else | |
1174 | ! # ifdef HAS_GETPGRP2 /* DG/UX */ | |
1175 | ! # define BSD_GETPGRP(pid) getpgrp2((pid)) | |
1176 | ! # endif | |
1177 | ! # endif | |
1178 | ! #endif | |
1179 | ! #if defined(BSD_GETPGRP) && !defined(HAS_GETPGRP) | |
1180 | ! # define HAS_GETPGRP /* Well, effectively it does . . . */ | |
1181 | ! #endif | |
1182 | ! | |
1183 | ! /* These are not exact synonyms, since setpgrp() and getpgrp() may | |
1184 | ! have different behaviors, but perl.h used to define USE_BSDPGRP | |
1185 | ! (prior to 5.003_05) so some extension might depend on it. | |
1186 | ! */ | |
1187 | ! #if defined(USE_BSD_SETPGRP) || defined(USE_BSD_GETPGRP) | |
1188 | ! # ifndef USE_BSDPGRP | |
1189 | ! # define USE_BSDPGRP | |
1190 | ! # endif | |
1191 | #endif | |
1192 | ||
1193 | #ifndef _TYPES_ /* If types.h defines this it's easy. */ | |
1194 | EOPATCH | |
1195 | } | |
1196 | } | |
1197 | if ($major < 3 && !extract_from_file('pp_sys.c', qr/BSD_GETPGRP/)) { | |
1198 | # Part of commit c3293030fd1b7489 | |
1199 | apply_patch(<<'EOPATCH'); | |
1200 | diff --git a/pp_sys.c b/pp_sys.c | |
1201 | index 4608a2a..f0c9d1d 100644 | |
1202 | --- a/pp_sys.c | |
1203 | +++ b/pp_sys.c | |
1204 | @@ -2903,8 +2903,8 @@ PP(pp_getpgrp) | |
1205 | pid = 0; | |
1206 | else | |
1207 | pid = SvIVx(POPs); | |
1208 | -#ifdef USE_BSDPGRP | |
1209 | - value = (I32)getpgrp(pid); | |
1210 | +#ifdef BSD_GETPGRP | |
1211 | + value = (I32)BSD_GETPGRP(pid); | |
1212 | #else | |
1213 | if (pid != 0) | |
1214 | DIE("POSIX getpgrp can't take an argument"); | |
1215 | @@ -2933,8 +2933,8 @@ PP(pp_setpgrp) | |
1216 | } | |
1217 | ||
1218 | TAINT_PROPER("setpgrp"); | |
1219 | -#ifdef USE_BSDPGRP | |
1220 | - SETi( setpgrp(pid, pgrp) >= 0 ); | |
1221 | +#ifdef BSD_SETPGRP | |
1222 | + SETi( BSD_SETPGRP(pid, pgrp) >= 0 ); | |
1223 | #else | |
1224 | if ((pgrp != 0) || (pid != 0)) { | |
1225 | DIE("POSIX setpgrp can't take an argument"); | |
1226 | EOPATCH | |
1227 | } | |
d64af352 NC |
1228 | } |
1229 | ||
cfadff5f NC |
1230 | if ($major < 10) { |
1231 | if (!extract_from_file('ext/DB_File/DB_File.xs', | |
1232 | qr!^#else /\* Berkeley DB Version > 2 \*/$!)) { | |
1233 | # This DB_File.xs is really too old to patch up. | |
1234 | # Skip DB_File, unless we're invoked with an explicit -Unoextensions | |
1235 | if (!exists $defines{noextensions}) { | |
1236 | $defines{noextensions} = 'DB_File'; | |
1237 | } elsif (defined $defines{noextensions}) { | |
1238 | $defines{noextensions} .= ' DB_File'; | |
1239 | } | |
1240 | } elsif (!extract_from_file('ext/DB_File/DB_File.xs', | |
1241 | qr/^#ifdef AT_LEAST_DB_4_1$/)) { | |
1242 | # This line is changed by commit 3245f0580c13b3ab | |
1243 | my $line = extract_from_file('ext/DB_File/DB_File.xs', | |
1244 | qr/^( status = \(?RETVAL->dbp->open\)?\(RETVAL->dbp, name, NULL, RETVAL->type, $)/); | |
1245 | apply_patch(<<"EOPATCH"); | |
1246 | diff --git a/ext/DB_File/DB_File.xs b/ext/DB_File/DB_File.xs | |
1247 | index 489ba96..fba8ded 100644 | |
1248 | --- a/ext/DB_File/DB_File.xs | |
1249 | +++ b/ext/DB_File/DB_File.xs | |
1250 | \@\@ -183,4 +187,8 \@\@ | |
1251 | #endif | |
1252 | ||
1253 | +#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) | |
1254 | +# define AT_LEAST_DB_4_1 | |
1255 | +#endif | |
1256 | + | |
1257 | /* map version 2 features & constants onto their version 1 equivalent */ | |
1258 | ||
1259 | \@\@ -1334,7 +1419,12 \@\@ SV * sv ; | |
1260 | #endif | |
1261 | ||
1262 | +#ifdef AT_LEAST_DB_4_1 | |
1263 | + status = (RETVAL->dbp->open)(RETVAL->dbp, NULL, name, NULL, RETVAL->type, | |
1264 | + Flags, mode) ; | |
1265 | +#else | |
1266 | $line | |
1267 | Flags, mode) ; | |
1268 | +#endif | |
1269 | /* printf("open returned %d %s\\n", status, db_strerror(status)) ; */ | |
1270 | ||
1271 | EOPATCH | |
1272 | } | |
1273 | } | |
1274 | ||
6a8dbfd7 NC |
1275 | # if Encode is not needed for the test, you can speed up the bisect by |
1276 | # excluding it from the runs with -Dnoextensions=Encode | |
1277 | # ccache is an easy win. Remove it if it causes problems. | |
6a8dbfd7 NC |
1278 | # Commit 1cfa4ec74d4933da adds ignore_versioned_solibs to Configure, and sets it |
1279 | # to true in hints/linux.sh | |
1280 | # On dromedary, from that point on, Configure (by default) fails to find any | |
1281 | # libraries, because it scans /usr/local/lib /lib /usr/lib, which only contain | |
1282 | # versioned libraries. Without -lm, the build fails. | |
1283 | # Telling /usr/local/lib64 /lib64 /usr/lib64 works from that commit onwards, | |
1284 | # until commit faae14e6e968e1c0 adds it to the hints. | |
1285 | # However, prior to 1cfa4ec74d4933da telling Configure the truth doesn't work, | |
1286 | # because it will spot versioned libraries, pass them to the compiler, and then | |
1287 | # bail out pretty early on. Configure won't let us override libswanted, but it | |
1288 | # will let us override the entire libs list. | |
1289 | ||
1290 | unless (extract_from_file('Configure', 'ignore_versioned_solibs')) { | |
1291 | # Before 1cfa4ec74d4933da, so force the libs list. | |
1292 | ||
1293 | my @libs; | |
1294 | # This is the current libswanted list from Configure, less the libs removed | |
1295 | # by current hints/linux.sh | |
1296 | foreach my $lib (qw(sfio socket inet nsl nm ndbm gdbm dbm db malloc dl dld | |
1297 | ld sun m crypt sec util c cposix posix ucb BSD)) { | |
1298 | foreach my $dir (@paths) { | |
1299 | next unless -f "$dir/lib$lib.so"; | |
1300 | push @libs, "-l$lib"; | |
1301 | last; | |
1302 | } | |
1303 | } | |
390a69a9 | 1304 | $defines{libs} = \@libs unless exists $defines{libs}; |
6a8dbfd7 NC |
1305 | } |
1306 | ||
390a69a9 NC |
1307 | $defines{usenm} = undef |
1308 | if $major < 2 && !exists $defines{usenm}; | |
0142f0ce | 1309 | |
67382a3b NC |
1310 | my (@missing, @created_dirs); |
1311 | ||
f4800c99 | 1312 | if ($options{'force-manifest'}) { |
67382a3b NC |
1313 | open my $fh, '<', 'MANIFEST' |
1314 | or die "Could not open MANIFEST: $!"; | |
1315 | while (<$fh>) { | |
1316 | next unless /^(\S+)/; | |
1317 | push @missing, $1 | |
1318 | unless -f $1; | |
1319 | } | |
1320 | close $fh or die "Can't close MANIFEST: $!"; | |
1321 | ||
1322 | foreach my $pathname (@missing) { | |
1323 | my @parts = split '/', $pathname; | |
1324 | my $leaf = pop @parts; | |
1325 | my $path = '.'; | |
1326 | while (@parts) { | |
1327 | $path .= '/' . shift @parts; | |
1328 | next if -d $path; | |
1329 | mkdir $path, 0700 or die "Can't create $path: $!"; | |
1330 | unshift @created_dirs, $path; | |
1331 | } | |
1332 | open $fh, '>', $pathname or die "Can't open $pathname: $!"; | |
1333 | close $fh or die "Can't close $pathname: $!"; | |
1334 | chmod 0, $pathname or die "Can't chmod 0 $pathname: $!"; | |
1335 | } | |
1336 | } | |
1337 | ||
af7c500f | 1338 | my @ARGS = '-dEs'; |
390a69a9 NC |
1339 | foreach my $key (sort keys %defines) { |
1340 | my $val = $defines{$key}; | |
1341 | if (ref $val) { | |
1342 | push @ARGS, "-D$key=@$val"; | |
1343 | } elsif (!defined $val) { | |
1344 | push @ARGS, "-U$key"; | |
1345 | } elsif (!length $val) { | |
1346 | push @ARGS, "-D$key"; | |
1347 | } else { | |
1348 | $val = "" if $val eq "\0"; | |
1349 | push @ARGS, "-D$key=$val"; | |
1350 | } | |
1351 | } | |
1352 | push @ARGS, map {"-A$_"} @{$options{A}}; | |
1353 | ||
6a8dbfd7 NC |
1354 | # </dev/null because it seems that some earlier versions of Configure can |
1355 | # call commands in a way that now has them reading from stdin (and hanging) | |
1356 | my $pid = fork; | |
1357 | die "Can't fork: $!" unless defined $pid; | |
1358 | if (!$pid) { | |
7c22f158 NC |
1359 | open STDIN, '<', '/dev/null'; |
1360 | # If a file in MANIFEST is missing, Configure asks if you want to | |
1361 | # continue (the default being 'n'). With stdin closed or /dev/null, | |
1362 | # it exits immediately and the check for config.sh below will skip. | |
6a8dbfd7 NC |
1363 | exec './Configure', @ARGS; |
1364 | die "Failed to start Configure: $!"; | |
1365 | } | |
1366 | waitpid $pid, 0 | |
1367 | or die "wait for Configure, pid $pid failed: $!"; | |
1368 | ||
af7c500f NC |
1369 | # Emulate noextensions if Configure doesn't support it. |
1370 | if (-f 'config.sh') { | |
1371 | if ($major < 10 && $defines{noextensions}) { | |
1372 | edit_file('config.sh', sub { | |
1373 | my @lines = split /\n/, shift; | |
1374 | my @ext = split /\s+/, $defines{noextensions}; | |
1375 | foreach (@lines) { | |
1376 | next unless /^extensions=/ || /^dynamic_ext/; | |
1377 | foreach my $ext (@ext) { | |
1378 | s/\b$ext( )?\b/$1/; | |
1379 | } | |
1380 | } | |
1381 | return join "\n", @lines; | |
1382 | }); | |
1383 | } | |
dd7c3e6c NC |
1384 | if ($major < 4 && !extract_from_file('config.sh', qr/^trnl=/)) { |
1385 | # This seems to be necessary to avoid makedepend becoming confused, | |
1386 | # and hanging on stdin. Seems that the code after | |
1387 | # make shlist || ...here... is never run. | |
1388 | edit_file('makedepend.SH', sub { | |
1389 | my $code = shift; | |
1390 | $code =~ s/^trnl='\$trnl'$/trnl='\\n'/m; | |
1391 | return $code; | |
1392 | }); | |
1393 | } | |
1394 | ||
af7c500f NC |
1395 | system './Configure -S </dev/null' and die; |
1396 | } | |
1397 | ||
0afef97d NC |
1398 | if ($target =~ /config\.s?h/) { |
1399 | match_and_exit($target) if $match && -f $target; | |
30a13282 NC |
1400 | report_and_exit(!-f $target, 'could build', 'could not build', $target) |
1401 | if $options{'test-build'}; | |
1402 | ||
1403 | my $ret = system @ARGV; | |
1404 | report_and_exit($ret, 'zero exit from', 'non-zero exit from', "@ARGV"); | |
dd4e46d7 NC |
1405 | } elsif (!-f 'config.sh') { |
1406 | # Skip if something went wrong with Configure | |
1407 | ||
1408 | skip('could not build config.sh'); | |
1409 | } | |
6a8dbfd7 | 1410 | |
67382a3b NC |
1411 | # This is probably way too paranoid: |
1412 | if (@missing) { | |
1413 | my @errors; | |
eb4906f4 | 1414 | require Fcntl; |
67382a3b NC |
1415 | foreach my $file (@missing) { |
1416 | my (undef, undef, $mode, undef, undef, undef, undef, $size) | |
1417 | = stat $file; | |
1418 | if (!defined $mode) { | |
1419 | push @errors, "Added file $file has been deleted by Configure"; | |
1420 | next; | |
1421 | } | |
eb4906f4 | 1422 | if (Fcntl::S_IMODE($mode) != 0) { |
67382a3b NC |
1423 | push @errors, |
1424 | sprintf 'Added file %s had mode changed by Configure to %03o', | |
1425 | $file, $mode; | |
1426 | } | |
1427 | if ($size != 0) { | |
1428 | push @errors, | |
1429 | "Added file $file had sized changed by Configure to $size"; | |
1430 | } | |
1431 | unlink $file or die "Can't unlink $file: $!"; | |
1432 | } | |
1433 | foreach my $dir (@created_dirs) { | |
1434 | rmdir $dir or die "Can't rmdir $dir: $!"; | |
1435 | } | |
6c0925a0 NC |
1436 | skip("@errors") |
1437 | if @errors; | |
67382a3b NC |
1438 | } |
1439 | ||
6a8dbfd7 NC |
1440 | # Correct makefile for newer GNU gcc |
1441 | # Only really needed if you comment out the use of blead's makedepend.SH | |
1442 | { | |
1443 | local $^I = ""; | |
1444 | local @ARGV = qw(makefile x2p/makefile); | |
1445 | while (<>) { | |
1446 | print unless /<(?:built-in|command|stdin)/; | |
1447 | } | |
1448 | } | |
6a8dbfd7 | 1449 | |
0142f0ce NC |
1450 | if ($major == 2 && extract_from_file('perl.c', qr/^ fclose\(e_fp\);$/)) { |
1451 | # need to patch perl.c to avoid calling fclose() twice on e_fp when using -e | |
1452 | # This diff is part of commit ab821d7fdc14a438. The second close was | |
1453 | # introduced with perl-5.002, commit a5f75d667838e8e7 | |
1454 | # Might want a6c477ed8d4864e6 too, for the corresponding change to pp_ctl.c | |
1455 | # (likely without this, eval will have "fun") | |
1456 | apply_patch(<<'EOPATCH'); | |
1457 | diff --git a/perl.c b/perl.c | |
1458 | index 03c4d48..3c814a2 100644 | |
1459 | --- a/perl.c | |
1460 | +++ b/perl.c | |
1461 | @@ -252,6 +252,7 @@ setuid perl scripts securely.\n"); | |
1462 | #ifndef VMS /* VMS doesn't have environ array */ | |
1463 | origenviron = environ; | |
1464 | #endif | |
1465 | + e_tmpname = Nullch; | |
1466 | ||
1467 | if (do_undump) { | |
1468 | ||
1469 | @@ -405,6 +406,7 @@ setuid perl scripts securely.\n"); | |
1470 | if (e_fp) { | |
1471 | if (Fflush(e_fp) || ferror(e_fp) || fclose(e_fp)) | |
1472 | croak("Can't write to temp file for -e: %s", Strerror(errno)); | |
1473 | + e_fp = Nullfp; | |
1474 | argc++,argv--; | |
1475 | scriptname = e_tmpname; | |
1476 | } | |
1477 | @@ -470,10 +472,10 @@ setuid perl scripts securely.\n"); | |
1478 | curcop->cop_line = 0; | |
1479 | curstash = defstash; | |
1480 | preprocess = FALSE; | |
1481 | - if (e_fp) { | |
1482 | - fclose(e_fp); | |
1483 | - e_fp = Nullfp; | |
1484 | + if (e_tmpname) { | |
1485 | (void)UNLINK(e_tmpname); | |
1486 | + Safefree(e_tmpname); | |
1487 | + e_tmpname = Nullch; | |
1488 | } | |
1489 | ||
1490 | /* now that script is parsed, we can modify record separator */ | |
1491 | @@ -1369,7 +1371,7 @@ SV *sv; | |
1492 | scriptname = xfound; | |
1493 | } | |
1494 | ||
1495 | - origfilename = savepv(e_fp ? "-e" : scriptname); | |
1496 | + origfilename = savepv(e_tmpname ? "-e" : scriptname); | |
1497 | curcop->cop_filegv = gv_fetchfile(origfilename); | |
1498 | if (strEQ(origfilename,"-")) | |
1499 | scriptname = ""; | |
1500 | ||
1501 | EOPATCH | |
1502 | } | |
1503 | ||
6f8c21fa NC |
1504 | if ($major < 8 && $^O eq 'openbsd' |
1505 | && !extract_from_file('perl.h', qr/include <unistd\.h>/)) { | |
1506 | # This is part of commit 3f270f98f9305540, applied at a slightly different | |
1507 | # location in perl.h, where the context is stable back to 5.000 | |
1508 | apply_patch(<<'EOPATCH'); | |
1509 | diff --git a/perl.h b/perl.h | |
1510 | index 9418b52..b8b1a7c 100644 | |
1511 | --- a/perl.h | |
1512 | +++ b/perl.h | |
1513 | @@ -496,6 +496,10 @@ register struct op *Perl_op asm(stringify(OP_IN_REGISTER)); | |
1514 | # include <sys/param.h> | |
1515 | #endif | |
1516 | ||
1517 | +/* If this causes problems, set i_unistd=undef in the hint file. */ | |
1518 | +#ifdef I_UNISTD | |
1519 | +# include <unistd.h> | |
1520 | +#endif | |
1521 | ||
1522 | /* Use all the "standard" definitions? */ | |
1523 | #if defined(STANDARD_C) && defined(I_STDLIB) | |
1524 | EOPATCH | |
1525 | } | |
1526 | ||
c59e8fd6 NC |
1527 | if ($major < 10 and -f 'ext/IPC/SysV/SysV.xs') { |
1528 | edit_file('ext/IPC/SysV/SysV.xs', sub { | |
1529 | my $xs = shift; | |
1530 | my $fixed = <<'EOFIX'; | |
1531 | ||
1532 | #include <sys/types.h> | |
1533 | #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM) | |
1534 | #ifndef HAS_SEM | |
1535 | # include <sys/ipc.h> | |
1536 | #endif | |
1537 | # ifdef HAS_MSG | |
1538 | # include <sys/msg.h> | |
1539 | # endif | |
1540 | # ifdef HAS_SHM | |
1541 | # if defined(PERL_SCO) || defined(PERL_ISC) | |
1542 | # include <sys/sysmacros.h> /* SHMLBA */ | |
1543 | # endif | |
1544 | # include <sys/shm.h> | |
1545 | # ifndef HAS_SHMAT_PROTOTYPE | |
1546 | extern Shmat_t shmat (int, char *, int); | |
1547 | # endif | |
1548 | # if defined(HAS_SYSCONF) && defined(_SC_PAGESIZE) | |
1549 | # undef SHMLBA /* not static: determined at boot time */ | |
1550 | # define SHMLBA sysconf(_SC_PAGESIZE) | |
1551 | # elif defined(HAS_GETPAGESIZE) | |
1552 | # undef SHMLBA /* not static: determined at boot time */ | |
1553 | # define SHMLBA getpagesize() | |
1554 | # endif | |
1555 | # endif | |
1556 | #endif | |
1557 | EOFIX | |
1558 | $xs =~ s! | |
1559 | #include <sys/types\.h> | |
1560 | .* | |
1561 | (#ifdef newCONSTSUB|/\* Required)!$fixed$1!ms; | |
1562 | return $xs; | |
1563 | }); | |
1564 | } | |
1565 | ||
686af304 NC |
1566 | if (-f 'ext/POSIX/Makefile.PL' |
1567 | && extract_from_file('ext/POSIX/Makefile.PL', | |
1568 | qr/Explicitly avoid including/)) { | |
1569 | # commit 6695a346c41138df, which effectively reverts 170888cff5e2ffb7 | |
1570 | ||
1571 | # PERL5LIB is populated by make_ext.pl with paths to the modules we need | |
1572 | # to run, don't override this with "../../lib" since that may not have | |
1573 | # been populated yet in a parallel build. | |
1574 | apply_patch(<<'EOPATCH'); | |
1575 | diff --git a/ext/POSIX/Makefile.PL b/ext/POSIX/Makefile.PL | |
1576 | index 392b6fb..9e6d091 100644 | |
1577 | --- a/ext/POSIX/Makefile.PL | |
1578 | +++ b/ext/POSIX/Makefile.PL | |
1579 | @@ -1,7 +1,3 @@ | |
1580 | -# Explicitly avoid including '.' in @INC; autoloader gets confused since it | |
1581 | -# can find POSIX.pm, but can't find autosplit.ix. | |
1582 | -BEGIN { @INC = '../../lib';} | |
1583 | -# | |
1584 | use ExtUtils::MakeMaker; | |
1585 | use ExtUtils::Constant 0.11 'WriteConstants'; | |
1586 | use Config; | |
1587 | EOPATCH | |
1588 | } | |
1589 | ||
9a999a97 | 1590 | # Parallel build for miniperl is safe |
9da8cb0a | 1591 | system "make $j miniperl </dev/null"; |
9a999a97 | 1592 | |
2526f4b8 NC |
1593 | my $expected = $target =~ /^test/ ? 't/perl' |
1594 | : $target eq 'Fcntl' ? "lib/auto/Fcntl/Fcntl.$Config{so}" | |
1595 | : $target; | |
1596 | my $real_target = $target eq 'Fcntl' ? $expected : $target; | |
1597 | ||
9a999a97 NC |
1598 | if ($target ne 'miniperl') { |
1599 | # Nearly all parallel build issues fixed by 5.10.0. Untrustworthy before that. | |
372ba1f9 | 1600 | $j = '' if $major < 10; |
9a999a97 | 1601 | |
2526f4b8 | 1602 | if ($real_target eq 'test_prep') { |
9a999a97 NC |
1603 | if ($major < 8) { |
1604 | # test-prep was added in 5.004_01, 3e3baf6d63945cb6. | |
1605 | # renamed to test_prep in 2001 in 5fe84fd29acaf55c. | |
1606 | # earlier than that, just make test. It will be fast enough. | |
2526f4b8 NC |
1607 | $real_target = extract_from_file('Makefile.SH', |
1608 | qr/^(test[-_]prep):/, | |
1609 | 'test'); | |
9a999a97 | 1610 | } |
6a8dbfd7 | 1611 | } |
6a8dbfd7 | 1612 | |
9da8cb0a | 1613 | system "make $j $real_target </dev/null"; |
9a999a97 | 1614 | } |
6a8dbfd7 | 1615 | |
67382a3b NC |
1616 | my $missing_target = $expected =~ /perl$/ ? !-x $expected : !-r $expected; |
1617 | ||
f4800c99 | 1618 | if ($options{'test-build'}) { |
2526f4b8 NC |
1619 | report_and_exit($missing_target, 'could build', 'could not build', |
1620 | $real_target); | |
67382a3b | 1621 | } elsif ($missing_target) { |
2526f4b8 | 1622 | skip("could not build $real_target"); |
67382a3b | 1623 | } |
6a8dbfd7 | 1624 | |
2526f4b8 | 1625 | match_and_exit($real_target) if $match; |
0afef97d NC |
1626 | |
1627 | if (defined $options{'one-liner'}) { | |
2526f4b8 | 1628 | my $exe = $target =~ /^(?:perl$|test)/ ? 'perl' : 'miniperl'; |
0afef97d NC |
1629 | unshift @ARGV, "./$exe", '-Ilib', '-e', $options{'one-liner'}; |
1630 | } | |
1631 | ||
6a8dbfd7 | 1632 | # This is what we came here to run: |
915f531b NC |
1633 | |
1634 | if (exists $Config{ldlibpthname}) { | |
1635 | require Cwd; | |
1636 | my $varname = $Config{ldlibpthname}; | |
1637 | my $cwd = Cwd::getcwd(); | |
1638 | if (defined $ENV{$varname}) { | |
1639 | $ENV{$varname} = $cwd . $Config{path_sep} . $ENV{$varname}; | |
1640 | } else { | |
1641 | $ENV{$varname} = $cwd; | |
1642 | } | |
1643 | } | |
1644 | ||
6a8dbfd7 NC |
1645 | my $ret = system @ARGV; |
1646 | ||
f1050811 | 1647 | report_and_exit($ret, 'zero exit from', 'non-zero exit from', "@ARGV"); |
9a999a97 NC |
1648 | |
1649 | # Local variables: | |
1650 | # cperl-indent-level: 4 | |
1651 | # indent-tabs-mode: nil | |
1652 | # End: | |
1653 | # | |
1654 | # ex: set ts=8 sts=4 sw=4 et: |