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

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

openBVEの実行方法とMandriva Linux向けRPMパッケージ(2009/1/14現在)

  1. ディレクトリ構造
  2. 実行
  3. ディストリのパッケージとしてのディレクトリ配置と実行方法
    1. 一般ユーザが書き込める専用ディレクトリを用意することについての問題点
    2. 問題の回避
    3. ラッパースクリプトの生成スクリプト

ディレクトリ構造

openBVEを実行する際のディレクトリ構造は下のようになっている。幾つかはWindows用の配布ファイルにのみ含まれていて、ソースの配布ファイルにはない。

[トップ]-+-[Data]                        付属データ
         +-[Settings]                    設定保存
         +-[Railway]-+-[Route]-[路線名]  路線データ
         |           +-[Object]-[路線名] 路線用オブジェクト
         |           +-[Sound]-[路線名]  路線用サウンド
         +-[Train]-[車両名]              車両データ
         +-OpenBve.exe                   アセンブリ

(2009/3/18)バージョン0.9.6系からディレクトリのレイアウトが変わっている。
(2009/3/24)バージョン1.0.0.0でもこれと同じ。下はバージョン0.9.5系までのレイアウト。

[トップ]-+-[Compatibility]               付属データ
         +-[Controls]                    付属データ
         +-[Graphics]                    付属データ
         +-[Interface]                   付属データ + 設定保存
         +-[Railway]-+-[Route]-[路線名]  路線データ
         |           +-[Object]-[路線名] 路線用オブジェクト
         |           +-[Sound]-[路線名]  路線用サウンド
         +-[Train]-[車両名]              車両データ
         +-OpenBve.exe                   アセンブリ

実行

monoコマンドでopenBVE本体のアセンブリ(.exeファイル)の場所を指定する。

$ mono [OpenBve.exeの場所]

もしTao Frameworkがインストールされているにも関わらず見つからずに起動しない(System.IO.FileNotFoundException)場合、環境変数MONO_PATHにTao Frameworkのアセンブリ(.dllファイル)のディレクトリを指定する。

$ MONO_PATH=/usr/lib/mono/tao-opengl:/usr/lib/mono/tao-openal:/usr/lib/mono/tao-sdl mono [OpenBve.exeの場所]

Debianの「libtaoframework-*」パッケージでは

$ MONO_PATH=/usr/lib/cli/tao-opengl-2.1:/usr/lib/cli/tao-openal-1.1:/usr/lib/cli/tao-sdl-1.2 mono [OpenBve.exeの場所]

のようになる。

ディストリのパッケージとしてのディレクトリ配置と実行方法

以下はMandriva Linux向けのパッケージを作成した際のメモとなる。
(2009/3/24)ここの記述はバージョン0.9.3系の時点のものなので、1.0とは異なる部分がある。

一般ユーザが書き込める専用ディレクトリを用意することについての問題点
ディストリのパッケージとしてシステムにインストールする場合、/usr/share/games/openbve/などに各種ファイルを配置することになり、書き込み権限の都合により、一般ユーザが使用する際には本記事の上に記述したディレクトリ構成をホームディレクトリの下に再現することになる。
本体と付属データに関しては読み込むことしかしないため、そのディレクトリ以下のCompatibilityなどの各ディレクトリと本体(.exeファイル)に対するシンボリックリンクを作成するようなラッパースクリプトを作成すればよいと考えていたのだが、実際に試したところ

  • 設定はInterface/settings.cfgに書き込まれるため、シンボリックリンクをたどって/usr/share/games/openbve/の下にあるディレクトリ内に書き込みを試みて失敗(書き込みエラーが発生)し、設定は保存されない
  • シミュレータモードに入って「メインメニュー」を選択してメインウィンドウに戻ったときに、路線や車両の選択項目が前回選択した路線ではなくアセンブリのあるディレクトリに飛んでしまう

という問題が発生した

問題の回避
設定保存に関してはInterfaceディレクトリに対してリンクを張るのではなく、ホーム以下の専用ディレクトリ側に普通のディレクトInterfaceを作成して、ディレクトリ内の各ファイルへのリンクを張る形にしてトラブルを回避することにした。
シミュレータモードから「メインメニュー」で戻った後で路線/車両のディレクトリが飛んでしまう件については、アセンブリの存在する実際のディレクトリを基準にしていてシンボリックリンクではごまかせないため、データディレクトリからユーザのディレクトリへコピーしてくるという形で妥協することにした。ただし、毎回コピーさせると無駄なディスクアクセスを生むため、システムにインストールされているアセンブリMD5とユーザのディレクトリ側のアセンブリMD5とを比較して、同一である場合にはコピーは行わないようにした。
更に、このユーザ用ディレクトリは、(ホームの下にデータを置きたくない場合のために)環境変数OPENBVEDIRにより変更もできるようにした(標準は[ホームディレクトリ]/openbveとした)。
これらを踏まえた上で作成したMandriva Linux向けRPMパッケージは別館の配布ページで公開した。
(2014/10/12)配布ページは削除済み。

