'all-fixups', 'early-fixup=s@', 'late-fixup=s@', 'valgrind',
'check-args', 'check-shebang!', 'usage|help|?', 'gold=s',
'module=s', 'with-module=s', 'cpan-config-dir=s',
+ 'test-module=s', 'no-module-tests',
'A=s@',
'D=s@' => sub {
my (undef, $val) = @_;
}
pod2usage(exitval => 255, verbose => 1)
- unless @ARGV || $match || $options{'test-build'} || defined $options{'one-liner'} || defined $options{module};
+ unless @ARGV || $match || $options{'test-build'}
+ || defined $options{'one-liner'} || defined $options{module}
+ || defined $options{'test-module'};
pod2usage(exitval => 255, verbose => 1)
if !$options{'one-liner'} && ($options{l} || $options{w});
+if ($options{'no-module-tests'} && $options{module}) {
+ print STDERR "--module and --no-module-tests are exclusive.\n\n";
+ pod2usage(exitval => 255, verbose => 1)
+}
+if ($options{'no-module-tests'} && $options{'test-module'}) {
+ print STDERR "--test-module and --no-module-tests are exclusive.\n\n";
+ pod2usage(exitval => 255, verbose => 1)
+}
+if ($options{module} && $options{'test-module'}) {
+ print STDERR "--module and --test-module are exclusive.\n\n";
+ pod2usage(exitval => 255, verbose => 1)
+}
check_shebang($ARGV[0])
if $options{'check-shebang'} && @ARGV && !$options{match};
In so far, it is not such a misnomer.
-Note that this and L<--with-module> will both require a C<CPAN::MyConfig>.
+Note that this and I<--with-module> will both require a C<CPAN::MyConfig>.
If F<$ENV{HOME}/.cpan/CPAN/MyConfig.pm> does not exist, a CPAN shell will
be started up for you so you can configure one. Feel free to let
CPAN pick defaults for you. Enter 'quit' when you are done, and
then everything should be all set. Alternatively, you may
-specify a custom C<CPAN::MyConfig> by using L<--cpan-config-dir>.
+specify a custom C<CPAN::MyConfig> by using I<--cpan-config-dir>.
Also, if you want to bisect a module that needs a display (like
TK) and you don't want random screens appearing and disappearing
In a terminal:
- $ while true; do date ; if ! ps auxww | grep -v grep | grep -q Xvfb;\
- then Xvfb :121 & fi; echo -n 'sleeping 60 '; sleep 60; done
+ $ while true; do date ; if ! ps auxww | grep -v grep \
+ | grep -q Xvfb; then Xvfb :121 & fi; echo -n 'sleeping 60 '; \
+ sleep 60; done
And then:
--with-module module1,module2,...
-Like L<--module> above, except this simply installs the requested
+Like I<--module> above, except this simply installs the requested
modules and they can then be used in other tests.
For example:
=item *
+--no-module-tests
+
+Use in conjunction with I<--with-module> to install the modules without
+running their tests. This can be a big time saver.
+
+For example:
+
+ .../Porting/bisect.pl --with-module=Moose --no-module-tests \
+ -e 'use Moose; ...'
+
+=item *
+
+--test-module
+
+This is like I<--module>, but just runs the module's tests, instead of
+installing it.
+
+WARNING: This is a somewhat experimental option, known to work on recent
+CPAN shell versions. If you use this option and strange things happen,
+please report them.
+
+Usually, you can just use I<--module>, but if you are getting inconsistent
+installation failures and you just want to see when the tests started
+failing, you might find this option useful.
+
+=item *
+
--cpan-config-dir /home/blah/custom
If defined, this will cause L<CPAN> to look for F<CPAN/MyConfig.pm> inside of
while (<$fh>) {
if ($_ =~ $re) {
++$matches;
- if (tr/\t\r\n -~\200-\377//c) {
+ if (/[^[:^cntrl:]\h\v]/) { # Matches non-spacing non-C1 controls
print "Binary file $file matches\n";
} else {
$_ .= "\n" unless /\n\z/;
my $prefix;
# Testing a module? We need to install perl/cpan modules to a temp dir
-if ($options{module} || $options{'with-module'}) {
+if ($options{module} || $options{'with-module'} || $options{'test-module'})
+{
$prefix = tempdir(CLEANUP => 1);
push @ARGS, "-Dprefix=$prefix";
# Emulate noextensions if Configure doesn't support it.
fake_noextensions()
if $major < 10 && $defines{noextensions};
- system_or_die('./Configure -S');
+ if (system './Configure -S') {
+ # See commit v5.23.5-89-g7a4fcb3. Configure may try to run
+ # ./optdef.sh instead of UU/optdef.sh. Copying the file is
+ # easier than patching Configure (which mentions optdef.sh multi-
+ # ple times).
+ require File::Copy;
+ File::Copy::copy("UU/optdef.sh", "./optdef.sh");
+ system_or_die('./Configure -S');
+ }
}
if ($target =~ /config\.s?h/) {
system "$options{make} $j $real_target </dev/null";
}
-# Testing a cpan module? See if it will install
-if ($options{module} || $options{'with-module'}) {
+my $expected_file_found = $expected_file =~ /perl$/
+ ? -x $expected_file : -r $expected_file;
+
+if ($expected_file_found && $expected_file eq 't/perl') {
+ # Check that it isn't actually pointing to ../miniperl, which will happen
+ # if the sanity check ./miniperl -Ilib -MExporter -e '<?>' fails, and
+ # Makefile tries to run minitest.
+
+ # Of course, helpfully sometimes it's called ../perl, other times .././perl
+ # and who knows if that list is exhaustive...
+ my ($dev0, $ino0) = stat 't/perl';
+ my ($dev1, $ino1) = stat 'perl';
+ unless (defined $dev0 && defined $dev1 && $dev0 == $dev1 && $ino0 == $ino1) {
+ undef $expected_file_found;
+ my $link = readlink $expected_file;
+ warn "'t/perl' => '$link', not 'perl'";
+ die_255("Could not realink t/perl: $!") unless defined $link;
+ }
+}
+
+my $just_testing = 0;
+
+if ($options{'test-build'}) {
+ report_and_exit($expected_file_found, 'could build', 'could not build',
+ $real_target);
+} elsif (!$expected_file_found) {
+ skip("could not build $real_target");
+} elsif (my $mod_opt = $options{module} || $options{'with-module'}
+ || ($just_testing++, $options{'test-module'})) {
+ # Testing a cpan module? See if it will install
# First we need to install this perl somewhere
system_or_die('./installperl');
- my @m = split(',', $options{module} || $options{'with-module'});
+ my @m = split(',', $mod_opt);
my $bdir = File::Temp::tempdir(
CLEANUP => 1,
s/-/::/g if /-/ and !m|/|;
}
my $install = join ",", map { "'$_'" } @m;
+ if ($just_testing) {
+ $install = "test($install)";
+ } elsif ($options{'no-module-tests'}) {
+ $install = "notest('install',$install)";
+ } else {
+ $install = "install($install)";
+ }
my $last = $m[-1];
- my $shellcmd = "install($install); die unless CPAN::Shell->expand(Module => '$last')->uptodate;";
+ my $status_method = $just_testing ? 'test' : 'uptodate';
+ my $shellcmd = "$install; die unless CPAN::Shell->expand(Module => '$last')->$status_method;";
- if ($options{module}) {
+ if ($options{module} || $options{'test-module'}) {
run_report_and_exit(@cpanshell, $shellcmd);
} else {
my $ret = run_with_options({setprgp => $options{setpgrp},
}
}
-my $expected_file_found = $expected_file =~ /perl$/
- ? -x $expected_file : -r $expected_file;
-
-if ($expected_file_found && $expected_file eq 't/perl') {
- # Check that it isn't actually pointing to ../miniperl, which will happen
- # if the sanity check ./miniperl -Ilib -MExporter -e '<?>' fails, and
- # Makefile tries to run minitest.
-
- # Of course, helpfully sometimes it's called ../perl, other times .././perl
- # and who knows if that list is exhaustive...
- my ($dev0, $ino0) = stat 't/perl';
- my ($dev1, $ino1) = stat 'perl';
- unless (defined $dev0 && defined $dev1 && $dev0 == $dev1 && $ino0 == $ino1) {
- undef $expected_file_found;
- my $link = readlink $expected_file;
- warn "'t/perl' => '$link', not 'perl'";
- die_255("Could not realink t/perl: $!") unless defined $link;
- }
-}
-
-if ($options{'test-build'}) {
- report_and_exit($expected_file_found, 'could build', 'could not build',
- $real_target);
-} elsif (!$expected_file_found) {
- skip("could not build $real_target");
-}
-
match_and_exit($real_target, @ARGV) if $match;
if (defined $options{'one-liner'}) {