4 use Getopt::Long qw(:config bundling no_auto_abbrev);
9 = qw(config.sh config.h miniperl lib/Config.pm Fcntl perl test_prep);
12 if (open my $fh, '<', '/proc/cpuinfo') {
14 ++$cpus if /^processor\s+:\s+\d+$/;
16 } elsif (-x '/sbin/sysctl') {
17 $cpus = 1 + $1 if `/sbin/sysctl hw.ncpu` =~ /^hw\.ncpu: (\d+)$/;
22 jobs => defined $cpus ? $cpus + 1 : 2,
24 clean => 1, # mostly for debugging this
27 my @paths = qw(/usr/local/lib64 /lib64 /usr/lib64);
35 (`uname -sm` eq "Linux x86_64\n" ? (libpth => \@paths) : ()),
38 unless(GetOptions(\%options,
39 'target=s', 'jobs|j=i', 'expect-pass=i',
40 'expect-fail' => sub { $options{'expect-pass'} = 0; },
41 'clean!', 'one-liner|e=s', 'match=s', 'force-manifest',
42 'test-build', 'check-args', 'A=s@', 'usage|help|?',
44 my (undef, $val) = @_;
45 if ($val =~ /\A([^=]+)=(.*)/s) {
46 $defines{$1} = length $2 ? $2 : "\0";
52 $defines{$_[1]} = undef;
55 pod2usage(exitval => 255, verbose => 1);
58 my ($target, $j, $match) = @options{qw(target jobs match)};
60 pod2usage(exitval => 255, verbose => 1) if $options{usage};
61 pod2usage(exitval => 255, verbose => 1)
62 unless @ARGV || $match || $options{'test-build'} || defined $options{'one-liner'};
64 exit 0 if $options{'check-args'};
68 bisect.pl - use git bisect to pinpoint changes
72 # When did this become an error?
73 .../Porting/bisect.pl -e 'my $a := 2;'
74 # When did this stop being an error?
75 .../Porting/bisect.pl --expect-fail -e '1 // 2'
76 # When did this stop matching?
77 .../Porting/bisect.pl --match '\b(?:PL_)hash_seed_set\b'
78 # When did this start matching?
79 .../Porting/bisect.pl --expect-fail --match '\buseithreads\b'
80 # When did this test program stop working?
81 .../Porting/bisect.pl --target=perl -- ./perl -Ilib test_prog.pl
82 # When did this first become valid syntax?
83 .../Porting/bisect.pl --target=miniperl --end=v5.10.0 \
84 --expect-fail -e 'my $a := 2;'
85 # What was the last revision to build with these options?
86 .../Porting/bisect.pl --test-build -Dd_dosuid
90 Together C<bisect.pl> and C<bisect-runner.pl> attempt to automate the use
91 of C<git bisect> as much as possible. With one command (and no other files)
98 Which commit caused this example code to break?
102 Which commit caused this example code to start working?
106 Which commit added the first to match this regex?
110 Which commit removed the last to match this regex?
114 usually without needing to know which versions of perl to use as start and
117 By default C<bisect.pl> will process all options, then use the rest of the
118 command line as arguments to list C<system> to run a test case. By default,
119 the test case should pass (exit with 0) on earlier perls, and fail (exit
120 non-zero) on I<blead>. C<bisect.pl> will use C<bisect-runner.pl> to find the
121 earliest stable perl version on which the test case passes, check that it
122 fails on blead, and then use C<bisect-runner.pl> with C<git bisect run> to
123 find the commit which caused the failure.
125 Because the test case is the complete argument to C<system>, it is easy to
126 run something other than the F<perl> built, if necessary. If you need to run
127 the perl built, you'll probably need to invoke it as C<./perl -Ilib ...>
129 You need a clean checkout to run a bisect, and you can't use the checkout
130 which contains F<Porting/bisect.pl> (because C<git bisect>) will check out
131 a revision before F<Porting/bisect-runner.pl> was added, which
132 C<git bisect run> needs). If your working checkout is called F<perl>, the
133 simplest solution is to make a local clone, and run from that. I<i.e.>:
138 ../perl/Porting/bisect.pl ...
146 --start I<commit-ish>
148 Earliest revision to test, as a I<commit-ish> (a tag, commit or anything
149 else C<git> understands as a revision). If not specified, C<bisect.pl> will
150 search stable perl releases from 5.002 to 5.14.0 until it finds one where
151 the test case passes.
157 Most recent revision to test, as a I<commit-ish>. If not specified, defaults
164 F<Makefile> target (or equivalent) needed, to run the test case. If specified,
165 this should be one of
173 Just run C<Configure>
179 Run the various F<*.SH> files to generate F<Makefile>, F<config.h>, I<etc>.
191 Use F<miniperl> to build F<lib/Config.pm>
197 Build F<lib/auto/Fcntl/Fnctl.so> (strictly, C<.$Config{so}>). As L<Fcntl>
198 is simple XS module present since 5.000, this provides a fast test of
199 whether XS modules can be built. Note, XS modules are built by F<miniperl>,
200 hence this target will not build F<perl>.
206 Build F<perl>. This also builds pure-Perl modules in F<cpan>, F<dist> and
207 F<ext>. XS modules (such as L<Fcntl>) are not built.
213 Build everything needed to run the tests. This is the default if we're
214 running test code, but is time consuming, as it means building all
215 XS modules. For older F<Makefile>s, the previous name of C<test-prep>
216 is automatically substituted. For very old F<Makefile>s, C<make test> is
217 run, as there is no target provided to just get things ready, and for 5.004
218 and earlier the tests run very quickly.
224 --one-liner 'code to run'
230 Example code to run, just like you'd use with C<perl -e>.
232 This prepends C<./perl -Ilib -e 'code to run'> to the test case given,
233 or C<./miniperl> if I<target> is C<miniperl>.
235 (Usually you'll use C<-e> instead of providing a test case in the
236 non-option arguments to C<bisect.pl>)
238 C<-E> intentionally isn't supported, as it's an error in 5.8.0 and earlier,
239 which interferes with detecting errors in the example code itself.
245 The test case should fail for the I<start> revision, and pass for the I<end>
246 revision. The bisect run will find the first commit where it passes.
258 -Accflags=-DNO_MATHOMS
260 Arguments to pass to F<Configure>. Repeated C<-A> arguments are passed
261 through as is. C<-D> and C<-U> are processed in order, and override
262 previous settings for the same parameter.
272 Number of C<make> jobs to run in parallel. If F</proc/cpuinfo> exists and can
273 be parsed, or F</sbin/sysctl> exists and reports C<hw.ncpu>, defaults to
274 1 + I<number of CPUs>. Otherwise defaults to 2.
280 Instead of running a test program to determine I<pass> or I<fail>, pass
281 if the given regex matches, and hence search for the commit that removes
282 the last matching file.
284 If no I<target> is specified, the match is against all files in the
285 repository (which is fast). If a I<target> is specified, that target is
286 built, and the match is against only the built files. C<--expect-fail> can
287 be used with C<--match> to search for a commit that adds files that match.
293 Test that the build completes, without running any test case.
295 By default, if the build for the desired I<target> fails to complete,
296 F<bisect-runner.pl> reports a I<skip> back to C<git bisect>, the assumption
297 being that one wants to find a commit which changed state "builds && passes"
298 to "builds && fails". If instead one is interested in which commit broke the
299 build (possibly for particular F<Configure> options), use I<--test-build>
300 to treat a build failure as a failure, not a "skip".
302 Often this option isn't as useful as it first seems, because I<any> build
303 failure will be reported to C<git bisect> as a failure, not just the failure
304 that you're interested in. Generally, to debug a particular problem, it's
305 more useful to use a I<target> that builds properly at the point of interest,
306 and then a test case that runs C<make>. For example:
308 .../Porting/bisect.pl --start=perl-5.000 --end=perl-5.002 \
309 --expect-fail --force-manifest --target=miniperl make perl
311 will find the first revision capable of building C<DynaLoader> and then
312 C<perl>, without becoming confused by revisions where C<miniperl> won't
319 By default, a build will "skip" if any files listed in F<MANIFEST> are not
320 present. Usually this is useful, as it avoids false-failures. However, there
321 are some long ranges of commits where listed files are missing, which can
322 cause a bisect to abort because all that remain are skipped revisions.
324 In these cases, particularly if the test case uses F<miniperl> and no modules,
325 it may be more useful to force the build to continue, even if files
326 F<MANIFEST> are missing.
332 C<--expect-pass=0> is equivalent to C<--expect-fail>. I<1> is the default.
338 Tell F<bisect-runner.pl> not to clean up after the build. This allows one
339 to use F<bisect-runner.pl> to build the current particular perl revision for
340 interactive testing, or for debugging F<bisect-runner.pl>.
342 Passing this to F<bisect.pl> will likely cause the bisect to fail badly.
348 Validate the options and arguments, and exit silently if they are valid.
362 Display the usage information and exit.
368 die "$0: Can't build $target" if defined $target && !grep {@targets} $target;
370 $j = "-j$j" if $j =~ /\A\d+\z/;
372 # Sadly, however hard we try, I don't think that it will be possible to build
373 # modules in ext/ on x86_64 Linux before commit e1666bf5602ae794 on 1999/12/29,
374 # which updated to MakeMaker 3.7, which changed from using a hard coded ld
375 # in the Makefile to $(LD). On x86_64 Linux the "linker" is gcc.
377 sub extract_from_file {
378 my ($file, $rx, $default) = @_;
379 open my $fh, '<', $file or die "Can't open $file: $!";
382 return wantarray ? @got : $got[0]
385 return $default if defined $default;
390 if ($options{clean}) {
391 # Needed, because files that are build products in this checked out
392 # version might be in git in the next desired version.
393 system 'git clean -dxf </dev/null';
394 # Needed, because at some revisions the build alters checked out files.
395 # (eg pod/perlapi.pod). Also undoes any changes to makedepend.SH
396 system 'git reset --hard HEAD </dev/null';
403 warn "skipping - $reason";
407 sub report_and_exit {
408 my ($ret, $pass, $fail, $desc) = @_;
412 my $got = ($options{'expect-pass'} ? !$ret : $ret) ? 'good' : 'bad';
414 print "$got - $fail $desc\n";
416 print "$got - $pass $desc\n";
430 @files = defined $target ? `git ls-files -o -z`: `git ls-files -z`;
434 foreach my $file (@files) {
435 open my $fh, '<', $file or die "Can't open $file: $!";
439 if (tr/\t\r\n -~\200-\377//c) {
440 print "Binary file $file matches\n";
442 $_ .= "\n" unless /\n\z/;
447 close $fh or die "Can't close $file: $!";
449 report_and_exit(!$matches,
450 $matches == 1 ? '1 match for' : "$matches matches for",
451 'no matches for', $match);
457 my ($file) = $patch =~ qr!^diff.*a/(\S+) b/\1!;
458 open my $fh, '|-', 'patch', '-p1' or die "Can't run patch: $!";
460 close $fh or die "Can't patch $file: $?, $!";
463 # Not going to assume that system perl is yet new enough to have autodie
464 system 'git clean -dxf </dev/null' and die;
466 if (!defined $target) {
467 match_and_exit() if $match;
468 $target = 'test_prep';
471 skip('no Configure - is this the //depot/perlext/Compiler branch?')
472 unless -f 'Configure';
474 # This changes to PERL_VERSION in 4d8076ea25903dcb in 1999
476 = extract_from_file('patchlevel.h',
477 qr/^#define\s+(?:PERL_VERSION|PATCHLEVEL)\s+(\d+)\s/,
481 if (extract_from_file('Configure',
482 qr/^ \*=\*\) echo "\$1" >> \$optdef;;$/)) {
483 # This is " Spaces now allowed in -D command line options.",
484 # part of commit ecfc54246c2a6f42
485 apply_patch(<<'EOPATCH');
486 diff --git a/Configure b/Configure
487 index 3d3b38d..78ffe16 100755
490 @@ -652,7 +777,8 @@ while test $# -gt 0; do
491 echo "$me: use '-U symbol=', not '-D symbol='." >&2
492 echo "$me: ignoring -D $1" >&2
494 - *=*) echo "$1" >> $optdef;;
496 + sed -e "s/'/'\"'\"'/g" -e "s/=\(.*\)/='\1'/" >> $optdef;;
497 *) echo "$1='define'" >> $optdef;;
502 if (extract_from_file('Configure', qr/^if \$contains 'd_namlen' \$xinc\b/)) {
503 # Configure's original simple "grep" for d_namlen falls foul of the
504 # approach taken by the glibc headers:
505 # #ifdef _DIRENT_HAVE_D_NAMLEN
506 # # define _D_EXACT_NAMLEN(d) ((d)->d_namlen)
508 # where _DIRENT_HAVE_D_NAMLEN is not defined on Linux.
509 # This is also part of commit ecfc54246c2a6f42
510 apply_patch(<<'EOPATCH');
511 diff --git a/Configure b/Configure
512 index 3d3b38d..78ffe16 100755
515 @@ -3935,7 +4045,8 @@ $rm -f try.c
517 : see if the directory entry stores field length
519 -if $contains 'd_namlen' $xinc >/dev/null 2>&1; then
520 +$cppstdin $cppflags $cppminus < "$xinc" > try.c
521 +if $contains 'd_namlen' try.c >/dev/null 2>&1; then
522 echo "Good, your directory entry keeps length information in d_namlen." >&4
529 if ($major < 5 && extract_from_file('Configure',
530 qr/^if test ! -t 0; then$/)) {
531 # Before dfe9444ca7881e71, Configure would refuse to run if stdin was not a
532 # tty. With that commit, the tty requirement was dropped for -de and -dE
533 # For those older versions, it's probably easiest if we simply remove the
535 apply_patch(<<'EOPATCH');
536 diff --git a/Configure b/Configure
537 index 0071a7c..8a61caa 100755
540 @@ -93,7 +93,2 @@ esac
543 -if test ! -t 0; then
544 - echo "Say 'sh $me', not 'sh <$me'"
551 if ($major < 10 && extract_from_file('Configure', qr/^set malloc\.h i_malloc$/)) {
552 # This is commit 01d07975f7ef0e7d, trimmed, with $compile inlined as
553 # prior to bd9b35c97ad661cc Configure had the malloc.h test before the
554 # definition of $compile.
555 apply_patch(<<'EOPATCH');
556 diff --git a/Configure b/Configure
557 index 3d2e8b9..6ce7766 100755
560 @@ -6743,5 +6743,22 @@ set d_dosuid
562 : see if this is a malloc.h system
563 -set malloc.h i_malloc
565 +: we want a real compile instead of Inhdr because some systems have a
566 +: malloc.h that just gives a compile error saying to use stdlib.h instead
571 +int main () { return 0; }
574 +if $cc $optimize $ccflags $ldflags -o try $* try.c $libs > /dev/null 2>&1; then
575 + echo "<malloc.h> found." >&4
578 + echo "<malloc.h> NOT found." >&4
588 # There was a bug in makedepend.SH which was fixed in version 96a8704c.
589 # Symptom was './makedepend: 1: Syntax error: Unterminated quoted string'
590 # Remove this if you're actually bisecting a problem related to makedepend.SH
591 system 'git show blead:makedepend.SH > makedepend.SH </dev/null' and die;
593 if ($^O eq 'freebsd') {
594 # There are rather too many version-specific FreeBSD hints fixes to patch
595 # individually. Also, more than once the FreeBSD hints file has been
596 # written in what turned out to be a rather non-future-proof style,
597 # with case statements treating the most recent version as the exception,
598 # instead of treating previous versions' behaviour explicitly and changing
599 # the default to cater for the current behaviour. (As strangely, future
600 # versions inherit the current behaviour.)
601 system 'git show blead:hints/freebsd.sh > hints/freebsd.sh </dev/null'
605 # 5.002 Configure and later have code to
607 # : Try to guess additional flags to pick up local libraries.
609 # which will automatically add --L/usr/local/lib because libpth
610 # contains /usr/local/lib
612 # Without it, if Configure finds libraries in /usr/local/lib (eg
613 # libgdbm.so) and adds them to the compiler commandline (as -lgdbm),
614 # then the link will fail. We can't fix this up in config.sh because
615 # the link will *also* fail in the test compiles that Configure does
616 # (eg $inlibc) which makes Configure get all sorts of things
617 # wrong. :-( So bodge it here.
619 # Possibly other platforms will need something similar. (if they
620 # have "wanted" libraries in /usr/local/lib, but the compiler
621 # doesn't default to putting that directory in its link path)
622 apply_patch(<<'EOPATCH');
623 --- perl2/hints/freebsd.sh.orig 2011-10-05 16:44:55.000000000 +0200
624 +++ perl2/hints/freebsd.sh 2011-10-05 16:45:52.000000000 +0200
627 libpth="/usr/lib /usr/local/lib"
628 glibpth="/usr/lib /usr/local/lib"
630 + ldflags="-Wl,-E -L/usr/local/lib "
633 cccdlflags='-DPIC -fPIC'
636 libpth="/usr/lib /usr/local/lib"
637 glibpth="/usr/lib /usr/local/lib"
639 + ldflags="-Wl,-E -L/usr/local/lib "
641 cccdlflags='-DPIC -fPIC'
648 # if Encode is not needed for the test, you can speed up the bisect by
649 # excluding it from the runs with -Dnoextensions=Encode
650 # ccache is an easy win. Remove it if it causes problems.
651 # Commit 1cfa4ec74d4933da adds ignore_versioned_solibs to Configure, and sets it
652 # to true in hints/linux.sh
653 # On dromedary, from that point on, Configure (by default) fails to find any
654 # libraries, because it scans /usr/local/lib /lib /usr/lib, which only contain
655 # versioned libraries. Without -lm, the build fails.
656 # Telling /usr/local/lib64 /lib64 /usr/lib64 works from that commit onwards,
657 # until commit faae14e6e968e1c0 adds it to the hints.
658 # However, prior to 1cfa4ec74d4933da telling Configure the truth doesn't work,
659 # because it will spot versioned libraries, pass them to the compiler, and then
660 # bail out pretty early on. Configure won't let us override libswanted, but it
661 # will let us override the entire libs list.
663 unless (extract_from_file('Configure', 'ignore_versioned_solibs')) {
664 # Before 1cfa4ec74d4933da, so force the libs list.
667 # This is the current libswanted list from Configure, less the libs removed
668 # by current hints/linux.sh
669 foreach my $lib (qw(sfio socket inet nsl nm ndbm gdbm dbm db malloc dl dld
670 ld sun m crypt sec util c cposix posix ucb BSD)) {
671 foreach my $dir (@paths) {
672 next unless -f "$dir/lib$lib.so";
673 push @libs, "-l$lib";
677 $defines{libs} = \@libs unless exists $defines{libs};
680 # This seems to be necessary to avoid makedepend becoming confused, and hanging
681 # on stdin. Seems that the code after make shlist || ...here... is never run.
682 $defines{trnl} = q{'\n'}
683 if $major < 4 && !exists $defines{trnl};
685 $defines{usenm} = undef
686 if $major < 2 && !exists $defines{usenm};
688 my (@missing, @created_dirs);
690 if ($options{'force-manifest'}) {
691 open my $fh, '<', 'MANIFEST'
692 or die "Could not open MANIFEST: $!";
694 next unless /^(\S+)/;
698 close $fh or die "Can't close MANIFEST: $!";
700 foreach my $pathname (@missing) {
701 my @parts = split '/', $pathname;
702 my $leaf = pop @parts;
705 $path .= '/' . shift @parts;
707 mkdir $path, 0700 or die "Can't create $path: $!";
708 unshift @created_dirs, $path;
710 open $fh, '>', $pathname or die "Can't open $pathname: $!";
711 close $fh or die "Can't close $pathname: $!";
712 chmod 0, $pathname or die "Can't chmod 0 $pathname: $!";
716 my @ARGS = $target eq 'config.sh' ? '-dEs' : '-des';
717 foreach my $key (sort keys %defines) {
718 my $val = $defines{$key};
720 push @ARGS, "-D$key=@$val";
721 } elsif (!defined $val) {
722 push @ARGS, "-U$key";
723 } elsif (!length $val) {
724 push @ARGS, "-D$key";
726 $val = "" if $val eq "\0";
727 push @ARGS, "-D$key=$val";
730 push @ARGS, map {"-A$_"} @{$options{A}};
732 # </dev/null because it seems that some earlier versions of Configure can
733 # call commands in a way that now has them reading from stdin (and hanging)
735 die "Can't fork: $!" unless defined $pid;
737 open STDIN, '<', '/dev/null';
738 # If a file in MANIFEST is missing, Configure asks if you want to
739 # continue (the default being 'n'). With stdin closed or /dev/null,
740 # it exits immediately and the check for config.sh below will skip.
741 exec './Configure', @ARGS;
742 die "Failed to start Configure: $!";
745 or die "wait for Configure, pid $pid failed: $!";
747 if ($target =~ /config\.s?h/) {
748 match_and_exit($target) if $match && -f $target;
749 report_and_exit(!-f $target, 'could build', 'could not build', $target);
750 } elsif (!-f 'config.sh') {
751 # Skip if something went wrong with Configure
753 skip('could not build config.sh');
756 # This is probably way too paranoid:
760 foreach my $file (@missing) {
761 my (undef, undef, $mode, undef, undef, undef, undef, $size)
763 if (!defined $mode) {
764 push @errors, "Added file $file has been deleted by Configure";
767 if (Fcntl::S_IMODE($mode) != 0) {
769 sprintf 'Added file %s had mode changed by Configure to %03o',
774 "Added file $file had sized changed by Configure to $size";
776 unlink $file or die "Can't unlink $file: $!";
778 foreach my $dir (@created_dirs) {
779 rmdir $dir or die "Can't rmdir $dir: $!";
785 # Correct makefile for newer GNU gcc
786 # Only really needed if you comment out the use of blead's makedepend.SH
789 local @ARGV = qw(makefile x2p/makefile);
791 print unless /<(?:built-in|command|stdin)/;
795 if ($major == 2 && extract_from_file('perl.c', qr/^ fclose\(e_fp\);$/)) {
796 # need to patch perl.c to avoid calling fclose() twice on e_fp when using -e
797 # This diff is part of commit ab821d7fdc14a438. The second close was
798 # introduced with perl-5.002, commit a5f75d667838e8e7
799 # Might want a6c477ed8d4864e6 too, for the corresponding change to pp_ctl.c
800 # (likely without this, eval will have "fun")
801 apply_patch(<<'EOPATCH');
802 diff --git a/perl.c b/perl.c
803 index 03c4d48..3c814a2 100644
806 @@ -252,6 +252,7 @@ setuid perl scripts securely.\n");
807 #ifndef VMS /* VMS doesn't have environ array */
808 origenviron = environ;
810 + e_tmpname = Nullch;
814 @@ -405,6 +406,7 @@ setuid perl scripts securely.\n");
816 if (Fflush(e_fp) || ferror(e_fp) || fclose(e_fp))
817 croak("Can't write to temp file for -e: %s", Strerror(errno));
820 scriptname = e_tmpname;
822 @@ -470,10 +472,10 @@ setuid perl scripts securely.\n");
823 curcop->cop_line = 0;
830 (void)UNLINK(e_tmpname);
831 + Safefree(e_tmpname);
832 + e_tmpname = Nullch;
835 /* now that script is parsed, we can modify record separator */
836 @@ -1369,7 +1371,7 @@ SV *sv;
840 - origfilename = savepv(e_fp ? "-e" : scriptname);
841 + origfilename = savepv(e_tmpname ? "-e" : scriptname);
842 curcop->cop_filegv = gv_fetchfile(origfilename);
843 if (strEQ(origfilename,"-"))
849 # Parallel build for miniperl is safe
850 system "make $j miniperl </dev/null";
852 my $expected = $target =~ /^test/ ? 't/perl'
853 : $target eq 'Fcntl' ? "lib/auto/Fcntl/Fcntl.$Config{so}"
855 my $real_target = $target eq 'Fcntl' ? $expected : $target;
857 if ($target ne 'miniperl') {
858 # Nearly all parallel build issues fixed by 5.10.0. Untrustworthy before that.
859 $j = '' if $major < 10;
861 if ($real_target eq 'test_prep') {
863 # test-prep was added in 5.004_01, 3e3baf6d63945cb6.
864 # renamed to test_prep in 2001 in 5fe84fd29acaf55c.
865 # earlier than that, just make test. It will be fast enough.
866 $real_target = extract_from_file('Makefile.SH',
867 qr/^(test[-_]prep):/,
873 and -f 'ext/IPC/SysV/SysV.xs',
874 and my ($line) = extract_from_file('ext/IPC/SysV/SysV.xs',
875 qr!^(# *include <asm/page.h>)$!)) {
876 apply_patch(<<"EOPATCH");
877 diff --git a/ext/IPC/SysV/SysV.xs b/ext/IPC/SysV/SysV.xs
878 index 35a8fde..62a7965 100644
879 --- a/ext/IPC/SysV/SysV.xs
880 +++ b/ext/IPC/SysV/SysV.xs
883 #include <sys/types.h>
887 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
891 system "make $j $real_target </dev/null";
894 my $missing_target = $expected =~ /perl$/ ? !-x $expected : !-r $expected;
896 if ($options{'test-build'}) {
897 report_and_exit($missing_target, 'could build', 'could not build',
899 } elsif ($missing_target) {
900 skip("could not build $real_target");
903 match_and_exit($real_target) if $match;
905 if (defined $options{'one-liner'}) {
906 my $exe = $target =~ /^(?:perl$|test)/ ? 'perl' : 'miniperl';
907 unshift @ARGV, "./$exe", '-Ilib', '-e', $options{'one-liner'};
910 # This is what we came here to run:
911 my $ret = system @ARGV;
913 report_and_exit($ret, 'zero exit from', 'non-zero exit from', "@ARGV");
916 # cperl-indent-level: 4
917 # indent-tabs-mode: nil
920 # ex: set ts=8 sts=4 sw=4 et: