h_nari @ 熊本市のブログ。電子工作、プログラミング、ゲーム、TV、 政治、インターネットなどに日々の思い付きを、 うだうだ~と書いていきたい。
このブログにはコメント欄を設けておりません。 記事への御意見、ご質問はtwitter @h_nari宛に お願い致します。


アーカイブ


アマゾン・ベストセラー

メタ情報
RSS
Login

ubuntu20.04にperl5.8をインストール

同窓会のメーリングリストの管理をしているのだが、 gmail.comにメールが届かないとか いろいろ問題が出てきたので この機会に、対応と同時に 別のサーバに移動することにした。 使用しているメーリングリストのソフト fml4 は20年前ぐらいに更新が止まっている。 利用者は、まだ多いと思うのだが 皆どうしているのだろう。 最近のperlだとエラーが出る。 $* とか defined(@array)が使えないとかの 簡単なエラーなのだが、変更箇所が多くて大変だ。 perl5.8を使えばエラーが出ないということで、 インストールを試みたが、手こずったので やり方を報告する。

使用している環境は ubuntu20.04 である。

ソースの入手

適当な作業用ディレクトリにソースを ダウンロードし展開する。

$ wget https://www.cpan.org/src/5.0/perl-5.8.9.tar.gz
$ tar xzf perl-5.8.9.tar.gz

コンパイルする

$ cd perl-5.8.9
$ ./Configure -de -Dprefix=/usr/local/perl-5.8
$ make

以下のようなエラーが出る。

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
/usr/bin/ld: pp.o: in function `Perl_pp_pow':
pp.c:(.text+0x2d10): undefined reference to `pow'
/usr/bin/ld: pp.o: in function `Perl_pp_modulo':
pp.c:(.text+0x3adb): undefined reference to `fmod'
/usr/bin/ld: pp.o: in function `Perl_pp_atan2':
pp.c:(.text+0x898c): undefined reference to `atan2'
/usr/bin/ld: pp.o: in function `Perl_pp_sin':
pp.c:(.text+0x8a8a): undefined reference to `exp'
/usr/bin/ld: pp.c:(.text+0x8b49): undefined reference to `sqrt'
/usr/bin/ld: pp.c:(.text+0x8bab): undefined reference to `cos'
/usr/bin/ld: pp.c:(.text+0x8bc3): undefined reference to `sin'
/usr/bin/ld: pp.c:(.text+0x8c23): undefined reference to `log'
collect2: error: ld returned 1 exit status
make: *** [makefile:314: miniperl] Error 1
$

"-lm"とか指定してやればよさそうだが、 どうすれば良いかわからない。 ネットで調べると古いperlのインストールに苦労している人は 多いらしく情報がいろいろある。

結論を言うと以下の方法でコンパイル&インストールできた。

$ make distclean
$ ./Configure -de -Dplibpth=/lib/x86_64-linux-gnu -Dprefix=/usr/local/perl-5.8
$ make
  ...
$ make test
  ...
$ sudo make install

調査方法

/lib/x86_64-linux-gnu などという謎のディレクトリを どう発見したかを説明する。

まず簡単なcのプログラムを用意し、 コンパイル&動作することを確認した。

$ cat hello.c
#include <stdio.h>
#include <math.h>
int main(){
  printf("Hello World\n");
  printf("root 2 = %f\n", sqrt(2));
  return 0;
}
$ cc hello.c
$ ./a.out
Hello World
root 2 = 1.414214
$

lddで使用しているライブラリを表示させる。

$ ldd a.out
        linux-vdso.so.1 (0x00007ffc193d1000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb2ce7f2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb2ce9f4000)
$

/lib/x86_64-linux-gnu という見慣れぬディレクトリがあり、 中には大量のライブラリがあった。

$ ls /lib/x86_64-linux-gnu/
Mcrt1.o                              liblber-2.4.so.2@
ModemManager/                        liblber-2.4.so.2.10.12
... 大量のライブラリ ...
libkyotocabinet.so.16.13.0           xtables/
$

ということで、Configureで、このディレクトリを指定すると perl-5.8をコンパイルできた。 使用しているシステムは ubuntu20.04だが、 debian 10.10にも同じようなディレクトリがあった。 ネットの情報を見ていると CentOSなどでは、 この問題は無いかもしれない。