MediaTombをLS-GLにインストール

LS-GLにMediaTombを入れて、DLNAサーバ化してみました。これでPlayStation3から、いつでもメディアにアクセス可能になります。
関連ライブラリがたくさんありますが、順番に片付けていきます。時間がかかるので、なるべくクロスビルドしますが、うまく行かないものもあるので、そのあたりは適宜セルフで行います。その場合でも、以前の記事で書いたdistccを使えば、ちょっと速くなる気がします。
いつも通り、環境設定としては id:NeoCat:20070910:1189450575 を使います。

mysql-5.0.51のセルフコンパイル(本体で実行、distccを使っても良い)

% cd mysql-5.0.51
psコマンドがbusyboxのもののため、そのままでは動作しません。configureを編集、"how to check if pid ..."で検索して、以下のようにprocfsを見て調べる方法を追加。

echo $ECHO_N "checking \"how to check if pid exists\"... $ECHO_C" >&6
PS=$ac_cv_path_PS
# Linux style
if $PS p $$ 2> /dev/null | grep `echo $0 | sed s/\-//` > /dev/null
then
  FIND_PROC="$PS p \$\$PID | grep -v grep | grep \$\$MYSQLD > /dev/null"
# procfs style
elif cat /proc/$$/cmdline | grep `echo $0 | sed s/\-//` > /dev/null
then
  FIND_PROC="cat /proc/\$\$PID/cmdline 2>/dev/null | grep \$\$MYSQLD > /dev/null"
# Solaris
...

あとは普通に。

% ./configure --with-charset=utf8 --with-extra-charsets=all --prefix=/usr/local/mysql --enable-assmbler --enable-thread-safe-client --with-openssl=/usr/local/ssl --without-debug
% make
% su
% make install

なお、別ディレクトリにインストールしてアーカイブ化し、母艦のクロスコンパイル環境にも入れておきます。まるまる入れてしまうのはちょっと大げさだけど。。その上で、クロス環境のmysql_configのパスを合わせて編集しておきます。

% emacs /usr/local/arm/arm-none-linux-gnueabi/usr/local/mysql/bin/mysql_config

/usr/local を sslライブラリ周りも含めて/usr/local/arm/arm-none-linux-gnueabi/usr/local に全て置換します。

readline-5.2のクロスコンパイル

ソースは ftp://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz から。手順は至って簡単。

% tar xzf readline-5.2.tar.gz
% cd readline-5.2
% ./configure --build=powerpc-apple-darwin8.10.0 \
    --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi
% make
% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages/
% sudo chown -R root:wheel usr
% tar czf readline-5.2-arm-none-linux-gnueabi.tar.gz usr

作ったアーカイブはクロスコンパイル環境にも展開しておきます。

% tar xzf readline-5.2-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

sqlite-3.5.4のクロスビルド

ソースは http://www.sqlite.org/download.html から。

% ./configure --build=powerpc-apple-darwin8.10.0 \
    --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi \
    --disable-tcl \
    --with-readline-inc=-I/usr/local/arm/arm-none-linux-gnueabi/usr/local/include
% make
% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages/
% sudo chown -R root:wheel usr
% tar czf sqlite-3.5.4-arm-none-linux-gnueabi.tar.gz usr

これも、クロスコンパイル環境にも展開しておく。

% tar xzf sqlite-3.5.4-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

SpiderMonkey (js-1.7.0) のセルフビルド

autoconfではなく、自動的に環境を調べるスクリプトがmakeに入っているらしく、クロスビルドがうまくいかないので、セルフで作ります。distccすればちょっとは速いでしょう。ソースは http://ftp.mozilla.org/pub/mozilla.org/js/ から。
readmeによると、threadsafeにするためには、NSPRライブラリがいるらしいのですが、とりあえずmediatombにいらないだろうと言うことで、threadsafeにはしない方向で行きます。

% cd src
% make -f Makefile.ref BUILD_OPT=1 -j3

