Ошибка компиляции при установке Perl -5.20.2 - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь установить perl -5.20.2 и сталкиваюсь с ошибкой компиляции. Вот шаги, которые я выполнил.

  1. tar -xzf perl -5.20.2.tar.gz
  2. . / Configure -des -Dprefix = $ HOME / local perl
  3. make
  4. make test

Установка зависла после запуска в течение некоторого времени в следующей строке:

cpan/ExtUtils-MakeMaker/t/writemakefile_args .................. ok

cpan/ExtUtils-MakeMaker/t/xs .................................. ok

cpan/File-Fetch/t/01_File-Fetch ............................... Bareword "Errno::EINVAL" not allowed while "strict subs" in use at /root/Desktop/perl-5.20.2/cpan/File-Fetch/../../lib/IO/Socket.pm line 135.

Compilation failed in require at /root/Desktop/perl-5.20.2/cpan/File-Fetch/../../lib/IO/Socket/INET.pm line 11.

BEGIN failed--compilation aborted at /root/Desktop/perl-5.20.2/cpan/File-Fetch/../../lib/IO/Socket/INET.pm line 11.

Compilation failed in require at t/01_File-Fetch.t line 178. #Looks like your test exited with 255 just after 100.

FAILED--non-zero wait status: 65280

cpan/File-Fetch/t/null_subclass ............................... ok

cpan/File-Path/t/Path ......................................... do_ypcall: clnt_call: RPC: Timed out

Я уже пробовал этот процесс на 5 разных машинах Linux (FC25), но я вижу тот же ответ. Я был бы очень признателен за любые входные данные.

O / p команды:

[root@10 ~]# pwd; perl -ne'print if (1 .. 25) || (130 .. 140)' /root/Desktop/perl-5.20.2/lib/IO/Socket.pm
/root
# IO::Socket.pm
# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>.

package IO::Socket;

require 5.006;

use IO::Handle;
use Socket 1.3;
use Carp;
use strict;
our(@ISA, $VERSION, @EXPORT_OK);
use Exporter;
use Errno; 
# legacy
require IO::Socket::INET;
require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian');

@ISA = qw(IO::Handle);
        $err = $sock->getsockopt(SOL_SOCKET,SO_ERROR);
        $@ = "connect: $err";
        }
        elsif(!@$w[0]) {
        $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
        $@ = "connect: timeout";
        }
        elsif (!connect($sock,$addr) &&
                not ($!{EISCONN} || ($^O eq 'MSWin32' &&
                ($! == (($] < 5.019004) ? 10022 : Errno::EINVAL))))
            ) {

1 Ответ

1 голос
/ 12 февраля 2020

Если мы посмотрим на IO/Socket/INET.pm, мы увидим следующее:

my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1;

Это говорит мне о том, что EINVAL не везде доступно. Парены в Errno::EINVAL() в константе, которые будут отсутствовать, пока не будут вызваны, что никогда не будет из-за проверки.

Теперь, если мы посмотрим на IO/Socket.pm, мы увидим, что EINVAL ожидается присутствовать во время компиляции.

elsif (!connect($sock,$addr) &&
    not ($!{EISCONN} || ($^O eq 'MSWin32' &&
    ($! == (($] < 5.019004) ? 10022 : Errno::EINVAL))))
) {
    # Some systems refuse to re-connect() to
    # an already open socket and set errno to EISCONN.
    # Windows sets errno to WSAEINVAL (10022) (pre-5.19.4) or
    # EINVAL (22) (5.19.4 onwards).
    $err = $!;
    $@ = "connect: $!";
}

Чтобы обойти эту проблему, замените Errno::EINVAL на 22 в dist/IO/lib/IO/Socket.pm.

Как только это будет сделано, перезапустите make. (Это должно привести к lib/IO/Socket.pm с изменением. Если оно не получит изменение, попробуйте удалить lib/IO/Socket.pm и снова запустить make.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...