1 LHa for UNIX with Autoconf
2 =======================
4 このファイルは、Autoconf 版 LHa for UNIX について説明します。
7 --------------------------------
12 gzip -dc lha-1.14i-acXXXXXXXX.tar.gz | tar xvf -
13 cd lha-114i-acXXXXXXXX
21 MinGW 対応はα版です。ほとんどテストされていません(make check が成功
22 する程度)。Cygwin 環境で MinGW 版を試すには
26 --build=i686-pc-mingw32 \
27 --host=x86_64-w64-mingw32 \
33 ※ Cygwin や MinGW 等、Windows 環境では深いディレクトリでコンパイル
34 するとmake check が失敗する場合があります。これは長いパスの格納
35 チェックをするときに、Windows のフルパス長の制限にひっかかるため
36 です。このような場合は、以下のように configure を浅めのディレクト
42 sh ~/src/lha/configure ....
48 autoconf/automake がインストールされている場合で、lha ソースや
49 configure.ac, Makefile.am をメンテナンスする場合は以下の手順になりま
50 す。autoconf/automake のバージョンはそれぞれ autoconf 2.5x, automake
51 1.6.x 以降での利用を前提としています。
54 gzip -dc lha-1.14i-acXXXXXXXX.tar.gz | tar xvf -
55 cd lha-114i-acXXXXXXXX
62 # aclocal から autoconf 実行までの手順は、最近では、autoreconf -is
72 ----------------------------------------
74 Autoconf 版 LHa for UNIX は、
75 LHa for UNIX ver1.14i <http://www2m.biglobe.ne.jp/~dolphin/lha/lha.htm>
80 ### -lh6-, -lh7- メソッドのアーカイブ作成
82 オリジナルの LHa for UNIX 1.14i では、SUPPORT_LH7 の定義をせずにコン
83 パイルした場合、-lh6- および -lh7- メソッドのアーカイブを作成できま
84 せんでした。このことは別に構わないのですが SUPPORT_LH7 を定義すると
85 デフォルトで -lh7- メソッドのアーカイブ作成を強制されてしまいます。
86 そこで、もう少し柔軟に lha 利用者がこれらを選択できるよう
87 SUPPORT_LH7 は常に定義するようにし、デフォルトで作成されるアーカイブ
88 のメソッド指定を configure オプションの --with-default-method=[567]
91 このオプションの省略値は -lh5- です。つまりデフォルトでは -lh5- アー
92 カイブを作成します。(そして、上で述べた通り、lhaの o6 または o7 オプ
93 ションによりいつでも-lh6-、-lh7- アーカイブを作成でき、configure オ
94 プションによりデフォルトの挙動を変更することができます)
98 オリジナルの LHa for UNIX 1.14i はアーカイブに格納するファイル名の漢
99 字コードに関して無頓着です。コンパイル時に MULTIBYTE_CHAR を定義した
100 ときでもアーカイブ中の Shift JIS ファイル名を EUC にすることもなく、
101 EUC コードのまま(正確にはシステムの漢字コードのまま)アーカイブに格納
104 autoconf 版では、configure オプション --enable-multibyte-filename に
105 より漢字ファイル名が使用でき、アーカイブに格納されるファイル名の漢字
108 --enable-multibyte-filename の引数(システムのファイル名の漢字コード
112 --enable-multibyte-filename=sjis
113 システムの漢字コードを SJIS として扱います。
114 --enable-multibyte-filename=euc
115 システムの漢字コードを EUC として扱います。
116 --enable-multibyte-filename=utf8
117 システムの漢字コードを UTF-8 として扱います。
118 今のところ Mac OS X でだけこのオプションをサポートします。
119 --enable-multibyte-filename=auto (または yes または引数なし)
120 システムの漢字コードを自動で判別します。自動といっても現状は、
121 Cygwin, MinGW, HP-UX の場合に SJIS、Mac OS X の場合 UTF-8、
123 --enable-multibyte-filename=no
124 --disable-multibyte-filename
125 ファイル名のマルチバイトサポートを無効にします。
130 lha のコマンドラインオプションにより、コンパイル時のデフォルト指定を
131 変更することができます。このコマンドラインオプションは、GNU style の
132 long option (ダッシュ2つが先行するスタイル)で指定します。
135 --system-kanji-code=xxx
136 システムのファイル名の漢字コードを指定します。
138 --archive-kanji-code=xxx
139 アーカイブ内へ格納するときのファイル名のコードを指定し
140 ます。これは通常 SJIS 固定なので変更するべきではありま
144 xxx は sjis, euc, utf8, cap のいずれかです。cap は、samba などで使われる
145 コードで、漢字コードを ":" と 16 進文字で表現するコードです。
154 PERMISSION UID GID SIZE RATIO STAMP NAME
155 ---------- ----------- ------- ------ ------------ --------------------
156 -rw-r--r-- 1000/1000 0 ****** Mar 23 21:23 漢字
157 ---------- ----------- ------- ------ ------------ --------------------
158 Total 1 file 0 ****** Mar 23 21:23
160 $ lha l --system-kanji-code=cap foo.lzh
162 PERMISSION UID GID SIZE RATIO STAMP NAME
163 ---------- ----------- ------- ------ ------------ --------------------
164 -rw-r--r-- 1000/1000 0 ****** Mar 23 21:23 :8a:bf:8e:9a
165 ---------- ----------- ------- ------ ------------ --------------------
170 Mac OS X 用の utf8 <-> sjis 変換は、2002/6 に坂井浩人さんに作成して
173 また、Mac OS X 以外でも、iconv ライブラリを使用すれば、UTF-8 を使用す
174 ることができます。ただし、現在のところ iconv ライブラリの存在を自動的
175 に検出しないので、libc に iconv() 関数がなく、libiconv が存在する
176 (iconvライブラリをリンクする必要がある)環境では、コンパイル時に
179 sh ./configure LIBS=-liconv
186 オリジナルの LHa for UNIX 1.14i は、
189 echo foo.txt | lha x foo.lzh
190 find bar -name '*.[ch]' | lha c bar.lzh
193 とすると、foo.lzh から foo.txt だけを展開したり、bar ディレクトリ配
194 下のファイルを bar.lzh に格納したりできます。つまり、標準入力から、
195 圧縮/展開ファイルを指定できる機能なのですが、いまいち使い道がないわ
196 りに邪魔な機能です(圧縮の例は、cpio 同様まあ使えるけど、このためのオ
197 プションを新設するのが良いと考えています)
199 tty からの利用しか想定してないと思われますが、おそらく daemon から
200 lha を実行する場合などで意図しない動作をするでしょう。そういうわけで
201 勝手ながらこの機能は削除しました。以下のような事ができない Windows
202 環境では意味のある機能だったかもしれませんが
205 lha x bar.lzh `echo foo.txt`
208 残念ながら MinGW で isatty() がうまく動作しませんでしたから Windows
211 オリジナルの仕様を復活させたい場合は、lharc.c の 568行目付近の #if 0
214 ### 拡張ヘッダ(ユーザ名/グループ名)のサポート
216 ユーザ名、グループ名の拡張ヘッダ(0x52, 0x53)を作成できるようにしまし
217 た(デフォルトはoff)。詳細は header.doc.jp を参照してください。展開
218 と一覧表示のときにヘッダにこの情報があれば ID に優先してこの情報が利
219 用されます。作成は configure オプション --enable-user-name-header を
220 指定して build した場合に有効になります。
224 オリジナル LHa for UNIX 1.14i では、アーカイブにファイルを追加したと
225 きやアーカイブからファイルを削除したときに、元のアーカイブを .bak と
226 いう拡張子で保存します。この挙動は煩わしく感じたので autoconf 版では
227 バックアップファイルを作成しないようにしました。この autoconf 版パッ
228 チが信用できないような人は configure オプション --enable-backup-archive
229 を指定して build してください(ぜひそうするべきです:p)。オリジナルと
234 header.c は作り変えられました。上記に示した変更に加えてオリジナル
235 LHa for UNIX 1.14i から以下の不具合が修正されました。
237 #### level 2 header のバグ
239 total header size (アーカイブヘッダの先頭 2 byte) が 256 以上
240 であるアーカイブを正しく読むことができませんでした。また、total
241 header size がちょうど 256 になるような不正なアーカイブを作成し
242 ていました。LHA のヘッダ仕様ではヘッダ先頭が 0 であればアーカイ
243 ブの終端とみなすため total header size を 256 の倍数にできません。
244 (256 などは little-endian で 0x00 0x01 となるため、先頭が 0 にな
247 読み込み時にヘッダの CRC check を行うようにしました。
249 #### level 1 header のバグ
251 ファイル名に対して拡張ヘッダを使用することがないため、230 バイト
252 を越えるファイル名(ディレクトリを含まない)をアーカイブに書くとアー
253 カイブヘッダのサイズ制限を越えた不正なアーカイブが作成されていま
256 #### level 0 header のバグ
258 長いパス名(ディレクトリも含む)に対してアーカイブヘッダのサイズ制
259 限を越えた不正なアーカイブが作成されていました(実際には、オリジ
260 ナルは level 0 header にディレクトリの情報を一切書かないのでこの
261 制限はやはりファイル名長だけが対象になります)。autoconf 版では制
262 限を越えたパス名は warning メッセージを出力し、パス名の後ろを
263 切り詰めます。(level 0 header は使用するべきではありません)
265 空の(ディレクトリ名情報のない) -lhd- ヘッダが作成されていました。
271 PERMSSN UID GID PACKED SIZE RATIO METHOD CRC STAMP NAME
272 ---------- ----------- ------- ------- ------ ---------- ------------ -------------
273 drwxrwxr-x 1000/1000 0 0 ****** -lhd- 0000 Jul 29 00:18
274 ---------- ----------- ------- ------- ------ ---------- ------------ -------------
275 Total 1 file 0 0 ****** Jul 29 00:18
278 なお、level 0 header で -lhd- method は使えないという説がある
280 <http://kuwa.xps.jp/x68k/KGARC/ARC/LHAHED15.ZIP>
282 のですが、吉崎栄泰氏のオリジナル LHA (DOS/Windows版) (ver 2.55,
283 2.67) などは -lhd- method を level 0 header で作成します。
285 ※ この意見は認められ(<http://kuwa.xps.jp/diary/2002-10.html#27_3>)、
286 上記のドキュメントは、訂正されたようです。
288 <http://kuwa.xps.jp/x68k/KGARC/ARC/LHAHED21.ZIP>
290 #### g オプションを付けたときの level 0, 1, 2 header
292 g オプションは、アーカイブ作成のとき UNIX 固有の情報をアーカイブ
293 に作成するのを抑止すると man にはあるのですが、実際にはディレク
299 $ lha cg1 foo.lzh foo
301 PERMSSN UID GID SIZE RATIO STAMP NAME
302 ---------- ----------- ------- ------ ------------ --------------------
303 [generic] 0 ****** Jul 29 00:02 bar
304 ---------- ----------- ------- ------ ------------ --------------------
305 Total 1 file 0 ****** Jul 29 00:02
308 autoconf 版では上記は foo/bar になります。(オリジナルはわざとそ
309 うしていたのかもしれませんが、そうする理由はないと判断しました)
310 g オプションで -lhd- の作成が抑止されるのは同じです。
312 なお、g オプションとヘッダレベルの指定を同時に行うときは上記のよ
313 うに g オプションを先に指定する必要があります。lha c1g など g オ
314 プションを後に指定すると level 0 header が作成されます(このオリ
319 世の中には、level 3 header というものが存在するようですが、まだ仕様
320 としてfix されてないようなので*読み込みのみ*サポートしました。追加の
321 拡張ヘッダは未対応です。(特に対応すべきヘッダが見当たらなかった)
322 largefile 対応する場合は、この level 3 header をサポートした方が良さ
327 まったくのおまけ機能としてヘッダのダンプ機能を追加しました。これは完
334 とすると、アーカイブの内容一覧にまざってダンプが出力されます。
338 アーカイブを作成するときのデフォルトのヘッダレベルを 2 にしました。
339 (オリジナルの LHa for UNIX 1.14i ではレベル 1 がデフォルト)
343 拡張ヘッダ Windows timestamp (0x41) を解釈するようにしました。(level
344 1 header のみ)。level 2 以上では、基本ヘッダに time_t の情報があるの
346 level 1 header のアーカイブに対して、Windows timestamp 拡張ヘッダ
347 を出力する LHA アーカイバが存在するかどうかは未確認です。あまり、
348 役に立たない修正だった気がしますがせっかく作ったので残してます:-)
352 圧縮対象のファイルから除外されるパターンを指定する -x オプションを追
356 lha c -x '*.o' -x='*.a' -x'*.c' src.lzh src
359 といった指定ができるよう、オプション解析部は変更されました。
360 本バージョンの usage は以下のようになります。
363 usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
368 MS-DOS タイプなど permission の情報を持たないアーカイブを Cygwin で
369 解凍する場合は、0777 & ~umask で展開するようにしました。これは、.exe
370 や .dll に実行属性を付けるためです。
374 システムが対応していれば、2G over な large file を扱うことができます
375 (configure が適当なコンパイラオプションを指定してくれます)
377 ただし、HP-UX 11.0 で large files に対応するには以下のように
386 ./configure --with-tmp-file=no CC="cc -Ae +DA2.0W" \
387 ac_cv_have_mktime=yes \
388 ac_cv_func_mktime=yes
391 --with-tmp-file=no は、中間ファイルを出力先と同じディレクトリに
392 作成します。テンポラリディレクトリが 2G over をサポートしていない
395 (largefiles 対応とは関係ありませんが ac_cv_*=yes は、HP-UX ではなぜ
396 か mktime の判定に失敗するため強制的に mktime を使うようにしています)
398 もし large files 対応を「無効」にしたければ、
401 ./configure --disable-largefile
406 なお、正規の LHA では、level 0, 1, 2 ヘッダの仕様上 4G 未満のファイル
407 しか書庫に格納できません(ファイルサイズを格納する領域が 4 bytes しかない)。
409 しかし、UNLHA32.DLL などは、拡張ヘッダ(0x42)により、4G over なファイ
410 ルも扱えるようになっています。autoconf 版では、今のところ展開のときの
411 みこの拡張ヘッダを参照して、4G overファイルをサポートします。
413 (作成に対応していないのは、安易にUNLHA32.DLLに従うことが正しいのかよ
416 ### MacBinaryつきアーカイブのサポート
418 MacLHAで「MacBinary」チェックボックスをONにして作成したアーカイブに
419 格納されているファイルは、MacBinaryエンコードされています。
420 解凍時に -b オプションを指定すると、解凍後にMacBinaryデコードを行い、
421 データフォークのみを取り出します(リソースフォークは無視されます)。
422 また、普通のアーカイブに対して b オプションを指定して解凍した場合は
425 この機能を利用するにはapplefileライブラリが必要です。
426 applefileライブラリは下記より入手できます。
428 http://sourceforge.net/projects/applefile/
433 ### 壊れたアーカイブの展開 (--extract-broken-archive)
435 LHa for UNIX (autoconf版)は、バージョン 1.14i-ac20030713 (slide.c
436 revision 1.20) より壊れたアーカイブを作成してしまう致命的なバグがあ
437 りました。(このようなアーカイブが作成される現象に遭遇することはほと
438 んどないかも知れません。ただ、バグのある LHa for UNIX では正常に展開
439 できてしまうので、壊れたアーカイブであることに気が付いてないだけかも
442 この壊れたアーカイブは他の正常な LHA (あるいは現在の LHa for UNIX)
443 では展開時に CRC エラーが発生してしまいます。
448 lha x --extract-broken-archive broken.lzh
451 とオプション --extract-broken-archive を指定することで、このバグによ
452 り作成された壊れたアーカイブを強制的に展開することができます。CRC エ
453 ラーが発生するアーカイブを見付けたときには(そして、それが過去の LHa
454 for UNIX (autoconf版)で作成されたものである場合には)このオプションを
458 ---------------------------
460 私は、src/header.c にはもはや元の lha 1.14i にあったコードは含まれて
461 いないと考えています。src/header.c は私の著作物です。ただし、lha
462 1.14i にあったコードが参考になったことは事実です。敬意を表する意味で
463 も src/header.c にあった歴代の改変者の名前はそのまま残しています。
465 これの意図する所は、man/lha.man にある再配布条件を src/header.c に適
466 用しないことです。私は、より自由で使いやすいコードを LHa for UNIX の
467 構成物にしようと考えています。src/header.c に適用するライセンスはま
468 だ未定です(なので、現状は LHa for UNIX の再配布条件が適用されると考
472 <http://www.gnu.org/licenses/license-list.ja.html>
473 <http://www.opensource.org/licenses/>
475 現在のところ、src/vsnprintf.c, src/fnmatch.[ch], src/getopt_long.[ch]
476 を除くその他の構成物や LHa for UNIX 全体には man/lha.man に含まれる
477 条項が適用されます。(vsnprintf.c, fnmatch.c を利用するように make し
478 た LHa for UNIX には、各ソースに記述された条項も適用されることに注意