試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Mandriva Linux 2009.0に含まれるunzipコマンドのCP932対応について

Mandriva Linuxに「unzip」パッケージとして用意されているunzipコマンドは、Zip書庫内にあるCP932エンコーディングの複数バイトファイル名に対応しておらず、展開時に化けてしまう。
そこで、Ubuntu Japanese Teamの同パッケージに含まれるパッチ01_japanese_charset.dpatch*1を使用してCP932に対応できるよう.specファイルを修正した。

--- unzip-5.52-6mdv2009.0.orig/SPECS/unzip.spec
+++ unzip-5.52-6mdv2009.0/SPECS/unzip.spec
@@ -3,11 +3,17 @@
 %define release %mkrel 6
 %define src_ver	%(echo %version|sed "s/\\.//"g)
 
+%define build_jp	0
+%{?_with_jp: %global build_jp 1}
+
 Summary:	Unpacks ZIP files such as those made by pkzip under DOS
 Name:		%{name}
 Version:	%{version}
 Release:	%{release}
 Source0:	http://ftp.info-zip.org/pub/infozip/src/%{name}%{src_ver}.tar.bz2
+%if %{build_jp}
+Patch0:		01_japanese_charset.dpatch
+%endif
 Patch1:		unzip542-size-64bit.patch
 Patch2:		unzip-5.52-CAN-2005-2475.patch
 Patch3:		unzip-5.52-CVE-2005-4667.patch
@@ -29,6 +35,9 @@
 %prep
 
 %setup -q
+%if %{build_jp}
+%patch0 -p1 -b .japanese
+%endif
 %patch1 -p0
 %patch2 -p1 -b .can-2005-2475
 %patch3 -p1 -b .cve-2005-4667
@@ -37,10 +46,18 @@
 %build
 %ifarch %{ix86}
 #gw FIXME: do we still need to disable LZW?
+%if %{build_jp}
+%make -ef unix/Makefile linux CF="-DLZW_CLEAN -D_MBCS %{optflags} -D_FILE_OFFSET_BITS=64 -Wall -I. -DASM_CRC" CC=gcc LD=gcc AS=gcc AF="-Di386" CRC32=crc_gcc
+%else
 %make -ef unix/Makefile linux CF="-DLZW_CLEAN %{optflags} -D_FILE_OFFSET_BITS=64 -Wall -I. -DASM_CRC" CC=gcc LD=gcc AS=gcc AF="-Di386" CRC32=crc_gcc
+%endif
+%else
+%if %{build_jp}
+%make -ef unix/Makefile linux_noasm CF="-DLZW_CLEAN -D_MBCS %{optflags} -D_FILE_OFFSET_BITS=64 -Wall -I."
 %else
 %make -ef unix/Makefile linux_noasm CF="-DLZW_CLEAN %{optflags} -D_FILE_OFFSET_BITS=64 -Wall -I."
 %endif
+%endif
 
 %install
 [ "%{buildroot}" != "/" ] && rm -rf %{buildroot}

rpmbuildのビルド時に-D '_with_jp 1'オプションを付けたときに限りパッチが使用される。
RPMの.specファイルでは、上の修正のように

%define [マクロ名] [既定値]
%{?[-Dオプションで指定する名前]: %global [マクロ名] [オプション指定時の値]}
...
%if %{[マクロ名]}
...
%else
...
%endif

という記述をすることで、GentooのUSEフラグに近い感覚で、ビルド時に機能の有効/無効などが指定できるようになっている。
(2009/1/6)ビルド処理の中に誤りがあり、正常に動作していないことが分かったため、上の差分とSkyDriveのパッケージを修正した。
この修正をしたソースRPMと、CP932対応を有効にしてビルドしたx86_64向けパッケージを別館から入手できるようにした。
(2008/12/11)i586版を追加した。
なお、CP932の複数バイトファイル名を含むZip書庫をGUIで作成/展開したい場合はWineでWin32版の7-Zip File Managerなどの圧縮/展開ツールを使用するのが便利。
(2014/10/4)配布ページは削除済み。

関連: Gentoo LinuxでのunzipとCP932

(2008/11/18)以前Gentoo Linuxを使用していたときには、同パッチを使用してビルドするため
ebuild.gentoo.gr.jp/view.php?cat=app-arch&app=unzip
ebuildとパッチを使用していた。
ebuildの配置・使用方法などは「Gentoo Linuxにおけるパッケージ管理について(Overlay)」(ローカルOverlayについて)を参照。

使用したバージョン:

  • unzip 5.52-6mdv2009.0

*1:http://archive.ubuntulinux.jp/ubuntu-ja/intrepid-ja/unzip_5.52-11ubuntu1.1ja1.diff.gzから抽出