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
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シリーズ が出ている今、あまり需要はなさそうだけど…。