OSDN Git Service

Merge pull request #6 from yoheie/remove-config-h-in
[lha/lha.git] / README.jp.md
1 LHa for UNIX with Autoconf
2 =======================
3
4 このファイルは、Autoconf 版 LHa for UNIX について説明します。
5
6 1. コンパイルの手順
7 --------------------------------
8
9 コンパイルの手順は以下のようになります。
10
11 ```
12   gzip -dc lha-1.14i-acXXXXXXXX.tar.gz | tar xvf -
13   cd lha-114i-acXXXXXXXX
14
15   sh ./configure
16   make
17   make check
18   make install
19 ```
20
21 MinGW 対応はα版です。ほとんどテストされていません(make check が成功
22 する程度)。Cygwin 環境で MinGW 版を試すには
23
24 ```
25   sh ./configure CC='gcc -mno-cygwin'
26               --build=i686-pc-mingw32
27               --with-tmp-file=no
28 ```
29
30 などとしてください。
31
32 ※ Cygwin や MinGW 等、Windows 環境では深いディレクトリでコンパイル
33    するとmake check が失敗する場合があります。これは長いパスの格納
34    チェックをするときに、Windows のフルパス長の制限にひっかかるため
35    です。このような場合は、以下のように configure を浅めのディレクト
36    リで実行してください。
37
38 ```
39     例:
40       cd /tmp/build
41       sh ~/src/lha/configure ....
42       make
43       make check
44       make install
45 ```
46
47 autoconf/automake がインストールされている場合で、lha ソースや 
48 configure.ac, Makefile.am をメンテナンスする場合は以下の手順になりま
49 す。autoconf/automake のバージョンはそれぞれ autoconf 2.5x, automake
50 1.6.x 以降での利用を前提としています。
51
52 ```
53   gzip -dc lha-1.14i-acXXXXXXXX.tar.gz | tar xvf -
54   cd lha-114i-acXXXXXXXX
55
56   aclocal
57   autoheader
58   automake -a
59   autoconf
60
61   # aclocal から autoconf 実行までの手順は、最近では、autoreconf -is
62   # でいけるようです。
63
64   sh ./configure
65   make
66   make check
67   make install
68 ```
69
70 2. オリジナルからの変更点
71 ----------------------------------------
72
73 Autoconf 版 LHa for UNIX は、
74 LHa for UNIX ver1.14i <http://www2m.biglobe.ne.jp/~dolphin/lha/lha.htm>
75 を元に改変されました。
76
77 主な変更点を下記に挙げます。
78
79 ### -lh6-, -lh7- メソッドのアーカイブ作成
80
81 オリジナルの LHa for UNIX 1.14i では、SUPPORT_LH7 の定義をせずにコン
82 パイルした場合、-lh6- および -lh7- メソッドのアーカイブを作成できま
83 せんでした。このことは別に構わないのですが SUPPORT_LH7 を定義すると
84 デフォルトで -lh7- メソッドのアーカイブ作成を強制されてしまいます。
85 そこで、もう少し柔軟に lha 利用者がこれらを選択できるよう 
86 SUPPORT_LH7 は常に定義するようにし、デフォルトで作成されるアーカイブ
87 のメソッド指定を configure オプションの --with-default-method=[567] 
88 で指定できるようにしました。
89
90 このオプションの省略値は -lh5- です。つまりデフォルトでは -lh5- アー
91 カイブを作成します。(そして、上で述べた通り、lhaの o6 または o7 オプ
92 ションによりいつでも-lh6-、-lh7- アーカイブを作成でき、configure オ
93 プションによりデフォルトの挙動を変更することができます)
94
95 ### アーカイブ中の漢字ファイル名
96
97 オリジナルの LHa for UNIX 1.14i はアーカイブに格納するファイル名の漢
98 字コードに関して無頓着です。コンパイル時に MULTIBYTE_CHAR を定義した
99 ときでもアーカイブ中の Shift JIS ファイル名を EUC にすることもなく、
100 EUC コードのまま(正確にはシステムの漢字コードのまま)アーカイブに格納
101 したりします。
102
103 autoconf 版では、configure オプション --enable-multibyte-filename に
104 より漢字ファイル名が使用でき、アーカイブに格納されるファイル名の漢字
105 コードを SJIS 固定として扱います。
106
107 --enable-multibyte-filename の引数(システムのファイル名の漢字コード
108 指定)は、以下の通りです。
109
110 ```
111     --enable-multibyte-filename=sjis
112           システムの漢字コードを SJIS として扱います。
113     --enable-multibyte-filename=euc
114           システムの漢字コードを EUC として扱います。
115     --enable-multibyte-filename=utf8
116           システムの漢字コードを UTF-8 として扱います。
117           今のところ Mac OS X でだけこのオプションをサポートします。
118     --enable-multibyte-filename=auto (または yes または引数なし)
119           システムの漢字コードを自動で判別します。自動といっても現状は、
120           Cygwin, MinGW, HP-UX の場合に SJIS、Mac OS X の場合 UTF-8、
121           それ以外を EUC とみなすだけです。
122     --enable-multibyte-filename=no
123     --disable-multibyte-filename
124           ファイル名のマルチバイトサポートを無効にします。
125 ```
126
127 デフォルトは、auto です。
128
129 lha のコマンドラインオプションにより、コンパイル時のデフォルト指定を
130 変更することができます。このコマンドラインオプションは、GNU style の 
131 long option (ダッシュ2つが先行するスタイル)で指定します。
132
133 ```
134       --system-kanji-code=xxx
135               システムのファイル名の漢字コードを指定します。
136
137       --archive-kanji-code=xxx
138               アーカイブ内へ格納するときのファイル名のコードを指定し
139               ます。これは通常 SJIS 固定なので変更するべきではありま
140               せん。
141 ```
142
143 xxx は sjis, euc, utf8, cap のいずれかです。cap は、samba などで使われる
144 コードで、漢字コードを ":" と 16 進文字で表現するコードです。
145
146 例えば、
147
148 ```
149       $ touch 漢字
150       $ lha c foo.lzh 漢字
151       $ lha l foo.lzh
152
153       PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
154       ---------- ----------- ------- ------ ------------ --------------------
155       -rw-r--r--  1000/1000        0 ****** Mar 23 21:23 漢字
156       ---------- ----------- ------- ------ ------------ --------------------
157        Total         1 file        0 ****** Mar 23 21:23
158
159       $ lha l --system-kanji-code=cap foo.lzh
160
161       PERMISSION  UID  GID      SIZE  RATIO     STAMP           NAME
162       ---------- ----------- ------- ------ ------------ --------------------
163       -rw-r--r--  1000/1000        0 ****** Mar 23 21:23 :8a:bf:8e:9a
164       ---------- ----------- ------- ------ ------------ --------------------
165 ```
166
167 などとなります。
168
169 Mac OS X 用の utf8 <-> sjis 変換は、2002/6 に坂井浩人さんに作成して
170 いただきました。ありがとうございます。
171
172 また、Mac OS X 以外でも、iconv ライブラリを使用すれば、UTF-8 を使用す
173 ることができます。ただし、現在のところ iconv ライブラリの存在を自動的
174 に検出しないので、libc に iconv() 関数がなく、libiconv が存在する
175 (iconvライブラリをリンクする必要がある)環境では、コンパイル時に
176
177 ```
178    sh ./configure LIBS=-liconv
179 ```
180
181 などとする必要があります。
182
183 ### 標準入力からの展開ファイルの指定
184
185 オリジナルの LHa for UNIX 1.14i は、
186
187 ```
188   echo foo.txt | lha x foo.lzh
189   find bar -name '*.[ch]' | lha c bar.lzh
190 ```
191
192 とすると、foo.lzh から foo.txt だけを展開したり、bar ディレクトリ配
193 下のファイルを bar.lzh に格納したりできます。つまり、標準入力から、
194 圧縮/展開ファイルを指定できる機能なのですが、いまいち使い道がないわ
195 りに邪魔な機能です(圧縮の例は、cpio 同様まあ使えるけど、このためのオ
196 プションを新設するのが良いと考えています)
197
198 tty からの利用しか想定してないと思われますが、おそらく daemon から 
199 lha を実行する場合などで意図しない動作をするでしょう。そういうわけで
200 勝手ながらこの機能は削除しました。以下のような事ができない Windows 
201 環境では意味のある機能だったかもしれませんが
202
203 ```
204   lha x bar.lzh `echo foo.txt`
205 ```
206
207 残念ながら MinGW で isatty() がうまく動作しませんでしたから Windows 
208 では使えないのでした。
209
210 オリジナルの仕様を復活させたい場合は、lharc.c の 568行目付近の #if 0 
211 を #if 1 にしてください。
212
213 ### 拡張ヘッダ(ユーザ名/グループ名)のサポート
214
215 ユーザ名、グループ名の拡張ヘッダ(0x52, 0x53)を作成できるようにしまし
216 た(デフォルトはoff)。詳細は header.doc.jp を参照してください。展開
217 と一覧表示のときにヘッダにこの情報があれば ID に優先してこの情報が利
218 用されます。作成は configure オプション --enable-user-name-header を
219 指定して build した場合に有効になります。
220
221 ### バックアップファイル作成の抑止
222
223 オリジナル LHa for UNIX 1.14i では、アーカイブにファイルを追加したと
224 きやアーカイブからファイルを削除したときに、元のアーカイブを .bak と
225 いう拡張子で保存します。この挙動は煩わしく感じたので autoconf 版では
226 バックアップファイルを作成しないようにしました。この autoconf 版パッ
227 チが信用できないような人は configure オプション --enable-backup-archive
228 を指定して build してください(ぜひそうするべきです:p)。オリジナルと
229 同じ挙動になります。
230
231 ### header.c の書き換え
232
233 header.c は作り変えられました。上記に示した変更に加えてオリジナル 
234 LHa for UNIX 1.14i から以下の不具合が修正されました。
235
236 #### level 2 header のバグ
237
238 total header size (アーカイブヘッダの先頭 2 byte) が 256 以上
239 であるアーカイブを正しく読むことができませんでした。また、total
240 header size がちょうど 256 になるような不正なアーカイブを作成し
241 ていました。LHA のヘッダ仕様ではヘッダ先頭が 0 であればアーカイ
242 ブの終端とみなすため total header size を 256 の倍数にできません。
243 (256 などは little-endian で 0x00 0x01 となるため、先頭が 0 にな
244 ります。)
245
246 読み込み時にヘッダの CRC check を行うようにしました。
247
248 #### level 1 header のバグ
249
250 ファイル名に対して拡張ヘッダを使用することがないため、230 バイト
251 を越えるファイル名(ディレクトリを含まない)をアーカイブに書くとアー
252 カイブヘッダのサイズ制限を越えた不正なアーカイブが作成されていま
253 した。
254
255 #### level 0 header のバグ
256
257 長いパス名(ディレクトリも含む)に対してアーカイブヘッダのサイズ制
258 限を越えた不正なアーカイブが作成されていました(実際には、オリジ
259 ナルは level 0 header にディレクトリの情報を一切書かないのでこの
260 制限はやはりファイル名長だけが対象になります)。autoconf 版では制
261 限を越えたパス名は warning メッセージを出力し、パス名の後ろを
262 切り詰めます。(level 0 header は使用するべきではありません)
263
264 空の(ディレクトリ名情報のない) -lhd- ヘッダが作成されていました。
265
266 ```
267   $ mkdir foo
268   $ lha c0 foo.lzh foo
269   $ lha v foo.lzh
270    PERMSSN    UID  GID    PACKED    SIZE  RATIO METHOD CRC     STAMP          NAME
271   ---------- ----------- ------- ------- ------ ---------- ------------ -------------
272   drwxrwxr-x  1000/1000        0       0 ****** -lhd- 0000 Jul 29 00:18 
273   ---------- ----------- ------- ------- ------ ---------- ------------ -------------
274    Total         1 file        0       0 ******            Jul 29 00:18
275 ```
276
277 なお、level 0 header で -lhd- method は使えないという説がある
278
279   <http://kuwa.xps.jp/x68k/KGARC/ARC/LHAHED15.ZIP>
280
281 のですが、吉崎栄泰氏のオリジナル LHA (DOS/Windows版) (ver 2.55,
282 2.67) などは -lhd- method を level 0 header で作成します。
283
284 ※ この意見は認められ(<http://kuwa.xps.jp/diary/2002-10.html#27_3>)、
285    上記のドキュメントは、訂正されたようです。
286
287   <http://kuwa.xps.jp/x68k/KGARC/ARC/LHAHED21.ZIP>
288
289 #### g オプションを付けたときの level 0, 1, 2 header
290
291 g オプションは、アーカイブ作成のとき UNIX 固有の情報をアーカイブ
292 に作成するのを抑止すると man にはあるのですが、実際にはディレク
293 トリ情報まで抑止されていました。
294
295 ```
296   $ mkdir foo
297   $ touch foo/bar
298   $ lha cg1 foo.lzh foo
299   $ lha foo.lzh 
300    PERMSSN    UID  GID      SIZE  RATIO     STAMP           NAME
301   ---------- ----------- ------- ------ ------------ --------------------
302   [generic]                    0 ****** Jul 29 00:02 bar
303   ---------- ----------- ------- ------ ------------ --------------------
304    Total         1 file        0 ****** Jul 29 00:02
305 ```
306
307 autoconf 版では上記は foo/bar になります。(オリジナルはわざとそ
308 うしていたのかもしれませんが、そうする理由はないと判断しました)
309 g オプションで -lhd- の作成が抑止されるのは同じです。
310
311 なお、g オプションとヘッダレベルの指定を同時に行うときは上記のよ
312 うに g オプションを先に指定する必要があります。lha c1g など g オ
313 プションを後に指定すると level 0 header が作成されます(このオリ
314 ジナル仕様はちょっとわかりにくいです)。
315
316 ### level 3 header
317
318 世の中には、level 3 header というものが存在するようですが、まだ仕様
319 としてfix されてないようなので*読み込みのみ*サポートしました。追加の
320 拡張ヘッダは未対応です。(特に対応すべきヘッダが見当たらなかった)
321 largefile 対応する場合は、この level 3 header をサポートした方が良さ
322 そうです。
323
324 ### ヘッダのダンプ
325
326 まったくのおまけ機能としてヘッダのダンプ機能を追加しました。これは完
327 全にデバッグ用です。
328
329 ```
330   lha vvv foo.lzh
331 ```
332
333 とすると、アーカイブの内容一覧にまざってダンプが出力されます。
334
335 ### デフォルトヘッダレベル
336
337 アーカイブを作成するときのデフォルトのヘッダレベルを 2 にしました。
338 (オリジナルの LHa for UNIX 1.14i ではレベル 1 がデフォルト)
339
340 ### 拡張ヘッダ
341
342 拡張ヘッダ Windows timestamp (0x41) を解釈するようにしました。(level
343 1 header のみ)。level 2 以上では、基本ヘッダに time_t の情報があるの
344 で、拡張ヘッダの方は無視します。
345 level 1 header のアーカイブに対して、Windows timestamp 拡張ヘッダ
346 を出力する LHA アーカイバが存在するかどうかは未確認です。あまり、
347 役に立たない修正だった気がしますがせっかく作ったので残してます:-)
348
349 ### -x オプション
350
351 圧縮対象のファイルから除外されるパターンを指定する -x オプションを追
352 加しました。これに伴い、
353
354 ```
355   lha c -x '*.o' -x='*.a' -x'*.c' src.lzh src
356 ```
357
358 といった指定ができるよう、オプション解析部は変更されました。
359 本バージョンの usage は以下のようになります。
360
361 ```
362   usage: lha [-]<commands>[<options>] [-<options> ...] archive_file [file...]
363 ```
364
365 ### Cygwin での解凍
366
367 MS-DOS タイプなど permission の情報を持たないアーカイブを Cygwin で
368 解凍する場合は、0777 & ~umask で展開するようにしました。これは、.exe 
369 や .dll に実行属性を付けるためです。
370
371 ### large files 対応
372
373 システムが対応していれば、2G over な large file を扱うことができます
374 (configure が適当なコンパイラオプションを指定してくれます)
375
376 ただし、HP-UX 11.0 で large files に対応するには以下のように
377
378 ```
379       CC="cc -Ae +DA2.0W"
380 ```
381
382 と指示してあげる必要があるようです。
383
384 ```
385       ./configure --with-tmp-file=no CC="cc -Ae +DA2.0W" \
386                               ac_cv_have_mktime=yes \
387                               ac_cv_func_mktime=yes
388 ```
389
390 --with-tmp-file=no は、中間ファイルを出力先と同じディレクトリに
391 作成します。テンポラリディレクトリが 2G over をサポートしていない
392 場合を考慮しています。
393
394 (largefiles 対応とは関係ありませんが ac_cv_*=yes は、HP-UX ではなぜ
395 か mktime の判定に失敗するため強制的に mktime を使うようにしています)
396
397 もし large files 対応を「無効」にしたければ、
398
399 ```
400       ./configure --disable-largefile
401 ```
402
403 のようにします。
404
405 なお、正規の LHA では、level 0, 1, 2 ヘッダの仕様上 4G 未満のファイル
406 しか書庫に格納できません(ファイルサイズを格納する領域が 4 bytes しかない)。
407
408 しかし、UNLHA32.DLL などは、拡張ヘッダ(0x42)により、4G over なファイ
409 ルも扱えるようになっています。autoconf 版では、今のところ展開のときの
410 みこの拡張ヘッダを参照して、4G overファイルをサポートします。
411
412 (作成に対応していないのは、安易にUNLHA32.DLLに従うことが正しいのかよ
413 くわからなかったからです。)
414
415 ### MacBinaryつきアーカイブのサポート
416
417 MacLHAで「MacBinary」チェックボックスをONにして作成したアーカイブに
418 格納されているファイルは、MacBinaryエンコードされています。
419 解凍時に -b オプションを指定すると、解凍後にMacBinaryデコードを行い、
420 データフォークのみを取り出します(リソースフォークは無視されます)。
421 また、普通のアーカイブに対して b オプションを指定して解凍した場合は
422 通常の解凍処理が行われます。
423
424 この機能を利用するにはapplefileライブラリが必要です。
425 applefileライブラリは下記より入手できます。
426
427       http://sourceforge.net/projects/applefile/
428
429 3. バグ
430 -----------
431
432 ### 壊れたアーカイブの展開 (--extract-broken-archive)
433
434 LHa for UNIX (autoconf版)は、バージョン 1.14i-ac20030713 (slide.c
435 revision 1.20) より壊れたアーカイブを作成してしまう致命的なバグがあ
436 りました。(このようなアーカイブが作成される現象に遭遇することはほと
437 んどないかも知れません。ただ、バグのある LHa for UNIX では正常に展開
438 できてしまうので、壊れたアーカイブであることに気が付いてないだけかも
439 しれません)
440
441 この壊れたアーカイブは他の正常な LHA (あるいは現在の LHa for UNIX) 
442 では展開時に CRC エラーが発生してしまいます。
443
444 現在のバージョンでは、
445
446 ```
447       lha x --extract-broken-archive broken.lzh
448 ```
449
450 とオプション --extract-broken-archive を指定することで、このバグによ
451 り作成された壊れたアーカイブを強制的に展開することができます。CRC エ
452 ラーが発生するアーカイブを見付けたときには(そして、それが過去の LHa
453 for UNIX (autoconf版)で作成されたものである場合には)このオプションを
454 試してみてください。
455
456 4. 再配布について
457 ---------------------------
458
459 私は、src/header.c にはもはや元の lha 1.14i にあったコードは含まれて
460 いないと考えています。src/header.c は私の著作物です。ただし、lha
461 1.14i にあったコードが参考になったことは事実です。敬意を表する意味で
462 も src/header.c にあった歴代の改変者の名前はそのまま残しています。
463
464 これの意図する所は、man/lha.man にある再配布条件を src/header.c に適
465 用しないことです。私は、より自由で使いやすいコードを LHa for UNIX の
466 構成物にしようと考えています。src/header.c に適用するライセンスはま
467 だ未定です(なので、現状は LHa for UNIX の再配布条件が適用されると考
468 えてください)。
469
470    ライセンス候補(メモ):
471          <http://www.gnu.org/licenses/license-list.ja.html>
472          <http://www.opensource.org/licenses/>
473
474 現在のところ、src/vsnprintf.c, src/fnmatch.[ch], src/getopt_long.[ch]
475 を除くその他の構成物や LHa for UNIX 全体には man/lha.man に含まれる
476 条項が適用されます。(vsnprintf.c, fnmatch.c を利用するように make し
477 た LHa for UNIX には、各ソースに記述された条項も適用されることに注意
478 してください)