Hatena::ブログ(Diary)

I CAN ’CAUSE I THINK I CAN! このページをアンテナに追加 RSSフィード

, and twitter /真面目なブログ

2009/04/26(Sun)

CentOS 5.2 + gcc 4.1.2でPMMLをインストール

PMMLは会津大学の西村先生が作ったMML拡張とそのコンパイラの実装。LinuxMMLコンパイラといえばSPICE(電気回路シミュレータにあらず)が有名(っぽい)が、なんとなく適当にインストールしたらあっさりは動かなかったので、こんなん(NOTE:PDF)見つけてPMMLへの手がかりを得る。

入手とインストール

no title

会大のPMMLの公式サイトはアクセスできない状態らしいのだが、FTPサーバからPMML自体は入手できる様子。

URL: ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz

これをダウンロードして展開すると、INSTALLには「適宜Makefile書き直せ」とか初心者を蹴り殺すようなことが書いてあるがスルーしてビルドする。

とダメなので上記のサイトの「重複した宣言文」なるセクションの処理を施す。で、今度こそビルド

$ wget ftp://ftp.u-aizu.ac.jp/u-aizu/pmml/pmml-0.2p1.tar.gz
$ tar xvzf pmml-0.2p1.tar.gz
$ cd pmml-0.2p1
$ make && make install

と、大コケした。make時だかinstall時だかわからないが、次のようなエラーが。

TLS definition in /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in input.o

libc.so.6とか絡んでるしぶっちゃけもう読む気にならないような感じだがとりあえず検索。

すると何か結構良くあるトラブルらしい:

/usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o

↑というエラーが出る場合 errno の扱いに問題があるらしい 以下のいずれか もしくは組み合わせの対処法で

  1. ソースプログラム.c の extern int errno; をコメントアウト
  2. #include がなければ 追加
  3. #include を追加してみる
  4. gccオプションに –include /usr/include/errno.hを指定

errno.h は glibc 提供のヘッダファイルです djbdns qmail 関連 ucspi-tcpビルドのときに問題がでやすいようです

errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o | UNIXとプログラムとゲーム

(整形はtnzkによるが文章は原文ママ)

cat comp/*.c |grep include すると、errno.hはインクルードされているようだったので、4番だけを試す(あと、2と3の違いがわからないんだが、どういうことなんだろ?)。

Makefileを開くと、

CCOPTS = -O

という行がある(tnzkの場合は17行目だった)ので、これを以下のように書き換える。

CCOPTS = -O2 --include /usr/include/errno.h

2つ補足。

  • 先ほど引用したページはミスかどうかで「-include /usr/include/errno.h」となっているが、正しくは「--include /usr/include/errno.h」
  • 最適化オプションが-O2に変更されているが、自分がなぜこうしたのかイマイチ覚えていないしどちらでもあまり影響はないんじゃないかと思う

この変更を加えてからmake && make installすると通る。

使ってみる

試しにとりあえずpmmlを呼んでみたらUTF8の端末では化けたのでnkfを噛ませる:

$ pmml -h | nkf -w
PMML Compiler   Release 0.2 (Compiler version 0.67)
Copyright (C) 1997,1998  Satoshi Nishimura
This program comes with ABSOLUTELY NO WARRANTY.

使用法: pmml [オプション] ファイル名
オプション:
  -0       format 0 の標準MIDIファイルを生成する
  -1       format 1 の標準MIDIファイルを生成する
  -2       format 2 の標準MIDIファイルを生成する
  -c ch,ch-ch,...
           指定されたMIDIチャネルだけを出力する
  -d       空のトラックを削除する
  -e PMMLソース文字列
           PMMLソース文字列を評価する
  -f {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
           指定された位置から演奏を開始する
  -h       ヘルプメッセージを出力する
  -i file  初期化ファイルの名前を変更する
  -l file  標準MIDIファイルをロードする (-e 'load("file")' に同じ)
  -n       ノート衝突時におけるノートイベントの修正を行わない
  -o file  出力標準MIDIファイルの名前を変更する
  -p       優先度によるイベントのソートを行わない
  -q       初期化ファイルを読み込まない
  -r N     出力分解能を N に設定する (省略時: 480)
  -t {小節数[:ティック], /マーカ, /マーカ/{+,-}小節数[:ティック]}
           指定された位置で演奏を中止する
  -w       警告出力を抑制する
  -F file  PMMLソースファイルを読み込む (-e 'include("file")' に同じ)
  -I dir   dir をソースファイル検索パスの先頭に追加する
  -R       ランニング・ステータス・ルールを適用しない
  -T track,track-track,/trackname/,...
           指定されたトラックだけを出力する

普通に使える感じ。

サンプルをコンパイルしてみる。

$ cd examples
$ pmml menuet1.pml
$ cp menuet1.mid ~/public_html/

で、http://example.com/~tnzk/menuet1.midにアクセスする。ちゃんとメヌエットが聞こえたらおっけー!

トラックバック - http://d.hatena.ne.jp/Tnzk/20090426/1240754684