Makefileにinstallセクションがないので、finkのパッチ(/sw/fink/10.4/unstable/main/finkinfo/libs/spidermonkey.patch)を元に、次のようにMakefile.refを編集します。

JS_HFILES =             \

のセクションに足りないヘッダファイルを追加し、

	jsxml.h		\
	jsutil.h		\	←追加
	jsprf.h		\	←追加
	$(NULL)

また最後に

DESTDIR :=
PREFIX := /usr/local
BINDIR := $(PREFIX)/bin
MY_LIBDIR := $(PREFIX)/$(LIBDIR)
INCLUDEDIR := $(PREFIX)/include/js
INSTALL := install
install:
	$(INSTALL) -m 755 -d $(DESTDIR)$(INCLUDEDIR) $(DESTDIR)$(MY_LIBDIR) $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 755 $(SHARED_LIBRARY) $(DESTDIR)$(MY_LIBDIR)
	$(INSTALL) -m 644 $(LIBRARY) $(DESTDIR)$(MY_LIBDIR)
	$(INSTALL) -m 755 $(OBJDIR)/js $(OBJDIR)/jscpucfg $(DESTDIR)$(BINDIR)
	$(INSTALL) -m 644 $(HFILES) $(DESTDIR)$(INCLUDEDIR)

を追加。そうしておいて

% make -f Makefile.ref BUILD_OPT=1 install DESTDIR=~/packages
% cd ~/packages
% su -c 'chown root:wheel -R usr'
% tar czf js-1.7.0-arm-none-linux-gnueabi.tar.gz usr

で出来上がり。
これも、クロスコンパイル環境にも展開しておく。

% tar xzf js-1.7.0-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

taglib-1.4のセルフコンパイル

C++なライブラリのパス解決がおかしいらしく、g++のクロスコンパイルが何だかうまく動かないことが判明。今更…。
とりあえず、逃げと言うことで、LS-GL本体でセルフビルドします。やることは http://developer.kde.org/~wheeler/taglib.html からソースを取ってきて、

% ./configure ; make ; make install DESTDIR=~/packages
% cd ~/packages
% su -c 'chown root:wheel -R usr'
% tar czf taglib-1.4-arm-none-linux-gnueabi.tar.gz usr

でおしまい。でもなんだかなあ。
あと、これもクロスコンパイル環境にも展開しておく。

% tar xzf taglib-1.4-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

そして、クロスコンパイル用のtaglib-configのprefixを修正しておく。

% emacs /usr/local/arm/arm-none-linux-gnueabi/usr/local/bin/taglib-config
prefix=/usr/local

から

prefix=/usr/local/arm/arm-none-linux-gnueabi/usr/local

に変更。

g++のクロスコンパイルを再考

まず、標準インクルードパスが解決できないらしく、#include とかが全てこける。これは、

% arm-none-linux-gnueabi-g++ -I/usr/local/arm/arm-none-linux-gnueabi/usr/include/c++/3.4.4 -I/usr/local/arm/arm-none-linux-gnueabi/usr/include/c++/3.4.4/arm-none-linux-gnueabi test.cpp

とかやれば何とかコンパイルは通せるようです。
次に、これで出来たバイナリを本体で動かそうとすると

./a.out: /usr/local/lib/libstdc++.so.6: no version information available (required by ./a.out)

というエラーが出てしまう。(でも一応動く)
どうも、本体に元々入っていた/usr/lib/libstdc++.so.6.0.3と、自分で入れたセルフコンパイル環境の/usr/local/lib/libstdc++.so.6.0.3でバージョンの入り方が食い違っているらしい。
とりあえず、セルフ環境の/usr/local/lib/libstdc++.so.6.0.3 をlibstdc++.so.6.0.3.selfなどと適当にリネームし、代わりに本体の /usr/lib/libstdc++.so.6.0.3 へのシンボリックリンクにすれば解決するようです。(これが正しい解かはよく分からないが。。。)
ついで、本体でクロスビルドする際の環境変数として

