Hello,
I'm not sure if this is a bug or a user error, so I thought I would send this
email first. If this is a bug, I can file a bug report for it in Bugzilla.
I am building Perl and associated libraries for a cross-compiled environment
(qemu x86_64 target) from an x86_64 build machine for the Open Source Yocto
project. This is with Perl 5.22.1 (MakeMaker 7.04_01). As part of the
verification process, I am running the test cases on the targetr and get
several failures on the MakeMaker tests. t/basic.t is one such example; the
other failing tests fail in the same manner.
The error is:
cpan/ExtUtils-MakeMaker/t/basic ..............
1..0 # SKIP cross-compiling and make not available
No root path(s) specified
at t/basic.t line 83.
ok 1
ok 2 - teardown
# Tests were run but no plan was declared and done_testing() was not seen.
FAILED--expected 0 tests, saw 2
basic.t contains (in part):
use ExtUtils::MakeMaker;
:
:
use Config;
use Test::More;
use ExtUtils::MM;
plan !MM->can_run(make()) && $ENV{PERL_CORE} && $Config{'usecrosscompile'}
? (skip_all => "cross-compiling and make not available")
: (tests => 171);
use File::Find;
:
:
I am finding that the call MM->can_run(make()) returns undef. make() is defined
in ExtUtils::MM_Any.pm, but it appears to never be called. In addition, make()
relies on the value of $self->MAKE, which is set in init_MAKE(), also defined
in ExtUtils::MM_Any.pm and never called.
Now, I can get this code to work by changing it to look like this:
my $mm = ExtUtils::MM->new();
plan !$mm->can_run($mm->make()) && ...
(init_MAKE() gets called from new(), to set the internal value for MAKE which
is used when make() is called.)
As an aside, the cryptic "No root path(s) specified..." error message is caused
by this line:
END { rmtree $DUMMYINST; }
which always gets executed, even if no tests are run and $DUMMYINST is not
initialized. I changed this line to:
END { rmtree $DUMMYINST if defined $DUMMYINST; }
So, my questions are:
1. How is this intended to work and why did it presumably work when originally
written and committed? IOW, my perl knowledge is obviously lacking here. [One
potential answer here is that it was never tested in a cross-compile
environment, since when $Config{'usecrosscompile'} is not defined, the value
for MM->can_run() doesn't matter, as the plan expression will end up always
being true.]
2. I notice some other tests use MM->can_run($Config{make}). That would work
here, too, and solve the problem, but $Config{make} could be different than the
value returned by make(); does that really matter here?
-Bill Randle
Sr. Software Engineer
Intel Corp.