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

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

新しいemul-linux-x86-*パッケージと、これを利用した32bitライブラリの自前管理について

Java以外長く更新のなかったemul-linux-x86-*パッケージだったが、ついに新しいバージョンが出た。既存のインストールシステムをもとにした新しいインストールシステムによるものとなっている。

  1. SRC_URIについて
  2. 中身の各パッケージのバージョンを知るには
  3. 自前で管理する場合に行うこと
  4. USEフラグによるパッケージ選択(除外)
  5. インストールするためのebuild例

SRC_URIについて

以前は、作成された(32bitの)各tbz2パッケージごとに「mirror://gentoo/[パッケージ名]-[バージョン].tbz2」というURLからの取得を行うもので、以前書いた、32bitライブラリを自前で管理する記事においても、一つ一つ、そのバージョン番号部分を手元でビルドしたものに合わせるという作業を必要としていた。
新しいインストールシステムでは、「emul-linux-x86-baselibs」などのパッケージを構成する複数のtbz2ファイルを「emul-linux-x86-[種類]-[日付].tar.bz2」という1つのファイルにまとめてある。これは、自前で管理する場合においても都合がよい。

中身の各パッケージのバージョンを知るには

複数の「SRC_URI」から1つの.tar.bz2ファイルになったことにより、その中に含まれている個々のパッケージのバージョンを知るのは難しくなった。しかし、.tar.bz2ファイルの中には、パッケージのインストール情報を格納する/var/db/pkg/以下のディレクトリツリーが一緒に入っていることにより、これを知ることはできる。

自前で管理する場合に行うこと

「バージョンが古い」「hashstyleが使えない」ということはなくなったので、自前で管理する意味は以前ほどはなくなったが、パッケージで提供されないものを追加したり、中のパッケージの最新版を常に使いたいなどといった場合などには有用。その際に行う流れは下のようになる。

  1. CHOST/ABI指定もしくはemul用chrootにより、tbz2パッケージを作成
  2. 一時ディレクトリの中に、パッケージを構成するtbz2ファイルを展開していく
  3. その一時ディレクトリの全体を「emul-linux-x86-[種類]-[日付].tar.bz2」というファイルにまとめ、DISTDIR(デフォルトは/usr/portage/distfiles/)へ入れる
  4. ebuildファイルのファイル名の日付部分を修正し、ローカルOverlayに配置*1
  5. ダイジェストを取る
  6. インストール

ebuild中にSRC_URIの記述をする代わりに、日付入りの.tar.bz2ファイルを使用する形をとる」ということにより、ebuildファイル自体に手を加える必要性がほぼ無くなった*2。これは非常にありがたい。
その一方、パッケージを構成する各tbz2ファイルのパッケージのバージョンについてはきちんと把握している必要があるが、ビルドして作成したtbz2ファイルを種類(「baselibs」や「xlibs」など)ごとにディレクトリに分けて保管してさえいれば、バージョンが分からなくて困るということにはなりにくいのではないか、という気がする。

USEフラグによるパッケージ選択(除外)

