x86_64版Gentoo Linuxの32bitライブラリを自前で管理(chroot無しでemul-linux-x86-baselibsをビルド)
まず、
が必要。また、パッケージごとに、ヘッダファイルを要求する関係で、64bit版の各種パッケージも必要になる(これは他のemulパッケージにも言える)。
- ビルドエラーなしのパッケージ
- USE="-python"を指定するもの
- CUPS(1.2.10-r1)
- dbus(1.0.2-r2 USE="-X")
- dbus-glib(0.73)
- dbus-qt3-old(0.70)
- e2fsprogs(1.39-r2)
- gamin(0.1.9)
- giflib(4.1.4 USE=X)
- jpeg(6b-r7)
- Glib 2(2.12.13) libidn(0.6.9-r1 USE="nls -doc -emacs -java -mono")
- pam(0.78-r5 USE="berkdb pwdb")
- openldap(2.3.35-r1 USE="berkdb crypt gdbm readline ssl -perl -tcpd"
- インストールするebuildの例
ビルドエラーなしのパッケージ
- binutils(2.18-r1)
- bzip2(1.0.4)
- com_err(1.39)
- db(4.5.20_p2)
- expat(2.0.1)
- gdbm(1.8.3-r3 USE="berkdb")
- glib(1.2.10-r5)
- gpm(1.20.1-r5)
- libart_lgpl(2.3.19-r1)
- libmng(1.0.9-r1 USE="lcms")
- libperl(5.8.8-r1 USE="berkdb gdbm")
- libpng(1.2.18-r1)
- nss_ldap(253)
- ncueses(5.6-r1 USE="gpm unicode")
- openssl(0.9.8e-r3 USE="zlib -emacs")
- pwdb(0.62)
- readline(5.2_p7)
- slang(1.4.9-r2 USE="cjk unicode")
- ss(1.39)
- tiff(3.8.2-r2 USE="jpeg zlib")
- zlib(1.2.3-r1)
USE="-python"を指定するもの
CUPS(1.2.10-r1)
USE="-ssl"を指定。もしくは、gnutlsと、それに依存するパッケージの32bit版を別途用意することになる。dbus(1.0.2-r2 USE="-X")
dbus-launchは使用されないので、USE="-X"でビルドする。dbus-glib(0.73)
64bit版と32bit版とで異なるヘッダファイルが、依存パッケージであるGlib 2とD-BUSの両方に存在する。- Glibの/usr/lib32/glib-2.0/include/glibconfig.h
- dbusの/usr/lib32/dbus-1.0/include/dbus/dbus-arch-deps.h
これらを参照するよう、ヘッダファイルと.pcファイルを用意し、
$ tar jxf [tbz2の保存先]/dev-libs/glib-[バージョン(2系)].tbz2 $ tar jxf [tbz2の保存先]/sys-apps/dbus-[バージョン].tbz2 $ sudo mkdir /usr/lib32/pkgconfig (まだ作成していない場合のみ) $ sudo cp -r usr/lib32/glib-2.0/ /usr/lib32/ $ sudo cp -r usr/lib32/dbus-1.0/ /usr/lib32/ $ sudo cp usr/lib32/pkgconfig/* /usr/lib32/pkgconfig/
更にPKG_CONFIG_PATHを渡すことで、これら32bit版ヘッダを使用するようにできる。
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO dbus-glib'
「-I/usr/lib32/dbus-1.0/include」や「-I/usr/lib32/glib-2.0/include」がビルド中に見られるようならOK。
dbus-qt3-old(0.70)
64bit版QT3が必要。更に、上のdbus-glibと同様、32bit版dbusの/usr/lib32/dbus-1.0/include/dbus/dbus-arch-deps.hを使用するように、ヘッダと.pcファイルの準備とPKG_CONFIG_PATHの指定をする。$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avBO dbus-qt3-old'
e2fsprogs(1.39-r2)
CP e2fsck make[2]: *** No rule to make target `../lib/libcom_err.a', needed by `e2fsck.sta tic'. Stop. make[2]: Leaving directory `/var/tmp/portage/sys-fs/e2fsprogs-1.39-r2/work/e2fsp rogs-1.39/e2fsck' make[1]: *** [all-progs-recursive] Error 1
lib/の下にある「libcom_err.a -> /usr/lib32/libcom_err.a」のシンボリックリンクが壊れているため
$ sudo emerge -avfO emul-linux-x86-baselibs $ tar jxf /usr/portage/distfiles/com_err-1.39.tbz2 $ sudo cp usr/lib32/libcom_err.a /usr/lib32/
libcom_err.aをコピーしておく。
gamin(0.1.9)
以下の修正をした上で、USE="-python"を付ける。--- /usr/portage/app-admin/gamin/gamin-0.1.9.ebuild.orig +++ /usr/portage/app-admin/gamin/gamin-0.1.9.ebuild @@ -10,7 +10,7 @@ LICENSE="LGPL-2" SLOT="0" KEYWORDS="alpha amd64 arm hppa ia64 m68k mips ppc ppc64 s390 sh ~sparc ~sparc-fbsd x86 ~x86-fbsd" -IUSE="debug kernel_linux" +IUSE="debug kernel_linux python" RDEPEND=">=dev-libs/glib-2 !app-admin/fam" @@ -39,6 +39,7 @@ econf --disable-debug \ $(use_enable kernel_linux inotify) \ $(use_enable debug debug-api) \ + $(use_with python) \ || die "econf failed" emake || die "emake failed"
更に、dbus-glibなどと同様、Glib 2の32bit版のヘッダと.pcファイルを用意して
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig USE="-python" emerge -avBO gamin'
のようにする。
giflib(4.1.4 USE=X)
lib64の修正をする。--- /usr/portage/media-libs/giflib/giflib-4.1.4.ebuild.orig +++ /usr/portage/media-libs/giflib/giflib-4.1.4.ebuild @@ -36,6 +36,9 @@ # prevent circular depend #111455 has_version media-libs/urt || export ac_cv_lib_rle_rle_hdr_init=no econf || die + if use amd64 && [[ "${ABI}" = "x86" ]]; then + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + fi emake || die "emake failed" }
jpeg(6b-r7)
先に(32bit版)libtoolをビルドしておいて、その中のusr/bin/libtoolを使用するのが楽。$ tar jxf [tbz2の保存先]/sys-devel/libtool-[バージョン].tbz2 $ sudo cp usr/bin/libtool /usr/bin/libtool32 $ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] MAKE="make LIBTOOL=/usr/bin/libtool32" emerge -avBO jpeg'
makeの-jオプションは手動で追加(例: MAKE="make -j2 LIBTOOL=...")。
Glib 2(2.12.13) libidn(0.6.9-r1 USE="nls -doc -emacs -java -mono")
FEATURESに「ccache」を付けると../libtool: eval: line 4297: syntax error near unexpected token `|' ../libtool: eval: line 4297: `/usr/bin/nm -B .libs/garray.o (中略) .libs/gspawn.o libcharset/.libs/libcharset.a | | /bin/sed 's/.* //' | sort | uniq > .libs/libglib-2.0.exp' make[4]: *** [libglib-2.0.la] Error 1 make[4]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.12.13/work/glib-2.12.13/glib'
のように、「| |」による文法エラーが出ることがあるが、その場合、上のjpegと同様、libtool32を使用することで回避できる。付けなければエラーにならない。
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] MAKE="make LIBTOOL=/usr/bin/libtool32" emerge -avBO glib'
pam(0.78-r5 USE="berkdb pwdb")
cracklibのライブラリ検出では$ cd /usr/lib32/ $ for ext in hwm pwd pwi; do sudo ln -s ../lib64/cracklib_dict.${ext}; done
上のように、/usr/lib64/以下の辞書ファイルにリンクを張ってエラー回避。
openldap(2.3.35-r1 USE="berkdb crypt gdbm readline ssl -perl -tcpd"
USE="-tcpd"を付けるか、32bit版tcp-wrappersを用意する。USE="-perl"も付ける。db 4.5を使用する場合、
$ tar jxf [tbz2の保存先]/sys-libs/db-[バージョン(4.5系)].tbz2 $ sudo cp usr/lib32/*.so /usr/lib32/
バージョン4.5の.soファイルを事前にコピーしておく。
cc [CFLAGS] -o .libs/apitest apitest.o -L/usr/lib32 ./. libs/libldap.so /var/tmp/portage/net-nds/openldap-2.3.35-r1/work/openldap-2.3.35 /libraries/liblber/.libs/liblber.so ../../libraries/liblber/.libs/liblber.so ../ ../libraries/liblutil/liblutil.a -lssl -lcrypto -lcrypt -lresolv ./.libs/libldap.so: undefined reference to `BIO_clear_flags' ./.libs/libldap.so: undefined reference to `BIO_set_flags' ./.libs/libldap.so: undefined reference to `SSL_CTX_set_info_callback' collect2: ld returned 1 exit status make[2]: *** [apitest] Error 1 make[2]: Leaving directory `/var/tmp/portage/net-nds/openldap-2.3.35-r1/work/ope nldap-2.3.35/libraries/libldap'
上のエラーが出たら、手元でビルドしたopensslのtbz2ファイルから.soファイルを上書きコピー。
$ tar jxf [tbz2の保存先]/dev-libs/openssl-[バージョン].tbz2 $ sudo cp -d usr/lib32/*.so* /usr/lib32/
インストールするebuildの例
上のビルド作業の流れの中で手動で用意した/usr/bin/libtool32や/usr/lib32/cracklib_dict.*などのファイルの用意をするようにしている。.aや.laファイル、.pcファイルに加えて、Glibなどのアーキテクチャ依存ヘッダも入れるようにしている。これら全てが不要ならUSE="nodevelop"で入れることで除外されるよう、ebuildをいじった。ファイル名: emul-linux-x86-baselibs-9999.ebuild
# Copyright 1999-2007 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: /var/cvsroot/gentoo-x86/app-emulation/emul-linux-x86-baselibs/emul-linux-x86-baselibs-10.2.ebuild,v 1.2 2007/03/02 15:01:34 blubb Exp $ inherit emul-libs SRC_URI="mirror://gentoo/binutils-2.18-r1.tbz2 mirror://gentoo/bzip2-1.0.4.tbz2 mirror://gentoo/com_err-1.39.tbz2 mirror://gentoo/cracklib-2.8.10.tbz2 mirror://gentoo/cups-1.2.10-r1.tbz2 mirror://gentoo/db-4.5.20_p2.tbz2 mirror://gentoo/dbus-1.0.2-r2.tbz2 mirror://gentoo/dbus-glib-0.73.tbz2 mirror://gentoo/dbus-qt3-old-0.70.tbz2 mirror://gentoo/e2fsprogs-1.39-r2.tbz2 mirror://gentoo/expat-2.0.1.tbz2 mirror://gentoo/file-4.21-r1.tbz2 mirror://gentoo/gamin-0.1.9.tbz2 mirror://gentoo/gdbm-1.8.3-r3.tbz2 mirror://gentoo/giflib-4.1.4.tbz2 mirror://gentoo/glib-1.2.10-r5.tbz2 mirror://gentoo/glib-2.12.13.tbz2 mirror://gentoo/gpm-1.20.1-r5.tbz2 mirror://gentoo/jpeg-6b-r7.tbz2 mirror://gentoo/lcms-1.15.tbz2 mirror://gentoo/libart_lgpl-2.3.19-r1.tbz2 mirror://gentoo/libidn-0.6.9-r1.tbz2 mirror://gentoo/libmng-1.0.9-r1.tbz2 mirror://gentoo/libperl-5.8.8-r1.tbz2 mirror://gentoo/libpng-1.2.18-r1.tbz2 mirror://gentoo/libtool-1.5.24.tbz2 mirror://gentoo/libxml2-2.6.28.tbz2 mirror://gentoo/ncurses-5.6-r1.tbz2 mirror://gentoo/nss_ldap-253.tbz2 mirror://gentoo/openldap-2.3.35-r1.tbz2 mirror://gentoo/openssl-0.9.8e-r3.tbz2 mirror://gentoo/pam-0.78-r5.tbz2 mirror://gentoo/pwdb-0.62.tbz2 mirror://gentoo/readline-5.2_p7.tbz2 mirror://gentoo/slang-1.4.9-r2.tbz2 mirror://gentoo/ss-1.39.tbz2 mirror://gentoo/tiff-3.8.2-r2.tbz2 mirror://gentoo/zlib-1.2.3-r1.tbz2" 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() { allowed_common="^${S}/lib32/security/pam_filter/upperLOWER|^${S}/etc/env.d" use nodevelop && ALLOWED="(${allowed_common})" \ || ALLOWED="(${allowed_common}|^${S}/usr/lib32/glib|^${S}/usr/lib32/dbus|^${S}/usr/bin/libtool$|^${S}/usr/lib32/pkgconfig|.*lib32.*\.l?a$)" emul-libs_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 }
インストール例。
$ sudo mkdir /usr/local/overlays/local/app-emulation/emul-linux-x86-baselibs/files -p $ sudo mv emul-linux-x86-baselibs-9999.ebuild /usr/local/overlays/local/app-emulation/emul-linux-x86-baselibs/ $ sudo cp [tbz2の保存先] /usr/portage/distfiles/ $ sudo emerge -avu emul-linux-x86-baselibs