首页 > 解决方案 > 如何在 Ubuntu 上安装 Perl-5.8.9

问题描述

我有一个遗留的 Perl 5.8.9 项目,需要在 docker 环境中运行。因为我新它在 Ubuntu 上工作,所以我尝试在 Ubuntu 16.1 上编译它并且

FROM ubuntu

RUN apt-get update \
    && apt-get install -y curl \
    && apt-get install -y wget \
    && apt-get install -y perlbrew

NAME="Ubuntu" VERSION="18.04.3 LTS(仿生海狸)" 图像

因为我在 perlbrew 上找不到版本,所以我尝试从我下载的 perl-5.8.9.tar.bz2 编译 编译失败与 miniperl 有关。

perlio.c:515:2: note: in expansion of macro 'PerlLIO_write'
  PerlLIO_write(dbg, s, len);
  ^~~~~~~~~~~~~
perlio.c: In function 'PerlIO_parse_layers':
perlio.c:995:11: warning: this statement may fall through [-Wimplicit-                    
fallthrough=]
        if (*e++) {
       ^
perlio.c:1001:4: note: here
    case '\0':
    ^~~~
In file included from perl.h:3169:0,
                 from perlio.c:57:
perlio.c: In function 'S_more_refcounted_fds':
iperlsys.h:762:39: warning: ignoring return value of 'write', declared             with attribute warn_unused_result [-Wunused-result]
 #define PerlLIO_write(fd, buf, count) write((fd), (buf), (count))
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
perlio.c:2307:2: note: in expansion of macro 'PerlLIO_write'
  PerlLIO_write(PerlIO_fileno(Perl_error_log),
  ^~~~~~~~~~~~~
`sh  cflags "optimize='-O2'" perlapi.o`  perlapi.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-labels -Wc++-compat -DPERL_GCC_PEDANTIC 
`sh  cflags "optimize='-O2'" numeric.o`  numeric.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
`sh  cflags "optimize='-O2'" mathoms.o`  mathoms.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
`sh  cflags "optimize='-O2'" locale.o`  locale.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
`sh  cflags "optimize='-O2'" pp_pack.o`  pp_pack.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
pp_pack.c: In function 'S_pack_rec':
pp_pack.c:2716:7: warning: variable 'was_utf8' set but not used [-    Wunused-but-set-variable]
   U32 was_utf8;
   ^~~~~~~~
`sh  cflags "optimize='-O2'" pp_sort.o`  pp_sort.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -    I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
`sh  cflags "optimize='-O2'" opmini.o`  -DPERL_EXTERNAL_GLOB opmini.c
          CCCMD =  cc -DPERL_CORE -c -fno-strict-aliasing -pipe -vI/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -std=c89 -    O2  -Wall -ansi -pedantic -W -Wextra -Wdeclaration-after-statement -Wendif-    labels -Wc++-compat -DPERL_GCC_PEDANTIC 
opmini.c: In function 'Perl_list':
opmini.c:977:5: warning: this statement may fall through [-Wimplicit-    fallthrough=]
  if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
    ^
opmini.c:981:5: note: here
     case OP_LIST:
     ^~~~
opmini.c: In function 'Perl_mod':
opmini.c:1277:11: warning: this statement may fall through [-Wimplicit-v
fallthrough=]
  PL_hints |= HINT_BLOCK_SCOPE;
opmini.c:1278:5: note: here
     case OP_SASSIGN:
     ^~~~
opmini.c: In function 'Perl_fold_constants':
opmini.c:2119:40: warning: argument 'o' might be clobbered by 'longjmp'     or 'vfork' [-Wclobbered]
 Perl_fold_constants(pTHX_ register OP *o)
                                    ^
cc -L/usr/local/lib -o miniperl \
    `echo  gv.o toke.o perly.o op.o pad.o regcomp.o dump.o util.o mg.o     reentr.o hv.o av.o perl.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o     pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o xsutils.o     globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o     pp_sort.o  | sed 's/ op.o / /'` \
   miniperlmain.o opmini.o 
pp.o: In function `Perl_pp_pow':
pp.c:(.text+0x2d84): undefined reference to `pow'
pp.o: In function `Perl_pp_modulo':
pp.c:(.text+0x3b80): undefined reference to `fmod'
pp.o: In function `Perl_pp_atan2':
pp.c:(.text+0x8884): undefined reference to `atan2'
pp.o: In function `Perl_pp_sin':
pp.c:(.text+0x8978): undefined reference to `sqrt'
pp.c:(.text+0x8a23): undefined reference to `log'
pp.c:(.text+0x8a4e): undefined reference to `cos'
pp.c:(.text+0x8afb): undefined reference to `sin'
pp.c:(.text+0x8b13): undefined reference to `exp'
collect2: error: ld returned 1 exit status
makefile:313: recipe for target 'miniperl' failed
make: *** [miniperl] Error 1

有现成的 docker 镜像吗?如果不是,我该如何安装在 ubuntu 上,或者最好安装在 alpine 或其他轻型容器上。

标签: perldockerubuntu

解决方案


perl-5.8.0

我在创建 2 个目录时解决了这个问题:

mkdir -p /home/<username>/perl5/perlbrew/dists/
mkdir -p /home/<username>/perl5/perlbrew/build/perl-5.8.0

给了 rwx-rwx-rwx (以避免任何访问问题):

chmod -Rf 0777 /home/<username>/perl5/perlbrew/dists
chmod -Rf 0777 /home/<username>/perl5/perlbrew/build/perl-5.8.0

推荐阅读