export CPPFLAGS='-I/usr/local/arm/arm-none-linux-gnueabi/usr/include/c++/3.4.4 -I/usr/local/arm/arm-none-linux-gnueabi/usr/include/c++/3.4.4/arm-none-linux-gnueabi'

を追加しておけば、autoconfが考慮してくれるような気がする。

libexif-0.6.16のクロスビルド

ソースはhttp://libexif.sourceforge.net/から。
./configureが何か勝手にfinkのmsgfmtを使ってしまうが、まあいいか。

% ./configure --build=powerpc-apple-darwin8.10.0 \
    --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi
% make
% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages
% sudo chown -R root:wheel usr
% tar czf libexif-0.6.16-arm-none-linux-gnueabi.tar.gz usr
% tar xzf libexif-0.6.16-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

libextractor-0.5.18のクロスビルド

ソースはhttp://gnunet.org/libextractor/download/libextractor-0.5.18.tar.gzとか、http://ftp.yz.yamagata-u.ac.jp/pub/GNU/libextractor/から。
一緒にlibltdlもビルドされるので、別個にアーカイブ、セルフビルド環境にもインストールしておきます。

% ./configure --build=powerpc-apple-darwin8.10.0 \
    --target=arm-none-linux-gnueabi --host=arm-none-linux-gnueabi \
    --enable-ltdl-install

まずlibltdl。

% cd libltdl
% make
% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages
% sudo chown -R root:wheel usr
% tar czf libltdl-arm-none-linux-gnueabi.tar.gz usr
% tar xzf libltdl-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/
% sudo rm -rf usr

続いて本体。

% cd -
% cd ..
% make

途中でホストでバイナリを実行しようとしてこけるので、

% cd src/plugins/printable
% gcc -DHAVE_CONFIG_H -I/sw/include -I. -I../../../src/include -L/sw/lib -lintl \
  -I../../../src/include -fno-strict-aliasing -g -O2 -MT dictionary-builder.o -MD -MP \
  -MF ".deps/dictionary-builder.Tpo" -o dictionary-builder dictionary-builder.c
% cd -
% make

とかやって手動でdirectory-builderというコマンドを作ってあげる。なお、上記のは基本はmakeが自動でビルドしたときの物まねですが、finkで入ったホスト用のlibintlに依存しています。

% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages
% sudo chown -R root:wheel usr
% tar czf libextractor-0.5.18-arm-none-linux-gnueabi.tar.gz usr
% tar xzf libextractor-0.5.18-arm-none-linux-gnueabi.tar.gz -C /usr/local/arm/arm-none-linux-gnueabi/

さりげなく、ちゃんとg++も動いたようです。例によってクロスビルド環境にもインストールしておきます。

mediatomb-0.10.0のクロスビルド

さて、ようやくメインディッシュ。
PATH環境変数をいじって、ホストのmysql_configではなく、/usr/local/arm/arm-none-linux-gnueabi/usr/local/mysql/bin が優先されるようにしておきます。加えて、./configure を編集し、

        LDFLAGS="$LDFLAGS $MYSQL_LIBS"

という行を

        LIBS="$LIBS $MYSQL_LIBS"

に直す。これは、

gcc `mysql_config --cflags` hoge.c `mysql_config --libs`

という順番でないとリンクがうまくいかないため。LDFLAGSはhoge.cよりも前、LIBSはhoge.cの後に定義されているので、これを利用する。

ファイル登録の自動追尾(autoscan)に使えるinotifyは試行錯誤しましたが、結局うまく動かないようです。残念。。。

