On 11/14/2016 09:11 AM, Todd Rinaldo wrote:
> Howdy,
>
> I've done a write up of a recent change to blead perl. In the future it will no longer be possible to count on . being in @INC. This will break many of the existing CPAN installs.
>
> It was suggested I send the RFC here:
>
> http://blogs.perl.org/users/todd_rinaldo/2016/11/how-removing-from-inc-is-about-to-break-cpan.html
>
> In Perl 5.26, it will no longer be a safe assumption to assume . is in @INC. This is a good move towards a more secure Perl, but will break the installation of many CPAN modules. For those of you wondering why this was done, see this post for more information.
>
> Many CPAN modules try to do things like: use inc::Module::Install; This depends on . being in @INC. If you invoke Makefile.PL without it, the script will not even run.
>

Here is a use case which I found very soon after building a perl at blead with the new option and then installing App::cpanminus against that perl.

#####
Summary of my perl5 (revision 5 version 25 subversion 7) configuration:
  Commit id: dd4f16e4ff71ea6d0422d277f00fe430e1d93938
[snip]
config_args='-des -Dusedevel -Uversiononly -Dprefix=/home/jkeenan/testing/nodot -Dman1dir=none -Dman3dir=none -Ddefault_inc_excludes_dot'
[snip]
  @INC:
    lib
    /home/jkeenan/testing/nodot/lib/perl5/site_perl/5.25.7/x86_64-linux
    /home/jkeenan/testing/nodot/lib/perl5/site_perl/5.25.7
    /home/jkeenan/testing/nodot/lib/perl5/5.25.7/x86_64-linux
    /home/jkeenan/testing/nodot/lib/perl5/5.25.7
#####

I used ./bin/cpanm to install one of my CPAN distros that has a second-level dependency on another one of those distros, Perl-StringIdentifier.

#####
Building and testing String-PerlIdentifier-0.05 ... FAIL
! Installing String::PerlIdentifier failed. See /home/jkeenan/.cpanm/work/1479138905.14485/build.log for details. Retry with --force to force install it.
#####

Let's inspect that build log.

#####
PERL_DL_NONLAZY=1 "/home/jkeenan/testing/nodot/bin/perl" "-MExtUtils::Command::MM" "-MTest::Harness" "-e" "undef *Test::Harness::Switches; test_harness(0, 'blib/lib', 'blib/arch')" t/*.t Can't locate t/eligible_chars in @INC (@INC contains: t/ /home/jkeenan/.cpanm/work/1479138905.14485/String-PerlIdentifier-0.05/blib/lib /home/jkeenan/.cpanm/work/1479138905.14485/String-PerlIdentifier-0.05/blib/arch /home/jkeenan/testing/nodot/lib/perl5/site_perl/5.25.7/x86_64-linux /home/jkeenan/testing/nodot/lib/perl5/site_perl/5.25.7 /home/jkeenan/testing/nodot/lib/perl5/5.25.7/x86_64-linux /home/jkeenan/testing/nodot/lib/perl5/5.25.7) at t/Auxiliary.pm line 14.
Compilation failed in require at t/01_basic.t line 8.
BEGIN failed--compilation aborted at t/01_basic.t line 8.
# Looks like your test exited with 2 just after 1.
t/01_basic.t ......
Dubious, test returned 2 (wstat 512, 0x200)
Failed 40/41 subtests
#####

Here's what that distro has in/under its 't/' directory.

#####
$ ls t |cat
01_basic.t
02_specified.t
03_min.t
04_max.t
05_default.t
06_no_scores.t
Auxiliary.pm
eligible_chars
#####

#####
$ head t/01_basic.t
# t/01_basic.t - four basic tests
use Test::More tests => 41;
use strict;
use warnings;

BEGIN { use_ok( 'String::PerlIdentifier' ); }
use lib ("t/");
use Auxiliary qw{ _first_and_subsequent };

four_basic_tests() for (1..10);
#####
$ head -15 t/Auxiliary.pm
package Auxiliary;
use strict;
use warnings;
our ($VERSION, @ISA, @EXPORT_OK);
$VERSION = '0.05';
require Exporter;
@ISA         = qw(Exporter);
@EXPORT_OK   = qw(
    _first_and_subsequent
);
*ok = *Test::More::ok;
use lib ('.');

our (%eligibles, %chars);
require "t/eligible_chars";
#####

The test file attempts to load Auxiliary.pm, which is located in the same directory as the test file. Auxiliary.pm in turn 'require's a plain-text file, 'eligible_chars', which is also located in t/. That 'require' fails.

In this case, adding '.' to the distribution's Makefile.PL made no difference. I had to add "use lib ('.');" to Auxiliary.pm to enable it to locate 'eligible_chars', after which 'make test' PASSed.

Based on this example and several other failures, my hunch is that many of the failures which we'll see on CPAN are failures of *tests* rather than failures of the modules themselves.

Thank you very much.
Jim Keenan

Reply via email to