ラッパースクリプトの生成スクリプト
上記ラッパースクリプトMandriva向けに作成したパッケージでは/usr/games/openbveとして中に含んでいるが、これは.specファイル内で自動生成している。
その自動生成部分を独立したシェルスクリプトにしたのが下のコード。

#! /bin/bash

DATADIR="/usr/share/games/openbve"
#DATADIR="/usr/share/openbve"
USERDIR="~/openbve"
MONOPATH="/usr/lib/mono/tao-opengl:/usr/lib/mono/tao-openal:/usr/lib/mono/tao-sdl"
#MONOPATH="/usr/lib/cli/tao-opengl-2.1:/usr/lib/cli/tao-openal-1.1:/usr/lib/cli/tao-sdl-1.2"

cat <<EOF >| openbve
#! /bin/bash

PATH=/bin:/usr/bin

if [ ! -d  \${OPENBVEDIR:-${USERDIR}} ]; then
	mkdir -p \${OPENBVEDIR:-${USERDIR}}/{Data,Train,Settings} \${OPENBVEDIR:-${USERDIR}}/Railway/{Object,Route,Sound}
fi
cd \${OPENBVEDIR:-${USERDIR}}/
for d in \$(find ${DATADIR}/Data -type f | sed 's,/[^/]*\$,,' | sort -u); do
	mkdir \$(echo \${d} | sed 's:${DATADIR}/::') -p
	ln -s \${d}/*.* \$(echo \${d} | sed 's:${DATADIR}/::')/ 2> /dev/null
done
if [ "x\$(md5sum ${DATADIR}/OpenBve.exe | awk -F " " '{print \$1}')" != "x\$(md5sum \${OPENBVEDIR:-${USERDIR}}/OpenBve.exe 2> /dev/null | awk -F " " '{print \$1}')" ]; then
	cp ${DATADIR}/OpenBve.exe \${OPENBVEDIR:-${USERDIR}}/
fi

MONO_PATH=${MONOPATH} mono \${OPENBVEDIR:-${USERDIR}}/OpenBve.exe
EOF
chmod +x openbve

(2009/3/24)バージョン0.9.6系以上向けに修正
下はバージョン0.9.5系までを対象としている。
[任意]ファイル名: gen_openbvewrapper-0.9.5.sh

#! /bin/bash

DATADIR="/usr/share/games/openbve"
#DATADIR="/usr/share/openbve"
USERDIR="~/openbve"
MONOPATH="/usr/lib/mono/tao-opengl:/usr/lib/mono/tao-openal:/usr/lib/mono/tao-sdl"
#MONOPATH="/usr/lib/cli/tao-opengl-2.1:/usr/lib/cli/tao-openal-1.1:/usr/lib/cli/tao-sdl-1.2"

cat &lt;&lt;EOF &gt;| openbve
#! /bin/bash

PATH=/bin:/usr/bin

if [ ! -d  \${OPENBVEDIR:-${USERDIR}} ]; then
	mkdir -p \${OPENBVEDIR:-${USERDIR}}/Train \${OPENBVEDIR:-${USERDIR}}/Railway/{Object,Route,Sound}
fi
cd \${OPENBVEDIR:-${USERDIR}}/
for d in \$(find ${DATADIR}/{Compatibility,Controls,Graphics,Interface} -type f | sed 's:/[^/]*\$::' | sort -u); do
	mkdir \$(echo \${d} | sed 's:${DATADIR}/::') -p
	ln -s \${d}/*.* \$(echo \${d} | sed 's:${DATADIR}/::')/ 2> /dev/null
done
if [ "x\$(md5sum ${DATADIR}/OpenBve.exe | awk -F " " '{print \$1}')" != "x\$(md5sum \${OPENBVEDIR:-${USERDIR}}/OpenBve.exe 2> /dev/null | awk -F " " '{print \$1}')" ]; then
	cp ${DATADIR}/OpenBve.exe \${OPENBVEDIR:-${USERDIR}}/
fi

MONO_PATH=${MONOPATH} mono \${OPENBVEDIR:-${USERDIR}}/OpenBve.exe
EOF
chmod +x openbve

DATADIR(データのインストール先)やMONOPATH(本体の実行前に指定する環境変数MONO_PATHの値)は環境によって異なる場合があるので、それに合わせて使用する。

使用したバージョン:

  • openBVE 0.9.3.3-1.0.0.0