x86_64版Gentoo Linuxの32bitライブラリを自前で管理(chroot無しでemul-linux-x86-qtlibsをビルド)
emul-linux-x86-qtlibs-10.0-r1の時点ではQT4が含まれていないが、自分でビルドして用意すれば、32bitのQT4を要求するアプリケーションを動作させることができるようになる。これを追加するだけでも意味はある(時間はかなりかかるが...)。
- QT3(3.3.8-r4 USE="cups gif immqt-bc -opengl")
- QT4(4.3.1-r1 USE="accessibility cups dbus gif glib jpeg mng opengl png qt3support ssl tiff zlib")
- kdelibs(3.5.7-r3 USE="alsa cups fam tiff")
- インストールするebuildの例
QT3(3.3.8-r4 USE="cups gif immqt-bc -opengl")
「USE=opengl」を付けるとx86_64-pc-linux-gnu-g++ -c -pipe -fno-exceptions -Wall -W [CXXFLAGS] -fno-strict-aliasing -D_REENTRANT -fPIC -DQT_SHARED -DQT_TABLET_SUPPORT -DQT_NO_DEBUG -DQT_THREAD_SUPPORT -DQT_THREAD_SUPPORT -DQT_NO_NIS -D_LARGEFILE_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 -DQT_NO_XINERAMA -DQT_DLOPEN_OPENGL -DQT_BUILTIN_GIF_READER=1 -DQT_NO_STYLE_MAC -DQT_NO_STYLE_AQUA -DQT_NO_STYLE_INTERLACE -DQT_NO_STYLE_WINDOWSXP -DQT_NO_STYLE_COMPACT -DQT_NO_STYLE_POCKETPC -I/var/tmp/portage/x11-libs/qt-3.3.8-r4/work/qt-x11-free-3.3.8/mkspecs/linux-g++ -I. -I/usr/include/freetype2 -I3rdparty/opentype -I../include -I/usr/include -I.moc/release-shared-mt/ -o .obj/release-shared-mt/qsvgdevice.o xml/qsvgdevice.cpp make[1]: *** No rule to make target `/usr/lib32/opengl/global/include/glext.h', needed by `.obj/release-shared-mt/qgl.o'. Stop. make[1]: *** Waiting for unfinished jobs.... make[1]: Leaving directory `/var/tmp/portage/x11-libs/qt-3.3.8-r4/work/qt-x11-free-3.3.8/src' make: *** [sub-src] Error 2
で止まるので外す。
QT4(4.3.1-r1 USE="accessibility cups dbus gif glib jpeg mng opengl png qt3support ssl tiff zlib")
QT4は、unameの結果*1をもとに32bit/64bit判別をしているようで、普通にビルドを実行すると
Determining system architecture... (Linux:[カーネルのバージョン]:x86_64) 64-bit AMD 80x86 (x86_64) 'x86_64' is supported System architecture: 'x86_64'
となり、そのまま進めると「Assembler messages」云々のエラーを起こすため、linux32でごまかす。
また、Glib 2やD-BUSのアーキテクチャ依存ファイルの関係で、PKG_CONFIG_PATH指定なしで通すわけにはいかない。事前に「emul-linux-x86-baselibs」や「emul-linux-x86-xlibs」の.pcファイルを準備しておく。
$ sudo linux32 bash -c 'FEATURES="noman noinfo" CHOST=i686-pc-linux-gnu ABI=x86 PKGDIR=[出力先] PKG_CONFIG_PATH=/usr/lib32/pkgconfig emerge -avOB qt' ... Determining system architecture... (Linux:[カーネルのバージョン]:i686) 32-bit Intel 80x86 (i386) 'i386' is supported System architecture: 'i386'
これで、.pcファイルや依存ライブラリに不足が無ければビルドが通るようになる。
D-Bus auto-detection... () g++ -c -pipe [CXXFLAGS] -Wall -W -I../../../mkspecs/linux-g++ -I. -I/usr/include/dbus-1.0 -I/usr/lib32/dbus-1.0/include -I. -o dbus.o dbus.cpp g++ -o dbus dbus.o -L/usr/lib32 -ldbus-1 D-Bus enabled. ... Glib auto-detection... () g++ -c -pipe [CXXFLAGS] -Wall -W -I../../../mkspecs/linux-g++ -I. -I/usr/include/glib-2.0 -I/usr/lib32/glib-2.0/include -I. -o glib.o glib.cpp glib.cpp: In function 'int main(int, char**)': glib.cpp:14: warning: 'pollfd' is used uninitialized in this function g++ -o glib glib.o -L/usr/lib32 -pthread -lgthread-2.0 -lrt -lglib-2.0 Glib enabled.
このようになり、その他エラーも出ていなければOK。
QT4のビルドは非常に時間がかかる。QT3サポートのモジュールを外すかどうか迷うところ。
kdelibs(3.5.7-r3 USE="alsa cups fam tiff")
libart_lgplライブラリは、emul-linux-x86-baselibsに含まれるものでは一部シンボルが未解決になる(「undefined reference to `art_alloc'」などが出る)ため、手元でビルドしたもので置き換える。「emul-linux-x86-baselibs-9999」で作成した/usr/bin/libtool32が無ければ準備する。
その上で、以下の修正を行い
--- /usr/portage/kde-base/kdelibs/kdelibs-3.5.7-r3.ebuild.orig +++ /usr/portage/kde-base/kdelibs/kdelibs-3.5.7-r3.ebuild @@ -150,7 +150,18 @@ export BINDNOW_FLAGS="$(bindnow-flags)" - kde_src_compile + if use amd64 && [[ "${ABI}" = "x86" ]]; then + myconf="${myconf} --disable-pcre" + kde_src_compile myconf configure + find . -name Makefile | xargs sed -i -e 's/lib64/lib32/g' + sed -i -e 's/\(libkdecore_la_LIBADD.*)\)/\1 $(LIB_QT)/' kdecore/Makefile + emake -C libltdl || die + emake -C dcop || die + emake -C kdefx || die + emake -C kdecore || die + else + kde_src_compile + fi if use doc; then make apidox || die @@ -158,7 +169,13 @@ } src_install() { - kde_src_install + if use amd64 && [[ "${ABI}" = "x86" ]]; then + emake -C dcop install DESTDIR=${D} destdir=${D} || die + emake -C kdefx install DESTDIR=${D} destdir=${D} || die + emake -C kdecore install DESTDIR=${D} destdir=${D} || die + else + kde_src_install + fi if use doc; then make DESTDIR="${D}" install-apidox || die
ビルドする。
emul-linux-x86-qtlibs-10.0-r1のebuildでは、
- libDCOP.so
- libkdecore.so
- libkdefx.so
以外捨てられてしまうため、この3つをビルドするようにebuildを修正している。更に、libkdecore.soのリンク時に何故かQT3のライブラリがリンクされない問題にも対処。
$ sudo bash -c 'CHOST=i686-pc-linux-gnu ABI=x86 FEATURES="noman noinfo" PKGDIR=[tbz2の出力先] MAKE="make LIBTOOL=/usr/bin/libtool32" emerge -avBO kdelibs'
インストールするebuildの例
QT3とkdelibsに関しては、インストールするファイル(それ以外は消される)が指定されているのだが、QT4に関しては、消してもよいファイルがあるのか分からないため、全て入れるようにした。ファイル名: emul-linux-x86-qtlibs-9999
# 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-qtlibs/emul-linux-x86-qtlibs-10.0-r1.ebuild,v 1.1 2007/02/21 09:36:35 blubb Exp $ inherit emul-libs SRC_URI="mirror://gentoo/qt-3.3.8-r4.tbz2 mirror://gentoo/kdelibs-3.5.7-r3.tbz2 mirror://gentoo/qt-4.3.1-r1.tbz2" LICENSE="|| ( QPL-1.0 GPL-2 ) GPL-2 LGPL-2" KEYWORDS="-* ~amd64" IUSE="nodevelop" DEPEND="" RDEPEND=">=app-emulation/emul-linux-x86-baselibs-10.0 >=app-emulation/emul-linux-x86-xlibs-7.0-r7" src_unpack() { ! use nodevelop \ && ALLOWED="(^${S}/usr/lib32/pkgconfig|^${S}/usr/qt/3/lib32/pkgconfig|.*lib32.*\.l?a$)" emul-libs_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 }
インストール例。
$ sudo mkdir /usr/local/overlays/local/app-emulation/emul-linux-x86-qtlibs/files -p $ sudo mv emul-linux-x86-qtlibs-9999.ebuild /usr/local/overlays/local/app-emulation/emul-linux-x86-qtlibs/ $ sudo cp [tbz2の保存先] /usr/portage/distfiles/ $ sudo emerge -avu emul-linux-x86-qtlibs
32bit版QT4に加え、32bit版libsigc++(2.0.2以降)と「emul-linux-x86-soundlibs」を用意することで、ダイナミック版Skypeが動作するようになる(登録はしていないので、認証画面までしか確認していない)。
$ ldd skype-1.4.0.118/skype linux-gate.so.1 => (0xffffe000) libasound.so.2 => /usr/lib32/libasound.so.2 (0xf7efa000) librt.so.1 => /lib32/librt.so.1 (0xf7ef1000) libQtDBus.so.4 => /usr/lib32/qt4/libQtDBus.so.4 (0xf7e8c000) libQtGui.so.4 => /usr/lib32/qt4/libQtGui.so.4 (0xf76c1000) libQtNetwork.so.4 => /usr/lib32/qt4/libQtNetwork.so.4 (0xf7615000) libQtCore.so.4 => /usr/lib32/qt4/libQtCore.so.4 (0xf7478000) libpthread.so.0 => /lib32/libpthread.so.0 (0xf7461000) libsigc-2.0.so.0 => /usr/lib32/libsigc-2.0.so.0 (0xf745a000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/32/libstdc++.so.6 (0xf7373000) libm.so.6 => /lib32/libm.so.6 (0xf734c000) libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0xf7340000) libc.so.6 => /lib32/libc.so.6 (0xf7218000) libX11.so.6 => /usr/lib32/libX11.so.6 (0xf7130000) libdl.so.2 => /lib32/libdl.so.2 (0xf712c000) /lib/ld-linux.so.2 (0xf7fd7000) libdbus-1.so.3 => /usr/lib32/libdbus-1.so.3 (0xf70f9000) libQtXml.so.4 => /usr/lib32/qt4/libQtXml.so.4 (0xf708f000) libz.so.1 => /lib32/libz.so.1 (0xf707c000) libpng12.so.0 => /usr/lib32/libpng12.so.0 (0xf7058000) libSM.so.6 => /usr/lib32/libSM.so.6 (0xf704e000) libICE.so.6 => /usr/lib32/libICE.so.6 (0xf7036000) libXrender.so.1 => /usr/lib32/libXrender.so.1 (0xf702d000) libXrandr.so.2 => /usr/lib32/libXrandr.so.2 (0xf7025000) libXfixes.so.3 => /usr/lib32/libXfixes.so.3 (0xf701f000) libXcursor.so.1 => /usr/lib32/libXcursor.so.1 (0xf7015000) libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf6f9b000) libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf6f6f000) libXext.so.6 => /usr/lib32/libXext.so.6 (0xf6f60000) libxcb-xlib.so.0 => /usr/lib32/libxcb-xlib.so.0 (0xf6f5c000) libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf6f43000) libxml2.so.2 => /usr/lib32/libxml2.so.2 (0xf6e26000) libXau.so.6 => /usr/lib32/libXau.so.6 (0xf6e22000) libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf6e1b000)
直接要求しているのは
$ objdump -p skype-1.4.0.118/skype | grep NEEDED NEEDED libasound.so.2 NEEDED librt.so.1 NEEDED libQtDBus.so.4 NEEDED libQtGui.so.4 NEEDED libQtNetwork.so.4 NEEDED libQtCore.so.4 NEEDED libpthread.so.0 NEEDED libsigc-2.0.so.0 NEEDED libstdc++.so.6 NEEDED libm.so.6 NEEDED libgcc_s.so.1 NEEDED libc.so.6 NEEDED libX11.so.6
の共有オブジェクトになっている。