crossdev emerge で mplayer

前回のラブライブ!

opera-developer を動かすために x86_64 環境に移行した私たち。 opera-developer はあっさり動いたのだけど、mplayer の挙動がなんだかおかしい。 このままじゃ健康で文化的な最低限度の生活を維持できない。 「そうだ mplayer の 32 ビットバイナリを作ろう!」 意気揚々と crossdev -t i686 したのはいいけれど、そこには罠がいっぱいだった!

欲しいもの

  • libass (OSD)
  • pulseaudio (-ao pulse)
    • ALSA 経由で出すにしても ALSA プラグインが PulseAudio のライブラリを使うので結局必要。

最終目標

crossdev -t i686
cat > /usr/i686-pc-linux-gnu/etc/portage/package.use <<__EOF__
media-video/ffmpeg aac mp3 cpudetection threads truetype
media-video/mplayer alsa pulseaudio -quvi -mp3 -dvd -dvdnav
media-video/mplayer2 alsa pulseaudio -quvi -mp3 -dvd -dvdnav
media-plugins/alsa-plugins pulseaudio
__EOF__
emerge-i686-pc-linux-gnu mplayer2

当然のようにダメ。

作業記録

!!! The ebuild selected to satisfy ">=dev-libs/gobject-introspection-1.34" for /usr/i686-pc-linux-gnu/ has unmet requirements.
- dev-libs/gobject-introspection-1.40.0-r2::gentoo USE="x86 -cairo -doctool -test" PYTHON_SINGLE_TARGET="-python2_7" PYTHON_TARGETS="-python2_7"

  The following REQUIRED_USE flag constraints are unsatisfied:
    python_single_target_python2_7

  The above constraints are a subset of the following complete expression:
    python_single_target_python2_7? ( python_targets_python2_7 ) exactly-one-of ( python_single_target_python2_7 ) test? ( cairo )

(dependency required by "media-libs/harfbuzz-0.9.35[introspection]" [ebuild])
(dependency required by "media-libs/libass-0.11.2[harfbuzz]" [ebuild])
(dependency required by "media-video/mplayer2-2.0_p20131009[libass]" [ebuild])
(dependency required by "mplayer2" [argument])
cat >> /usr/i686-pc-linux-gnu/etc/portage/make.conf <<__EOF__
PYTHON_TARGETS="python2_7"
PYTHON_SINGLE_TARGET="python2_7"
__EOF__
emerge-i686-pc-linux-gnu mplayer2
 * ARCH is not set... Are you missing the '/usr/i686-pc-linux-
 * gnu/etc/portage/make.profile' symlink? Is the symlink correct? Is your
 * portage tree complete?

make.profile は crossdev が作ったんだけど、このリンク先が間違っているらしいので張り直す。

rm /usr/i686-pc-linux-gnu/etc/portage/make.profile
ln -s /usr/portage/profiles/default/linux/x86/13.0 /usr/i686-pc-linux-gnu/etc/portage/make.profile
emerge-i686-pc-linux-gnu mplayer2
checking for XCBPROTO... no
configure: error: Package requirements (xcb-proto >= 1.10) were not met:

No package 'xcb-proto' found

libxcb でエラー。

emerge-i686-pc-linux-gnu xcb-proto
emerge-i686-pc-linux-gnu mplayer2
checking whether /usr/bin/python2.7 version is >= 2.6... yes
checking for /usr/bin/python2.7 version... 2.7
checking for /usr/bin/python2.7 platform... linux2
checking for /usr/bin/python2.7 script directory... ${prefix}/lib64/python2.7/site-packages
checking for /usr/bin/python2.7 extension module directory... ${exec_prefix}/lib64/python2.7/site-packages
checking for headers required to compile python extensions... not found
configure: error: Python headers not found

gobject-introspection でエラー。 これは portagePYTHON=/usr/bin/python2.7環境変数を設定しているせいらしい。ちょっと理不尽な感じだ。 回避方法がわからなかったので EXTRA_ECONF="PYTHON=hoge" することにした。 さらに、/usr/i686-pc-linux-gnu/usr/bin/python2.7-config がなぜか #!/usr/bin/python2.7 になっているので、これも書き換える。 あと、なんでかこのままだと python の実行に失敗するので LD_LIBRARY_PATH も設定しておく。

