俺だけのために Ore! Tips!

FreeBSD 5.2.1-R に lha(autoconf/automake 版)をインストール

2005年03月13日 作業

FreeBSD 5.2.1-R に lha(autoconf/automake 版)をインストールした記録。

今度、UNIX サーバ上のプログラム内で、Windows マシンでアーカイブしたファイルを解凍・伸長してやる必要が出てきた。ターゲットマシンは Sun Cobalt だが、開発に使うのは FreeBSD である。
実は、開発に使う FreeBSD 5.2.1-RELEASE-p10 には packages から lha-1.14i_2 を入れている。こいつを外部プログラムとして実行してやればええわけやね。

zakuro# pkg_info|grep lha
lha-1.14i_2 Archive files using LZSS and Huffman compression (.lzh file

しかし、ググってみると、lha には 5.2.1-RELEASE の packages に入った後に更新された版があるので、その最新版である lha-1.14i-ac20040929 をソースからインストールしてみた。

インストールの前に、packages から入れた lha を待避しておく。

zakuro# mv /usr/local/bin/lha /usr/local/bin/lha.org

まず、ソースファイルを取得。

http://sourceforge.jp/projects/lha からリンクを伝っていって、
http://prdownloads.sourceforge.jp/lha/11617/lha-1.14i-ac20040929.tar.gz
をダウンロードする。

以前の lha は手動でコンパイラのオプションなど与えてコンパイルする必要があったようだが、今は autoconf/automake 化されているのでわしのような「C の世界はちょっと・・・」という人間にも簡単に make 出来てありがたいことである。

ダウンロードしたファイルを解凍・伸長。

zakuro# pwd
/usr/local/src
zakuro# tar xvfz lha-1.14i-ac20040929.tar.gz
lha-1.14i-ac20040929/
lha-1.14i-ac20040929/tests/
lha-1.14i-ac20040929/tests/Makefile.in
<略>
lha-1.14i-ac20040929/src/util.c
lha-1.14i-ac20040929/src/lhdir.h
lha-1.14i-ac20040929/src/fnmatch.h

では、早速 configure してから make 実行。autoconf に対応したソフトのインストールは本当に楽だ。

zakuro# cd lha-1.14i-ac20040929
zakuro# ./configure
checking build system type... i386-unknown-freebsd5.2.1
checking host system type... i386-unknown-freebsd5.2.1
checking target system type... i386-unknown-freebsd5.2.1
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
<略>
config.status: creating tests/lha-test
config.status: creating config.h
config.status: executing depfiles commands
zakuro# make
make all-recursive
Making all in man
Making all in olddoc
Making all in src
if gcc -DHAVE_CONFIG_H -I. -I. -I..  -DEUC -DSUPPORT_LH7    -g -O2 -MT append.o -MD -MP -MF ".deps/append.Tpo"  -c -o append.o `test -f 'append.c' || echo './'`append.c;  then mv -f ".deps/append.Tpo" ".deps/append.Po";  else rm -f ".deps/append.Tpo"; exit 1;  fi
<略>
gcc  -g -O2   -o lha  append.o bitio.o crcio.o  dhuf.o extract.o header.o huf.o  indicator.o larc.o lhadd.o  lharc.o lhext.o lhlist.o  maketbl.o maketree.o patmatch.o  shuf.o slide.o util.o
Making all in tests
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored

むむ・・・。なんか Makefile の既述についてのワーニングが・・・
ワーニングだからほっておくか・・・

zakuro# make install
Making install in man
/bin/sh ../mkinstalldirs /usr/local/man/mann
/usr/bin/install -c -m 644 ./lha.n /usr/local/man/mann/lha.n
Making install in olddoc
Making install in src
/bin/sh ../mkinstalldirs /usr/local/bin
/usr/bin/install -c lha /usr/local/bin/lha
Making install in tests
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored
"Makefile", line 287: warning: duplicate script for target "lha-test" ignored

あれれ・・・ make install でもワーニングが出たな。でも、まあ、ワーニングだから。良しとしよう。

で、できあがったファイルを見てみる。

zakuro# ls -la /usr/local/bin/lha*
-rwxr-xr-x  1 root  wheel  273996 Mar 13 15:35 /usr/local/bin/lha
-r-xr-xr-x  1 root  wheel   52060 Mar 13 14:39 /usr/local/bin/lha.org


packages で入れた lha より、えらく巨大になってるな・・・
ヘルプを見てみると、

◆lha-1.14i-ac20040929
usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
  commands:  [axelvudmcpt]
  options:   [q[012]vnfto[567]dizg012e[w=<dir>|x=<pattern>]]

◆lha-1.14i_2
usage: lha [-]{axelvudmcp[q[num]][vnfodizg012]}[w=<dir>] archive_file [file...]

ということで、lha-1.14i_2 は usage に command や option の t を載せてなかったりして、なんか変。

まあ、x=<pattern> というオプションが lha-1.14i-ac20040929 の方には追加されていたりするので、それも大きくなった原因なんだろうけど、要は、packages の lha はコンパイル時に最適化されてたんだろうなあ。
ま、別にシビアなパフォーマンスを必要とするわけじゃないので、これはこれでいいのだ。

じゃ、Windows 上で日本語を含む名前のファイルを圧縮した LZH ファイルを使ってテストしてみる。

%lha l temp20050312.lzh
PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
---------- ----------- ------- ------ ------------ --------------------
[MS-DOS]                 23432  18.0% Mar 10 11:10 01通常平日下通過.csv
[MS-DOS]                 23060  17.7% Mar 10 11:10 01通常平日上通過.csv
[MS-DOS]                 26740  20.2% Mar 10 11:10 02通常平日下通過.csv
[MS-DOS]                 37496  16.9% Mar 10 11:10 02通常平日上通過.csv
[MS-DOS]                 24001  19.9% Mar 10 11:10 03通常平日下通過.csv
[MS-DOS]                 23556  17.9% Mar 10 11:10 03通常平日上通過.csv
[MS-DOS]                 16640  19.1% Mar 10 11:10 05通常平日下通過.csv
[MS-DOS]                 16328  19.8% Mar 10 11:10 05通常平日上通過.csv
[MS-DOS]                 18644  16.6% Mar 10 11:10 06通常平日下通過.csv
[MS-DOS]                 18644  16.9% Mar 10 11:10 06通常平日上通過.csv
[MS-DOS]                 12460  19.1% Mar 10 11:10 07通常平日下通過.csv
[MS-DOS]                  9964  21.6% Mar 10 11:10 07通常平日上通過.csv
[MS-DOS]                 10255  20.2% Mar 10 11:10 08通常平日下通過.csv
[MS-DOS]                 10255  19.8% Mar 10 11:10 08通常平日上通過.csv
[MS-DOS]                  5904  25.0% Mar 10 11:10 09通常平日下通過.csv
[MS-DOS]                  5904  24.9% Mar 10 11:10 09通常平日上通過.csv
---------- ----------- ------- ------ ------------ --------------------
 Total        16 files  283283  18.8% Mar 13 15:53
%lha e -e temp20050312.lzh
01通常平日下通過.csv    - Melted   :  ooo
01通常平日上通過.csv    - Melted   :  ooo
02通常平日下通過.csv    - Melted   :  oooo
02通常平日上通過.csv    - Melted   :  ooooo
03通常平日下通過.csv    - Melted   :  ooo
03通常平日上通過.csv    - Melted   :  ooo
05通常平日下通過.csv    - Melted   :  ooo
05通常平日上通過.csv    - Melted   :  oo
06通常平日下通過.csv    - Melted   :  ooo
06通常平日上通過.csv    - Melted   :  ooo
07通常平日下通過.csv    - Melted   :  oo
07通常平日上通過.csv    - Melted   :  oo
08通常平日下通過.csv    - Melted   :  oo
08通常平日上通過.csv    - Melted   :  oo
09通常平日下通過.csv    - Melted   :  o
09通常平日上通過.csv    - Melted   :  o
%ls -la
total 354
drwxr-xr-x  2 shinoda  admin   1024 Mar 13 16:05 .
drwxr-xr-x  3 shinoda  admin    512 Mar 13 15:55 ..
-rw-r--r--  1 shinoda  admin  23432 Mar 10 11:10 01??????????????.csv
-rw-r--r--  1 shinoda  admin  23060 Mar 10 11:10 01??????????????.csv
-rw-r--r--  1 shinoda  admin  26740 Mar 10 11:10 02??????????????.csv
-rw-r--r--  1 shinoda  admin  37496 Mar 10 11:10 02??????????????.csv
-rw-r--r--  1 shinoda  admin  24001 Mar 10 11:10 03??????????????.csv
-rw-r--r--  1 shinoda  admin  23556 Mar 10 11:10 03??????????????.csv
-rw-r--r--  1 shinoda  admin  16640 Mar 10 11:10 05??????????????.csv
-rw-r--r--  1 shinoda  admin  16328 Mar 10 11:10 05??????????????.csv
-rw-r--r--  1 shinoda  admin  18644 Mar 10 11:10 06??????????????.csv
-rw-r--r--  1 shinoda  admin  18644 Mar 10 11:10 06??????????????.csv
-rw-r--r--  1 shinoda  admin  12460 Mar 10 11:10 07??????????????.csv
-rw-r--r--  1 shinoda  admin   9964 Mar 10 11:10 07??????????????.csv
-rw-r--r--  1 shinoda  admin  10255 Mar 10 11:10 08??????????????.csv
-rw-r--r--  1 shinoda  admin  10255 Mar 10 11:10 08??????????????.csv
-rw-r--r--  1 shinoda  admin   5904 Mar 10 11:10 09??????????????.csv
-rw-r--r--  1 shinoda  admin   5904 Mar 10 11:10 09??????????????.csv
-rw-r--r--  1 shinoda  admin  54077 Mar 13 15:53 temp20050312.lzh


う〜む、化け化けじゃのお。
わしの locale で EUC を設定してないからかいのお?

perl 内部から日本語ファイル名が引けるかやってみる。

%cat > test.pl
open (IN, "01通常平日下通過.csv");
@d = <IN>;
close(IN);

print $d[0];
print $d[1];
print $d[2];
print $d[3];

exit();


こんな感じのプログラムを作成。これを実行して「01通常平日下通過.csv」が読み込めれば問題なし。

%perl test.pl
1,下,平日,2005/2/11,,,,,,,,,,,,,,,,,,,,,,,
広島駅,猿猴橋町,的場町(本), 稲荷町,銀山町,胡町,八丁堀(本),立町,紙屋町東,本通 ,袋町,中電前,市役所前,鷹野橋,日赤病院前,広電本社前,御幸橋,皆実町6丁目(本,広大付属学校前,県病院前,宇品2丁目,宇品3丁目,宇品4丁目,宇品5丁目,海岸通,元宇品口 ,広島港
,,,,,,,,,,,,,,,5:59, 6:00, 6:02, 6:03, 6:04, 6:05, 6:06, 6:07, 6:08, 6:09, 6:11, 6:15,,,,,,,,,,,,,,,6:08, 6:09, 6:11, 6:12, 6:13, 6:14, 6:15, 6:16, 6:17, 6:18, 6:20, 6:24


おお、ちゃんと読めてるじゃん。
さすが日本の生んだ archiver!!ちゃんと EUC コードで出力しているようだ。

実はこれ、
%lha e -e temp20050312.lzh
という具合に -e オプション(TEXT code convert from/to EUC)を付けているので、解凍時に TEXT ファイルのコードを EUC 変換してくれているので、ファイルの中身もちゃんと EUC で表示されている。
ただ単に、
%lha e temp20050312.lzh
とすると、ファイルの中身は Shift_JIS のままである。(まあ、それでもファイル名は EUC 変換されるのでプログラム内からファイルを読み込むことは出来るけどね)

lha では日本語ファイル名の利用が OK のようなので、unzip(ZIP ファイルの解凍)も試してみる。

%unzip temp20050312.zip
Archive:  temp20050312.zip
  inflating: 05簿             鋪.csv
  inflating: 05簿     潼csv
  inflating: 06簿             鋪.csv
  inflating: 06簿     潼csv
  inflating: 07簿             鋪.csv
  inflating: 07簿     潼csv
  inflating: 08簿             鋪.csv
  inflating: 08簿     潼csv
  inflating: 09簿             鋪.csv
  inflating: 09簿     潼csv
  inflating: 01簿             鋪.csv
  inflating: 01簿     潼csv
  inflating: 02簿             鋪.csv
  inflating: 02簿     潼csv
  inflating: 03簿             鋪.csv
  inflating: 03簿     潼csv

わ、わ。駄目だ、こりゃ。化け化け。

%perl test.pl
%


ファイル名も Shift_JIS で出力されてしまうので、EUC で書いた perl プログラム内で指定したファイル名とはマッチしないんだなあ。
まあ、プログラム内で Shift_JIS に変換してやれば良いんだろうけど、やはり気持ちわるいなあ・・・。
日本語の混ざったファイル名を使用する時は lha 最高!!unzip は駄目、駄目。

ということで、LHA 最高!最高!!


前ページに戻る


Copyright (C) 2004-2005 S.Maaasamasa.