Ubuntu16.04にfmlを入れる

新しいサーバ(Ubuntu16.04)でも、これまで使ってきたfmlをなんとかして使いたい。

しかしこれは太古のパッケージを現代のディストリビューションで使う、というやばい話なので、避けられる人は避けた方が良い。

まず、Debian 4くらいに入っていたdebパッケージを入手する(としか書かない)。

とりあえずインストール。

sudo dpkg -i fml_4.0.3.dfsg-2_all.deb

すると、エラーがでてインストールはできない。

Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at /var/lib/dpkg/info/fml.postinst line 229.

なので、-iはあきらめて、unpack&configureする。

sudo dpkg –unpack fml_4.0.3.dfsg-2_all.deb

以下は修正箇所と修正内容。基本的には配列とかhashのdefinedを消すだけ。

sudo vi +229 /var/lib/dpkg/info/fml.postinst

–            if (defined @entry) {
+            if (@entry) {
+238 で同様に
–                 $key ne “_$package” && $key ne “_DB” && defined %entry
+                 $key ne “_$package” && $key ne “_DB” && %entry
+243 で同様に
–                 (defined %entry) &&
+                 (%entry) &&

これでpostinstは修正完了、configureする。間違っていたら再度修正して繰り返し。

sudo dpkg –configure fml

それから、以下のパッチを当てる。

[debian-users:55112] Re: fmlのDebianパッケージ

にあるように、

— libkern.pl.old      2010-12-30 08:12:13.000000000 +0900
+++ libkern.pl  2010-12-30 08:12:18.000000000 +0900
@@ -616,8 +616,8 @@

     ### Header Fields Extraction
     $s = $Envelope{‘Header’}.”\n”;
–    $* = 0;                    # match one line
–    if ($s =~ /^From\s+(\S+)/i) {
+    # $* = 0;                  # match one line
+    if ($s =~ /^From\s+(\S+)/is) {
        # XXX NO REACH HERE (1999/10/27 by fukachan)
        # $Envelope{‘UnixFrom’} = $UnixFrom = $1;
        $s =~ s/^From\s+.*//i;

をパッチとして当てたら良い(これは確かめてないけど、たぶん当てないと動かないんでしょう)。

その後、色々動作しなかったが、MLのユーザをlistグループに追加し忘れていたり(移行なら意外とはまる穴かも?)、

# sudo adduser mluser list

makefmlの文法エラーも出た。fmlのテスト機能というのがあるので、

$ makefml test mlname

とやってみると、色々とエラーが出る。要領はおんなじ。

Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at /usr/share/fml/makefml line 6246.

$ vi +6246 /usr/share/fml/makefml
–            if (defined @entry) {
+            if (@entry) {
次、
Can’t use ‘defined(%hash)’ (Maybe you should just omit the defined()?) at /usr/share/fml/makefml line 6257.

–                 $key ne “_$package” && $key ne “_DB” && defined %entry
+                 $key ne “_$package” && $key ne “_DB” && %entry
次、
Can’t use ‘defined(%hash)’ (Maybe you should just omit the defined()?) at /usr/share/fml/makefml line 6260.

–                 (defined %entry) &&
+                 (%entry) &&
すると、次は、

Unescaped left brace in regex is deprecated, passed through in regex; marked by <– HERE in m/\$config{ <– HERE \’_ML_\’}/ at /usr/share/fml/makefml line 7003.
Can’t locate getopts.pl in @INC (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/fml/makefml line 139.

(正規表現のエラーが出てるがそれはおいといて)おお、getopts.plがないのか。初情報。少し調べて、以下のパッケージを入れると良いのかも。

sudo apt-get install libperl4-corelibs-perl
なんとこんな名前(perl4ってw)のパッケージが実在することに多少驚きながら、早速入れてみる。すると、fmlがようやく動いた!!

試行錯誤した内容をまとめていますので、不足等あるかもしれませんがご容赦下さい。

2017/6/1追記

上記設定だけでは流れないMLが発生した。

まず、fml.plにlibkern.plと同様の箇所があってエラーが出るので、同じような修正を行った。

— fml.pl.orig 2017-05-26 20:31:48.000576211 +0900
+++ fml.pl      2017-05-26 20:33:04.256837661 +0900
@@ -677,8 +677,8 @@ sub GetFieldsFromHeader
     ### Header Fields Extraction
     $s = $Envelope{‘Header’}.”\n”;
–    $* = 0;                    # match one line
–    if ($s =~ /^From\s+(\S+)/i) {
+    # $* = 0;                  # match one line
+    if ($s =~ /^From\s+(\S+)/is) {
        # XXX NO REACH HERE (1999/10/27 by fukachan)
        # $Envelope{‘UnixFrom’} = $UnixFrom = $1;
        $s =~ s/^From\s+.*//i;
さらに/usr/share/perl5/jcode.plまでも修正してしまう。これはパッケージlibjcode-perl内のファイルなので、ubuntuに連絡をした方が良いかも。
— jcode.pl.orig       2017-06-01 17:30:16.708268955 +0900
+++ jcode.pl    2017-06-01 17:30:54.168279228 +0900
@@ -681,7 +681,7 @@ sub __z2h_jis {
 sub z2h_euc {

&nbs
p;    local(*s, $n) = @_;
–    &init_z2h_euc unless defined %z2h_euc;
+    &init_z2h_euc unless %z2h_euc;
     $s =~ s/($re_euc_c|$re_euc_kana)/
        $z2h_euc{$1} ? ($n++, $z2h_euc{$1}) : $1
     /geo;
@@ -690,7 +690,7 @@ sub z2h_euc {
 sub z2h_sjis {
     local(*s, $n) = @_;
–    &init_z2h_sjis unless defined %z2h_sjis;
+    &init_z2h_sjis unless %z2h_sjis;
     $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
     $n;
 }
ここまででMLは動作しました。まあこんな感じなので、fmlの機能を深く使っているほど、修正箇所が増える感じかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です