2022年8月24日水曜日
同窓会のメーリングリストの管理をしているのだが、
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などでは、
この問題は無いかもしれない。