2011-03-18

murmurをMac OS X 10.4 PowerPCでコンパイルする

Mumbleというオープンソースのボイスチャットのソフトを見つけた。サーバの実装はMurmurというらしい。自宅で動かしているサーバはPowerPCのOS X Tigerという古いもので、murmurの最新版ではサポートされていない。でもいじりまわした結果なんとか動いたのでメモする。

うまくいくまでの経緯

まず、DarwinPortsにmurmurがあったのでそれを単純に入れてみようとした(sudo port install murmur)。依存関係のビルドは、qt4-macというportの作業領域に6GBほどHDDを食われたものの、特に問題なくすんだ。しかし、murmur自体のビルドでエラーになった。ログを見るとコンパイラの引数に-arch i386という文字があったので最新版はとりあえず諦めた。

DarwinPortsを諦めてtarballを野良ビルドすることも考えたが、サーバとして動かすなら、ビルドするだけではすまない。LaunchDaemonsなどに登録する必要がある。plistなどを用意する作業と天秤にかけて、Portfile(DarwinPortsのビルド手順を記述したスクリプト)をいじってみることにした。

検索してみると、昔のバージョンではppcでも動いていたような報告がある。Portfile歴史をさかのぼってみると、1.2.2(この記事時点での最新 r75458)になる前のバージョンは1.1.8だった。とりあえずr69125のPortfileを落として野良ビルドしたところ、qmakeが見つからないというエラーが出た。

最新版のPortfileではqt関係の記述が変わっていたので、それを見ながら適当にPortfileをいじった。ビルドしなおすとエラーが変化して、リンク時にエラーが出た。/usr/bin/ld: Undefined symbols: _Gestaltという見覚えのあるエラーが出ていたので、リンカのオプションに-framework CoreServicesをつけるようなMakefileを生成するようにqmakeに引数を与えるようPortfileを修正した(こういうとき自動化は怖い)。

いじったPortfile

できあがったPortfileは以下。そのうちフィードバックしたい。

# -*- coding: utf-8; mode: tcl; tab-width: 4; truncate-lines: t; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:et:sw=4:ts=4:sts=4
# $Id$
PortSystem 1.0
PortGroup qt4 1.0
name murmur
version 1.1.8
categories net audio
license GPL
maintainers snc openmaintainer
description server for mumble - low latency voice chat for gaming
long_description \
Server component of Mumble - an open source, low-latency, high quality \
voice chat software primarily intended for use while gaming.
homepage http://mumble.sourceforge.net/
platforms macosx
master_sites sourceforge:mumble
checksums md5 a7da012922d39b87c45d9f481d4b5efb \
sha1 83b5ef771b6801953290ee184f1590686e831b8c \
rmd160 d2d05993b38749f30ed67b8b92a22ef236dc7cf1
distname mumble-${version}
dist_subdir mumble
#livecheck.type regex
#livecheck.url ${homepage}
livecheck.regex "& Murmur (\\d+\\.\\d+(\\.\\d+))"
depends_lib-append \
port:openssl \
port:protobuf-cpp
depends_build-append \
port:boost
configure.cmd ${qt_qmake_cmd}
configure.pre_args CONFIG-=app_bundle CONFIG+=\"
configure.post_args \" QMAKE_LFLAGS='-framework CoreServices'
configure.args release no-universal no-client no-ice no-update no-g15
variant universal {
configure.args-delete no-universal
}
variant ice description "Enable ice support" {
configure.args-delete no-ice
depends_lib-append port:ice-cpp
}
startupitem.create yes
startupitem.type launchd
startupitem.name Murmur
startupitem.start "${prefix}/sbin/murmurd -ini ${prefix}/etc/murmur/murmur.ini"
startupitem.stop "kill -TERM `cat ${prefix}/var/run/murmur/murmur.pid`"
startupitem.pidfile auto "${prefix}/var/run/murmur/murmur.pid"
build {
system "cd ${worksrcpath} && make"
}
destroot {
addgroup murmur
adduser murmur gid=[existsgroup murmur] realname=Murmur\ -\ Mumble\ Voice\ Chat
set dp ${destroot}${prefix}
set w ${worksrcpath}
set logdir ${dp}/var/log/murmur/
set dbdir ${dp}/var/lib/murmur/
set piddir ${dp}/var/run/murmur/
xinstall -m 740 -o murmur -g murmur -d \
${logdir} \
${dbdir} \
${piddir}
destroot.keepdirs-append \
${logdir} \
${dbdir} \
${piddir}
file mkdir ${dp}/etc/murmur/
file mkdir ${dp}/sbin/
file mkdir ${dp}/etc/dbus-1/system.d/
file copy ${w}/release/murmurd ${dp}/sbin/murmurd
set conf ${dp}/etc/murmur/murmur.ini
file copy ${w}/scripts/murmur.ini.system ${conf}
system "sed -i '' -e 's,database=.*,database=${prefix}/var/lib/murmur/murmur.sqlite,' ${conf}"
system "sed -i '' -e 's,pidfile=.*,pidfile=${prefix}/var/run/murmur/murmur.pid,' ${conf}"
system "sed -i '' -e 's,logfile=.*','logfile=${prefix}/var/log/murmur/murmur.log,' ${conf}"
if {![variant_isset ice]} {
# This change is made only to avoid confusion. Murmur ignores
# the ice= config option when built without Ice support.
system "sed -i -e 's,ice=,\#ice=,' ${destroot}${prefix}/etc/murmur/murmur.ini"
}
set dbusservice ${dp}/etc/dbus-1/system.d/murmur.conf
file copy ${w}/scripts/murmur.conf ${dbusservice}
system "sed -i '' -e 's,user=.*\",user=\"murmur\",' ${dbusservice}"
}
pre-install {
set plist ${destroot}${prefix}/etc/LaunchDaemons/org.macports.Murmur/org.macports.Murmur.plist
system "sed -i '' -e 's,</dict>,<key>UserName</key><string>murmur</string></dict>,' ${plist}"
}
post-install {
ui_msg ""
ui_msg "***************************************************************"
ui_msg "* To set up a password for the SuperUser user on your Murmur"
ui_msg "* server, execute:"
ui_msg "*"
ui_msg "* ${prefix}/sbin/murmurd -ini ${prefix}/etc/murmur/murmur.ini -supw \[password\]"
ui_msg "*"
ui_msg "* In case you want to interface with a different database than"
ui_msg "* sqlite, then take a look at the +psql and +mysql5 variants of"
ui_msg "* qt4-mac."
ui_msg "*"
ui_msg "***************************************************************"
ui_msg ""
}
view raw Portfile hosted with ❤ by GitHub
view raw umurmurd hosted with ❤ by GitHub

使い方としては、このPortfileを空のフォルダに置き、そこにcdしてsudo port installとすればよい。

追記

umurmurというQtに依存しないクローンがあった。ビルドがmake一発と簡単な上1.2のプロトコルにも対応しているので、こっちを入れるほうがよさそう。

野良ビルドのメモ:

  • libconfigというライブラリはDarwinPortsにあるものとは別物らしい
  • 定数_POSIX_PRIORITY_SCHEDULINGを#undefする必要がある

0 件のコメント:

コメントを投稿