Cygwin gcc 4 (-mno-cygwin なし)で SDL の音楽ライブラリ+SDL_mixer を使う

Cygwin gcc (gcc 4) で SDL (音楽ライブラリのみ)と SDL_mixer をコンパイルしたので、作業内容メモを残しておく。

SDL, SDL_mixer ともに Cygwin では -mno-cygwin 前提の configure になっており、CC=gcc-3 ./configure; make で問題なくコンパイルできる。だが、gcc-3 ではなく、gcc (gcc 4, -mno-cygwin なし) を使いたい場合には、これでは問題が生じる。

SDL, SDL_mixer いずれも複数のプラットフォームでコンパイルできるように書かれているので、configure.in を微修正して autogen.sh を実行してやれば、Cygwin gcc4 でもコンパイルできた。

以下、実際におこなった作業を記録しておく。configure.in を修正して autogen.sh 再実行では修正しきれなかった部分は、Makefile を直接編集したりしているが、本来は configure.in で対処すべきだと思う。

このメモの作成時期、使用したバージョンは以下の通り:

SDL-1.2.14 のコンパイル

1.まず展開。

tar xzf SDL-1.2.14.tar.gz cd SDL-1.2.14

2.configure.in を一部書き換える。

80行目あたり:

    *-*-cygwin*)
        # We build SDL on cygwin without the UNIX emulation layer
        # BASE_CFLAGS="-I/usr/include/mingw -mno-cygwin"
        # BASE_LDFLAGS="-mno-cygwin"
        ;;

2467行めあたり:

         CheckDummyVideo
         CheckDiskAudio
         CheckDummyAudio
 #        CheckWIN32
 #        CheckWIN32GL
 #        CheckDIRECTX
        CheckNASM

そして、autogen.sh を実行する。

3.video と events を抑止して configure

いずれも、Cygwin 上では -mno-cygwin 前提のコードが使用されるらしく、 gcc4 ではコンパイルできないみたい。

今回使いたいのは music のみなので、video, events は disable にして しまう。

 ./configure --disable-video --disable-events

ただし、これでも thread 関係でこけることは事前に確認済み。 対処方法はまだ判明していないけど、#ifdef 条件をごまかして pthread つかうようにすればいいのではないかと思っている。

が、ひとまずこれで make する。

4.pthread に差し替え

src/thread/win32 を適当にリネームし、src/thread/pthread を src/thread/win32 にコピーする。

こんなエラーがでる:

 ./src/thread/win32/SDL_sysmutex.c:35:25: error: #if with no expression
 ./src/thread/win32/SDL_sysmutex.c:80:25: error: #if with no expression
 ./src/thread/win32/SDL_sysmutex.c:90:25: error: #if with no expression
 ./src/thread/win32/SDL_sysmutex.c:126:25: error: #if with no expression

#define FAKE_RECURSIVE_MUTEX 1 にしてみた。

5.main をダミーに

dummy/SDL_dummy_main.c におきかえる。

コンパイルできた。ひとまず make install しちゃう。

6.sdl-config をいじる

 $ sdl-config --cflags --libs
 -I/usr/local/include/SDL -Dmain=SDL_main
 -L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows

sdl-config が -mno-cygwin と答える状態のままだと、つぎの SDL_mixier インストール時にまずいので改変する。

 ./sdl-config --cflags --libs
 -I/usr/local/include/SDL
 -L/usr/local/lib -lSDL -lpthread
 
 ./sdl-config --cflags --static-libs
 -I/usr/local/include/SDL
 -L/usr/local/lib -lSDL -liconv -lm -luser32 -lgdi32 -lpthread

SDL_mixer-1.2.11 のコンパイル

これも、 -mno-cygwin をはずす対策が必要。

1.configure.in を修正する。

62行目付近:

    *-*-cygwin*)
        # We build SDL on cygwin without the UNIX emulation layer
        #BASE_CFLAGS="-I/usr/include/mingw -mno-cygwin"
        #BASE_LDFLAGS="-mno-cygwin"
        ;;

で、autogen.sh を実行して、./configure

2.でも、make 時失敗してしまったので Makefile 編集

 EXTRA_CFLAGS =   -I/usr/local/include/SDL   -DHAVE_FORK -DCMD_MUSIC -DWAV_MUSIC -I/usr/local/include -pthread -D_REENTRANT -DMID_MUSIC -DUSE_TIMIDITY_MIDI -I$(srcdir)/timidity
 SDL_CFLAGS = -I/usr/local/include/SDL  
 SDL_LIBS = -L/usr/local/lib -lSDL -liconv -lm -luser32 -lgdi32

これで、make clean; make しなおしていけた。

playmus の動作確認

修正まえの configure では、MIDI の演奏については、Windows Native 機能を利用するように なっていたようだが、今回の修正では Windows native ではなく、timidity を用いるように なっている。

なので、MIDI 演奏のためには、音源ファイルをインストールする必要がある。

たとえば: http://www.i.h.kyoto-u.ac.jp/~shom/timidity/shominst/shominst-0409.zip

shominst-0409.zip を展開して出来るディレクトリ、shominst-0409 をカレントディレクトリに して playmus を実行すると、そこにある timidity.cfg が参照される。

ただし、ダウンロードしてきたままでは、timidity.cfg に書かれているディレクトリ指定が 絶対パスとなっていて、適切に修正してやる必要があった。

ひとまずカレントディレクトリからの相対パスになるように書き換えてやる:

 dir inst/GUS
 dir inst
 dir inst/test

では、C:/Windows/Media にある midi ファイルでも演奏してみよう。

 playmus -i  /cygdrive/c/WINDOWS/Media/onestop.mid

ちゃんと音がなれば成功です。


Generated by UikiTeXi 0.5.3 on Gauche 0.8.12.