OSDN Git Service

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