ebuild内の記述では、以前の形では、SRC_URIの部分において

	qt3? ( mirror://gentoo/gtk-engines-qt-0.8.tbz2 )

のような形でUSEフラグによる分岐を行うことにより、emerge時にそのtbz2ファイルを一時ディレクトリに展開するかどうかを決めることになっていた。
新しい形では、1つの.tar.bz2ファイルを展開するだけなので、この手法は使えない。ALLOWED変数の値をいじって、残すファイルを選択することはできるが、これは/usr/bin/の実行ファイルなどに対しては意味があるが、特定のライブラリ(.soファイル)を残さないといったことはできない*3ため、結局のところ、「USEフラグがオフのときにそのパッケージに該当する.soファイル(場合によっては、それを含むディレクトリ全体)を削除」という処理を追加するしかない。
それ以前に、自前で管理するのであればUSEフラグを設けて分岐処理を書く必要があるのかどうかは怪しいが...

インストールするためのebuild

ファイル名やRDEPENDのバージョン部分に関しては変わっていく。ある程度テストは行ったが、万が一のため、「FEATURES="collision-protect"」を付けておくことを推奨。
(2007/11/20)バージョン番号(日付)部分は「99999999」にしておくと、公式のパッケージで更新されることはなくなる。

ファイル名: emul-linux-x86-baselibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="|| ( Artistic GPL-2 ) || ( BSD GPL-2 ) BZIP2 CRACKLIB DB
		GPL-2 || ( GPL-2 AFL-2.1 ) LGPL-2 LGPL-2.1 MIT OPENLDAP openssl
		PAM ZLIB as-is"
KEYWORDS="-* ~amd64"
IUSE="nodevelop"

DEPEND=""
RDEPEND="!<app-emulation/emul-linux-x86-medialibs-10.2" # bug 168507

src_unpack() {
	local x allowed="^${S}/lib32/security/pam_filter/upperLOWER|^${S}/etc/env.d"
	use nodevelop \
		|| allowed="${allowed}|^${S}/usr/lib32/glib|^${S}/usr/lib32/dbus|^${S}/usr/bin/libtool$|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$"
	ALLOWED="(${allowed})"
	emul-linux-x86_src_unpack
	rm -rf "${S}/etc/env.d/binutils/" \
			"${S}/usr/lib32/binutils/" \
			"${S}/usr/lib32/engines/" \
			"${S}/usr/lib32/openldap/" \
			"${S}/usr/lib32/python2.4/"

	ln -s ../share/terminfo "${S}"/usr/lib32/terminfo

	if ! use nodevelop; then
		mv -f "${S}/usr/bin/libtool"{,32}
		for x in hwm pwd pwi; do
			ln -s ../lib64/cracklib_dict.${x} "${S}"/usr/lib32/cracklib_dict.${x}
		done
	fi
}

ファイル名: emul-linux-x86-xlibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="fontconfig FTL GPL-2 LGPL-2 glut libdrm libICE libSM libX11 libXau
		libXaw libXcomposite libXcursor libXdamage libXdmcp libXext libXfixes libXft
		libXi libXinerama libXmu libXp libXpm libXrandr libXrender libXScrnSaver libXt
		libXtst libXv libXvMC libXxf86dga libXxf86vm libxcb xcb-util"
KEYWORDS="-* ~amd64"
IUSE="opengl nodevelop"

DEPEND="opengl? ( app-admin/eselect-opengl )"
RDEPEND=">=app-emulation/emul-linux-x86-baselibs-20071114
	x11-libs/libX11"

src_unpack() {
	use nodevelop \
		|| ALLOWED="(^${S}/etc/env.d|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)"
	emul-linux-x86_src_unpack
}

pkg_postinst() {
	#update GL symlinks
	use opengl && eselect opengl set --use-old
}

ファイル名: emul-linux-x86-gtklibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="GPL-2 LGPL-2 LGPL-2.1 FTL || ( LGPL-2.1 MPL-1.1 ) BSD"
KEYWORDS="-* ~amd64"

IUSE="qt3 nodevelop"

DEPEND=""
RDEPEND=">=app-emulation/emul-linux-x86-baselibs-20071114
		 >=app-emulation/emul-linux-x86-xlibs-20071114"

src_unpack() {
	local query_tools="^${S}/usr/bin/gtk-query-immodules-2.0|^${S}/usr/bin/gdk-pixbuf-query-loaders|^${S}/usr/bin/pango-querymodules"
	local allowed="^${S}/etc/env.d|^${S}/etc/gtk-2.0/i686-pc-linux-gnu|^${S}/etc/pango/i686-pc-linux-gnu|${query_tools}"
	use nodevelop \
		|| allowed="${allowed}|^${S}/usr/lib32/gtk-2.0/include|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$"
	ALLOWED="(${allowed})"
	emul-linux-x86_src_unpack

	# these tools generate an index in /etc/{pango,gtk-2.0}/${CHOST}
	mv -f "${S}/usr/bin/pango-querymodules"{,32}
	mv -f "${S}/usr/bin/gtk-query-immodules-2.0"{,-32}
	mv -f "${S}/usr/bin/gdk-pixbuf-query-loaders"{,32}

	use qt3 || rm "${S}/usr/lib32/gtk-2.0/2.10.0/engines/libqtengine.so" "${S}"/usr/kde/3.5/lib32/kde3/kcm_kcmgtk.* -f
}

pkg_preinst() {
	#bug 169058
	for l in ${ROOT}/usr/lib32/{pango,gtk-2.0} ; do
		[[ -L ${l} ]] && rm -f ${l}
	done
}

pkg_postinst() {
	PANGO_CONFDIR="/etc/pango/i686-pc-linux-gnu"
	if [[ ${ROOT} == "/" ]] ; then
		einfo "Generating pango modules listing..."
		mkdir -p ${PANGO_CONFDIR}
		pango-querymodules32 > ${PANGO_CONFDIR}/pango.modules
	fi

	GTK2_CONFDIR="/etc/gtk-2.0/i686-pc-linux-gnu"
	einfo "Generating gtk+ immodules/gdk-pixbuf loaders listing..."
	mkdir -p ${GTK2_CONFDIR}
	gtk-query-immodules-2.0-32 > ${ROOT}${GTK2_CONFDIR}/gtk.immodules
	gdk-pixbuf-query-loaders32 > ${ROOT}${GTK2_CONFDIR}/gdk-pixbuf.loaders
}

ファイル名: emul-linux-x86-qtlibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="|| ( QPL-1.0 GPL-2 ) GPL-2 LGPL-2"
KEYWORDS="-* ~amd64"
IUSE="nodevelop"

DEPEND=""
RDEPEND=">=app-emulation/emul-linux-x86-baselibs-20071114
		>=app-emulation/emul-linux-x86-soundlibs-20071114
		>=app-emulation/emul-linux-x86-xlibs-20071114"

src_unpack() {
	use nodevelop \
		|| ALLOWED="(^${S}/usr/lib32/pkgconfig|^${S}/usr/qt/3/lib32/pkgconfig|.*lib32.*\.l?a$)"

	emul-linux-x86_src_unpack
	NEEDED="(libDCOP.so|libkdecore.so|libkdefx.so|libqt-mt.so|libqt.so|libqui.so)"
	find "${S}"/usr/*/3* -name '*.so*' | egrep -v "${NEEDED}" | xargs rm -f
}

ファイル名: emul-linux-x86-medialibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="GPL-2 LGPL-2.1 as-is BSD"
KEYWORDS="-* ~amd64"
IUSE="nodevelop"

DEPEND=""

RDEPEND=">=app-emulation/emul-linux-x86-baselibs-20071114
		>=app-emulation/emul-linux-x86-soundlibs-20071114
		>=app-emulation/emul-linux-x86-xlibs-20071114
		>=app-emulation/emul-linux-x86-sdl-20071114
		!<media-video/mplayer-bin-1.0_rc1-r2"

src_unpack() {
	use nodevelop || ALLOWED="(^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)"
	emul-linux-x86_src_unpack
}

ファイル名: emul-linux-x86-soundlibs-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="as-is BSD GPL-2 LGPL-2 LGPL-2.1"
KEYWORDS="-* ~amd64"
IUSE="arts ladspa nodevelop"

RDEPEND=">=app-emulation/emul-linux-x86-baselibs-20071114
		arts? ( >=app-emulation/emul-linux-x86-qtlibs-20071114 )
		>=app-emulation/emul-linux-x86-medialibs-20071114
		>=app-emulation/emul-linux-x86-xlibs-20071114
		ladspa? ( media-libs/ladspa-sdk )"  # /etc/env.d/60ladspa

src_unpack() {
	local x allowed="^${S}/etc/env.d|^${S}/usr/bin/esddsp$|^${S}/usr/bin/aoss$|^${S}/usr/bin/jack"
	use arts && allowed="${allowed}|^${S}/usr/kde/.*/bin/artsdsp$"
	use ladspa && allowed="${allowed}|^${S}/usr/lib*/ladspa"
	use nodevelop \
		|| allowed="${allowed}|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$"
	ALLOWED="(${allowed})"
	emul-linux-x86_src_unpack

	for x in "${S}"/usr/bin/esddsp "${S}"/usr/bin/aoss "${S}"/usr/bin/jack*; do
		mv -f "${x}"{,32}
	done
	if use arts; then
		for x in "${S}"/usr/kde/*/bin/artsdsp; do mv -f "${x}"{,32}; done
	else
		rm "${S}"/usr/kde/ -fr
	fi

	if use ladspa; then
		mv "${S}"/usr/lib/ladspa/* "${S}"/usr/lib32/ladspa/
	else
		rm "${S}"/usr/lib32/ladspa/ -fr
	fi
	rm "${S}"/usr/lib/ladspa/ "${S}"/etc/env.d/60ladspa -fr
}

pkg_postinst() {
	if use ladspa && [[ ${ROOT} == "/" ]]; then
		grep "/usr/lib32/ladspa" /etc/env.d/60ladspa > /dev/null \
			|| sed -i 's|$|:/usr/lib32/ladspa|' /etc/env.d/60ladspa
	fi
}

pkg_postrm() {
	sed -i 's|:/usr/lib32/ladspa||' "${ROOT}"/etc/env.d/60ladspa
}

(2008/1/7)JACK関係のコマンドは、32bitなJACKアプリ使用時に必要なので残すように修正


ファイル名: emul-linux-x86-sdl-99999999.ebuild

# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

inherit emul-linux-x86

LICENSE="LGPL-2 LGPL-2.1"
KEYWORDS="-* ~amd64"
IUSE="nodevelop"

DEPEND=""
RDEPEND=">=app-emulation/emul-linux-x86-xlibs-20071114
	>=app-emulation/emul-linux-x86-baselibs-20071114
	>=app-emulation/emul-linux-x86-soundlibs-20071114"

src_unpack() {
	use nodevelop || ALLOWED="(^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)"
	emul-linux-x86_src_unpack
}

*1:一度入れたら、後は基本的にファイル名の変更とダイジェスト計算のみでよい

*2:RDEPENDのバージョン番号部分はあるが、自分で管理する分には問題にはならない

*3:/usr/portage/eclass/emul-linux-x86.eclassの「find "${S}" ! -type d ! -name '*.so*' | egrep -v "${ALLOWED}" | xargs -d $'\n' rm -f」を見て分かる通り、.soファイルは削除の対象にならない