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

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

UTF-8でman-pages-jaをインストールし、既存のEUC-JPなmanページもUTF-8に変換するebuild

下のebuildファイルをローカルOverlayに入れて*1USE=unicodeemergeするだけで、インストールされるmanページのエンコーディングUTF-8に変換し、更に、既存の日本語manページに関しても、EUC-JPのものを検出し、UTF-8への変換を行う。
ファイル名: man-pages-ja-20070515.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/app-i18n/man-pages-ja/man-pages-ja-20070515.ebuild,v 1.2 2007/07/15 07:12:30 mr_bones_ Exp $

IUSE="unicode"

GENTOO_MAN_P="portage-${PN}-20060415"

DESCRIPTION="A collection of manual pages translated into Japanese"
HOMEPAGE="http://www.linux.or.jp/JM/ http://www.gentoo.gr.jp/jpmain/translation.xml"
SRC_URI="http://www.linux.or.jp/JM/${P}.tar.gz
	http://dev.gentoo.org/~hattya/distfiles/${GENTOO_MAN_P}.tar.gz"

LICENSE="GPL-2"
KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86"
SLOT="0"

RDEPEND="virtual/man"

src_compile() {

	if use unicode; then
		einfo "Converting EUC-JP manpages to UTF-8..."
		local x
		for x in manual/*/*/*.[1-9] "${WORKDIR}"/${GENTOO_MAN_P}/*/*.[1-9]; do
			mv ${x} ${x}.old
			iconv -f eucjp -t utf8 ${x}.old > ${x}
			rm ${x}.old -f
		done
	fi
	sed -i -e "/^\(man\|shadow\)/s:Y:N:" script/pkgs.list || die

	# remove man pages that are provided by other packages.
	# - sys-apps/shadow +nls
	rm -f manual/*/man1/{chfn,chsh,newgrp,su,passwd,groups}.1
	rm -f manual/*/man8/{vigr,vipw}.8

}

src_install() {

	local x y z pkg

	for x in $(tac script/pkgs.list | grep -v '^[#].*'); do
		if [[ -z "${pkg}" ]]; then
			pkg=${x}
			continue
		fi

		if [[ "${x}" == "N" ]]; then
			pkg=
			continue
		fi

		einfo "install ${pkg}"

		for y in $(ls -d manual/${pkg}/man* 2>/dev/null); do
			doman -i18n=ja ${y}/*
		done

		pkg=
	done

	dodoc ChangeLog README

	cd "${WORKDIR}"/${GENTOO_MAN_P}

	for x in *; do
		if [ -d "${x}" ]; then
			einfo "install ${x}"

			for z in $(for y in ${x}/*.[1-9]; do echo ${y##*.}; done | sort | uniq); do
				doman -i18n=ja ${x}/*.${z}
			done
		fi
	done

	newdoc ChangeLog ChangeLog.GentooJP

}

pkg_postinst() {

	if use unicode; then
		einfo "Scanning existing Japanese manpages..."
		local x lst
		lst=$(for x in /usr/share/man/ja/*/*.bz2; do bzcat ${x} | iconv -f utf8 -t utf8 >/dev/null 2>&1 || echo ${x}; done)
		if [ -n "${lst}" ]; then
			for x in ${lst}; do
				einfo "Converting $(basename ${x}) to UTF-8..."
				mv ${x} ${x}.old
				bzcat ${x}.old | iconv -f eucjp -t utf8 | bzip2 > ${x}
				rm ${x}.old
			done
		else
			einfo "No EUC-JP manpages found."
		fi
	else
		echo
		elog "You need to set appropriate LANG variables to use"
		elog "Japanese manpages."
		elog "e.g."
		elog "\tLANG=\"ja_JP.eucJP\""
		elog "\texport LANG"
		echo
	fi

}

以下は、インストール作業の例。

$ sudo mkdir /usr/local/overlays/local/app-i18n/man-pages-ja/files -p
$ sudo cp man-pages-ja-20070515.ebuild /usr/local/overlays/local/app-i18n/man-pages-ja/
$ sudo ebuild /usr/local/overlays/local/app-i18n/man-pages-ja/man-pages-ja-20070515.ebuild digest
$ sudo emerge -av man-pages-ja

現在のPortageでは、別のパッケージ(dpkgw3mなど)に付属するmanページの圧縮は全てbzip2形式に統一されているようなので、bzip2圧縮されたmanページファイル(.1.bz2など)のみ、検出と変換を行うようにしている。
インストール後、EUC-JPなmanページの検出とUTF-8への変換のみを行うには

$ sudo ebuild /usr/local/overlays/local/app-i18n/man-pages-ja/man-pages-ja-20070515.ebuild postinst

を実行すればよい。以前の記事の作業と比べると、非常に楽になったと思う。

*1:/etc/make.confの${PORTDIR_OVERLAY}と/etc/portage/package.keywordsを別途設定する