lame-3.97をdmcでビルドする

Windows上でdからlameをさわろうとしてlibmp3lame.libをビルドしようと試行錯誤したのでそのメモ。ビルドおよびテストプログラムとのリンクもできたけど、動いてないので未完(1/6 追記:ビルド手順自体は間違っていなかったっぽい)。
VCはオブジェクトファイルのフォーマットが違う(VCはCOFF、dmdはOMF)、bccは未解決シンボルが出る(_fdivとか_turboなんちゃらとか)のであきらめ、dmdと同じくDigitalMarsが出してるdmcなら大丈夫だろうということで、これを用いてビルドすることにする。手順:

  1. nasmを使うのでhttp://sourceforge.net/projects/nasm/からダウンロードし、パスを通す
  2. makeはbccのを使う(Makefile見つかったので)ので、bccのパスがdmcのパスより先に見つかるようにしておく(dmc.exe、lib.exeはbccとかぶらないので問題なし)
  3. Makefileを修正
    • NASMを@-nasmに
    • CCを@-dmc
    • CC_OPTS(のインクルードパス指定以外の部分)を -Nc -Jm -o -ff -DNDEBUG に(参考
    • lib_sources、lib_obj を libmp3lame フォルダの状態に合わせて書き換える(無いファイルを削ったりあるファイルを足したり)
    • ターゲット .c.obj で、 $<が$(CC)のすぐ後に来るように並べ替える(dmcはファイル名の後じゃないとオプション指定を読んでくれないっぽい)
    • ターゲット libmp3lame/libmp3lame.lib で、tlib /a を lib -c に
  4. config.hを修正
    • uint32_tが定義されるようにする(当該箇所の #elif defined(__GNUC__) を #else に変えるとか)
  5. libmp3lame\id3tag.cを修正
    • snprintfをsprintfに変える(当然引数も合うように)

以上。make -fMakefile.B32 とすると、frontendのビルドには失敗するけどlibmp3lame.libはlibmp3lameフォルダにできている。dmdでのテストプログラム(自作)とのリンクも成功。でも動かない。
しかし並べてみると大したことしてないのに、なんかやたら時間を食ったよなあ。そういうもんだというのはわかるけど。

(1/6 追記)なぜかWindows上ではdout.writeLine()が動かなかったのでどこでこけてるのか特定するのに苦労したけど、linux上で動かしてみると、ポインタを渡すところでdの配列を渡していたのがまずかったようで、その後テストプログラムをデバッグしたら少なくとも単純なエンコード・デコードはできるのを確認した。というわけでlameのビルド自体は上記の通りで良かったらしい。