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 で対処すべきだと思う。
このメモの作成時期、使用したバージョンは以下の通り:
tar xzf SDL-1.2.14.tar.gz cd SDL-1.2.14
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 を実行する。
いずれも、Cygwin 上では -mno-cygwin 前提のコードが使用されるらしく、 gcc4 ではコンパイルできないみたい。
今回使いたいのは music のみなので、video, events は disable にして しまう。
./configure --disable-video --disable-events
ただし、これでも thread 関係でこけることは事前に確認済み。 対処方法はまだ判明していないけど、#ifdef 条件をごまかして pthread つかうようにすればいいのではないかと思っている。
が、ひとまずこれで make する。
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 にしてみた。
dummy/SDL_dummy_main.c におきかえる。
コンパイルできた。ひとまず make install しちゃう。
$ 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
これも、 -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 しなおしていけた。
修正まえの 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
ちゃんと音がなれば成功です。