% export PATH=/usr/local/arm/arm-none-linux-gnueabi/usr/local/mysql/bin:$PATH
% ./configure --disable-dependency-tracking \
    --build=powerpc-apple-darwin8.10.0 --target=arm-none-linux-gnueabi \
    --host=arm-none-linux-gnueabi \
    --with-js-h=/usr/local/arm/arm-none-linux-gnueabi/usr/local/include/js \
    --with-js-libs=/usr/local/arm/arm-none-linux-gnueabi/usr/local/lib \
    --with-iconv-h=/usr/local/arm/arm-none-linux-gnueabi/usr/include \
    --with-iconv-libs=/usr/local/arm/arm-none-linux-gnueabi/usr/lib \
    --disable-id3lib --enable-taglib \
    --with-taglib-cfg=/usr/local/arm/arm-none-linux-gnueabi/usr/local/bin/taglib-config \
    --enable-libextractor
    --with-extractor-h=/usr/local/arm/arm-none-linux-gnueabi/usr/local/include \
    --with-extractor-libs=/usr/local/arm/arm-none-linux-gnueabi/usr/local/lib \
    --enable-mysql
    --with-mysql_config=/usr/local/arm/arm-none-linux-gnueabi/usr/locl/mysql/bin/mysql_config \
    --disable-inotify

なぜかクロスコンパイル環境だと、mallocがrpl_mallocに#defineされてしまい、taglibのコンパイルが通らなくなってしまいます。実はこのせいでconfigure中にもWarningが出ているのですが、、、何てうざいことをしてくれるんだろう。セルフビルド環境だとそんなおかしなことにはならない模様。とりあえず、configure後にautoconf.hを書き換え、以下2カ所をコメントアウトして対処します。

/* #define malloc rpl_malloc */
...
/* #define realloc rpl_realloc */

あとは順調。

% make
% make install DESTDIR=~/Desktop/packages
% cd ~/Desktop/packages
% sudo chown -R root:wheel usr
% tar czf mediatomb-0.10.0-arm-none-linux-gnueabi.tar.gz usr

あとはこれまで作ったアーカイブを全てLS-GL上で-C /付きで展開すればインストール完了。

MySQLとmediatombを起動

まずMySQLのデータベースを作成。容量の少ないrootパーティションをこれ以上食って欲しくないので、場所は/mnt/disk1/上の適当なフォルダ上にします。とりあえずDBを起動してみましょう。

% mysql_install_db --datadir=/mnt/disk1/NeoCat/mysql
% mysqld_safe --datadir=/mnt/disk1/NeoCat/mysql &
% disown

うまく動いた。rootパスワードを設定し、ユーザを作り、mediatomb用のデータベースを作成。

% mysqladmin -u root password '********'
% mysql -u root -p
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON *.* TO NeoCat@localhost IDENTIFIED BY '********' WITH GRANT OPTION;
mysql> create database mediatomb;

mediatombを一回実行し、~/.mediatomb内に出来たconfig.xmlを編集して、MIMEタイプの設定、autoscanの設定、mysqlを使用する設定を行います。
mediatomb用のディレクトリを作っておくと良いかもしれません。PC Direcotoryからの階層が少なくなるよう、/media にしました。これ普通は別用途だけどまあいいか。
この中に、メディアの入っているディレクトリ(/mnt/disk1/NeoCat/Videos とか)へのシンボリックリンクを張れば、そこに入れたファイルが登録されるようにautoscanを設定しておくと快適な気がします。例えば、

  <import ...
  ...
    <autoscan>
      <directory location="/media" mode="timed" interval="86400" level="full" recursive="yes" hidden-files="no"/>
    </autoscan>

とか。

その上でmediatomb -dオプション付きで再起動すれば、DLNAサーバの出来上がり。長い道のりだった…。PS3での早送りやジャンプ等もばっちり。
あとは適当に自動起動スクリプトを書けばOK。とりあえず、MySQLとmediatombをユーザ権限で実行するようにしておけば良いでしょう。

あー疲れた。せっかくなので、作ったバイナリ、どっかで公開しようかな。HS-DHGLシリーズ が出ている今、あまり需要はなさそうだけど…。