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

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

x86_64版Gentoo Linuxの32bitライブラリを自前で管理(chroot無しでemul-linux-x86-qtlibsをビルド)

emul-linux-x86-qtlibs-10.0-r1の時点ではQT4が含まれていないが、自分でビルドして用意すれば、32bitのQT4を要求するアプリケーションを動作させることができるようになる。これを追加するだけでも意味はある(時間はかなりかかるが...)。

  1. QT3(3.3.8-r4 USE="cups gif immqt-bc -opengl")
  2. QT4(4.3.1-r1 USE="accessibility cups dbus gif glib jpeg mng opengl png qt3support ssl tiff zlib")
  3. kdelibs(3.5.7-r3 USE="alsa cups fam tiff")
  4. インストールする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

の共有オブジェクトになっている。

*1:uname -m」と「liunx32 uname -m」をそれぞれ実行して、違いを確認できる