AppVeyorを使うとWindows環境での自動テストができるそうなのでJNetHackで試してみた結果を記す。
(これはRoguelike Advent Calendar 2017 25日目の記事です。)
AppVeyorとは
AppVeyorはよくある「GitHub(とか)にpushすると自動でテスト実行してくれるサイト」の一つなのだけど、他のサイトと違ってWindows環境でテストしてくれるのが大きい。よくあるサイトと同様OSSなら無料で使えるのもありがたい。
JNetHackをビルドしてみる
JNetHackは現状CircleCIを使ってLinux環境での自動ビルドテストをしている(ビルドが通るかだけ確認している; (J)NHで単体テストとかかなり難しいし)のだけど、Windows環境でもやってもらえるならありがたいので試してみることにする。
使い方自体は省略して、GUIで色々試行錯誤しながら、ビルド出来るようになった設定ファイルはこんな感じ:
version: 1.0.{build}
branches:
only:
- nhsetup
image: Visual Studio 2013
before_build:
- cmd: echo done | sys\winnt\nhsetup.bat
build:
project: build\NetHackW.vcxproj
verbosity: minimal
いくつか注意点:
- (J)NetHack 3.6.0 の対応ビルド環境はVS2013なのでこれを選択する。
- ビルド前に単にnhsetup.batを実行してしまうと最後のpauseで止まってしまうので、echoで標準入力から情報を送って突破する。
- ただ、nhsetup.batはVS2013 Expressにしか対応していない。AppVeyorの環境はCommunityなのでnhsetup.batにパッチを当てる必要がある。自分の環境もCommunityなのでこのパッチは事前にしてあったので
nhsetup
ブランチとしてpushした。 - どのブランチをビルドするかはGUIの"General"のタブにあるのだけど、ここの"Default Branch"と"Branches to build"の使い分けがよく分からない。両方とも
nhsetup
を設定する必要があった。 - (J)NetHackは複数のプロジェクトファイルに分割されているので、どのプロジェクトをビルドするかを指定する必要がある。これが"Build"タブの"Visual Studio solution or project file"。プロジェクト名を指定したいところだけどファイル名が必要らしい。
結果
この設定ファイルでビルド自体は動作するようになったのだけど、完遂はせず。ログを見てみると:
write.c
c:\projects\jnethack-alpha\src\write.c(275): warning C4129: '' : unrecognized character escape sequence [C:\projects\jnethack-alpha\build\NetHackW.vcxproj]
...
という感じの大量の警告と、ところどころ
trap.c
c:\projects\jnethack-alpha\src\trap.c(2009): error C2001: newline in constant [C:\projects\jnethack-alpha\build\NetHackW.vcxproj]
というエラーが。
理由
これは要するにいわゆる「0x5c問題」で、日本語版のVCならShift_JISを受け付けるのだけど、当然AppVayorにインストールされているVCは英語版なのでそのままではSJISのソースを受け付けない。そして周知の通りJNetHackはソースがShift_JISである必要がある。さてどうしよう。
解決(?)法
ありがちなやつだし何か回避法ないかな、と検索してみたら日本語を含むC++のプロジェクトをAppVeyorでビルドしたらはまったを発見。オプションに/source-charset:.932
を指定すればいいらしい。
これで解決…と思ったらそのページにリンクがあったVisual C++(cl.exe)で UTF-8 のファイルをコンパイルするを見てみると…:
記事の対象バージョンは Visual Studio 2015 となっています。
Visual Studio 2013 以前のバージョンにはこれらのオプションは存在しません。
がっくり。
今後
ということで残念ながら今回は使えなかったのだけど、今後の展開として:
- GitHub上のNetHackのソースにはVS2015/2017用の設定ファイルがコミットされているので、これをJNetHackに移植すれば使えるようになる。というか既にVS2010/2013用の設定ファイルは削除されているのでいずれやらないといけない。
- JNetHack FHS patchはMinGWベースでビルドしていて、AppVayorはMinGWに対応しているので、こちらでなんとかすると言う手もある。
という手はある。その内に試してみたい。