mkdir /usr/i686-pc-linux-gnu/etc/portage/env
cat > /usr/i686-pc-linux-gnu/etc/portage/env/gobject-introspection.conf <<__EOF__
EXTRA_ECONF="PYTHON=/usr/i686-pc-linux-gnu/usr/bin/python2.7"
__EOF__
cat >> /usr/i686-pc-linux-gnu/etc/portage/package.env <<__EOF__
dev-libs/gobject-introspection gobject-introspection.conf
__EOF__
sed -i 's|^#!/usr/bin/python2\.7$|#!/usr/i686-pc-linux-gnu/usr/bin/python2.7|' /usr/i686-pc-linux-gnu/usr/bin/python2.7-config
cat >> /usr/i686-pc-linux-gnu/etc/portage/make.conf <<__EOF__
LD_LIBRARY_PATH="/usr/i686-pc-linux-gnu/lib:/usr/i686-pc-linux-gnu/usr/lib:\${LD_LIBRARY_PATH}"
__EOF__
checking for GLPROTO... no
configure: error: Package requirements (glproto >= 1.4.14) were not met:

No package 'glproto' found

media-libs/mesa でエラー。以下、mesa で同様のエラーが続くのでまとめて書く。

emerge-i686-pc-linux-gnu xcb-proto dri2proto dri3proto presentproto
emerge-i686-pc-linux-gnu mplayer2
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libexpat.so when searching for -lexpat
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libdrm.so when searching for -ldrm
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libdrm_nouveau.so when searching for -ldrm_nouveau
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libz.so when searching for -lz
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libpthread.so when searching for -lpthread
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libpthread.a when searching for -lpthread
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libffi.so when searching for -lffi
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libdl.so when searching for -ldl
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libdl.a when searching for -ldl
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libLLVM-3.3.so when searching for -lLLVM-3.3
/usr/libexec/gcc/i686-pc-linux-gnu/ld: cannot find -lLLVM-3.3
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libm.so when searching for -lm
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libm.a when searching for -lm
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libc.so when searching for -lc
/usr/libexec/gcc/i686-pc-linux-gnu/ld: skipping incompatible /usr/lib64/libc.a when searching for -lc
collect2: error: ld returned 1 exit status

mesa でリンクエラー。llvm-3.3 が必要なのだが、llvm-3.5 が入ってしまっているためだ。

emerge-i686-pc-linux-gnu \<llvm-3.4
emerge-i686-pc-linux-gnu mplayer2
/usr/lib/libltdl.so: error adding symbols: File in wrong format

pulseaudio でリンクエラー。libtool に -lltdl と投げているのだけど、どうやら /usr/i686-pc-linux-gnu/usr/lib/libltdl.la が libdir='/usr/lib' となっているせいで libtool がリンカに /usr/lib/libltdl.so を投げてリンクエラーになっているらしい。 libdir='/usr/i686-pc-linux-gnu/usr/lib' としてやればよい。

sed -i "s|^libdir='/usr/lib'\$|libdir='/usr/i686-pc-linux-gnu/usr/lib'|" /usr/i686-pc-linux-gnu/usr/lib/libltdl.la
emerge-i686-pc-linux-gnu mplayer2
>>> Install mplayer2-2.0_p20131009 into /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image/ category media-video
make DESTDIR=/usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image/ install 
./version.sh
if test ! -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/bin ; then install -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/bin ; fi
if test ! -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//etc/mplayer2 ; then install -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//etc/mplayer2 ; fi
install -m 755 mplayer2 /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/bin
rst2man.py DOCS/man/en/mplayer.rst DOCS/man/en/mplayer.1
if test ! -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/share/man/man1 ; then install -d /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/share/man/man1 ; fi
install -m 644 DOCS/man/en/mplayer.1 /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image//usr/share/man/man1/
>>> Completed installing mplayer2-2.0_p20131009 into /usr/i686-pc-linux-gnu/tmp/portage/media-video/mplayer2-2.0_p20131009/image/

strip: i686-pc-linux-gnu-strip --strip-unneeded -R .comment -R .GCC.command.line -R .note.gnu.gold-version
   usr/bin/mplayer2
ecompressdir: bzip2 -9 /usr/share/doc
ecompressdir: bzip2 -9 /usr/share/man
>>> Done.

>>> Installing (1 of 1) media-video/mplayer2-2.0_p20131009 to /usr/i686-pc-linux-gnu/
 * Removing /usr/share/man
 * Removing /usr/share/info
 * Removing /usr/share/doc
>>> Auto-cleaning packages...

やったー!愛衣ちゃん大勝利!!

R=/usr/i686-pc-linux-gnu
LD_LIBRARY_PATH=$R/usr/lib/pulseaudio:$R/usr/lib:$R/lib
export LD_LIBRARY_PATH
$R/usr/bin/mplayer2 hogehoge

こんなかんじで。