MiniSat on Windows
Windows上でネイティブな(w/o Cygwin)MiniSatを構築しようとして、いろいろ困ったのでメモ。
MinGWを使えばいけると思ったのですが…。
1. makeできない
とりあえず、CとC++のコンパイルできる状態にすればいいかなと思って、CとC++のコンパイラだけインストールしたら、無理でした…。
MSYSというシェル環境(?)にそのあたりのユーティリティがいろいろ入っているようなので、mingw-getでいれました。
mingw-get install msys-base
私の場合は、makeだけいれれば大丈夫かと思って、msys-makeパッケージだけインストールしようとしましたが、sedがないだの、pwdがないだの言われて、無理でした…。
なので、msys-baseパッケージをすべていれてしまいましたが、今調べてみたらmsys-tinyという、最小限のユーティリティだけいれるパッケージがあるようですね。
mingw-get install msys-tiny msys-sed msys-make
とかで、いけるかもしれません。(未確認)
2. MinGWのgccで、zlib.hを使ったプログラムがコンパイルできない
とりあえず、msys-zlibパッケージをいれればいけるかと思ったが、無理…。
MinGWディレクトリ以下をzlibで検索してみると、mingw32-zlib.xmlとmsys-zlib.xmlが見つかりました。
このxmlの構造はよくわかりませんが、とりあえずmingw32-zlib.xmlを読んでみると、mingw32-libzパッケージ配下にdevクラスというものを発見。
libzというエイリアスがついているので、これでインストールできました。
mingw-get install libz
しかし、なんでヘッダファイルのパッケージはlibzなんだ。紛らわしい。
3. メモリの使用制限とかができない
core/Main.ccの中で、getrlimit関数によってCPU使用時間の制限とかメモリ使用量の制限とかしているみたいですけど、そのせいでコンパイルが通りません。
とりあえず、オプションのようですし、コメントアウトして対処。
具体的には、
- 85行目〜86行目あたりのcpu_limとmem_limの宣言
- 99行目あたりの、SIGXCPUシグナルの受信設定
- 101行目〜120行目あたりの、CPUとメモリに関する制限の設定 (if文×2)
- 149行目あたりの、SIGXCPUシグナルの受信設定
をコメントアウトしたらOKでした。
MinGWでもこの辺、別名で対応してたりしないのかな。
simp/Main.ccも同様。
具体的には、
- 25行目あたりの、#include
- 87行目〜88行目あたりのcpu_limとmem_limの宣言
- 103行目あたりの、SIGXCPUシグナルの受信設定
- 105行目〜124行目あたりの、CPUとメモリに関する制限の設定 (if文×2)
- 152行目あたりの、SIGXCPUシグナルの受信設定
をコメントアウト。
4. Minisat::memUsedPeak()が定義されていないといわれる
utils/System.ccの中で、linux環境以外でmemUsedPeakが正しく定義されていないのが原因。
MinGWとか関係なく、defined(__linux__)
な環境以外はコンパイル通らないんじゃないか、ってくらいソースがおかしいです。Minisat
がMiniSat
って書いてあったり。
とりあえず、#else
のところに以下を追加定義して対応。95行目くらいかな。
double Minisat::memUsedPeak(void) { return memUsed(); }
utils/System.hにはMinisat::memUsedPeak()関数に関して、「非対応なら0を返す」って書いてあるので、仕様的にもこれでOKでしょう。
取得できたほうが嬉しいですけど。
5. makeがエラーを吐く
「致命的なエラー」とか「コンパイルを停止しました」とか出てくるのでビビりますが、(実際、直そうといろいろ画策しましたが…)makeが依存関係を完全には認識できないだけのようなので、特に問題はなさそうです。
というか、MSYSのmakeなんだからMSYS上で動かせ、って話なんでしょうね。
ここまでやってREADMEどおりに(但し、コマンドプロンプト用にちょっと変えてますが)
setenv MROOT=C:\Minisat cd core make rs copy minisat_static.exe C:\MinGW\bin\minisat.exe
とかやればOK!
もちろん、MinGWの、.\bin
と.\msys\1.0\bin
にパスを通すことを忘れずに。
ここまで5時間……。余計なことをしてしまったぜ。(笑)
まぁ素直にCygwinを入れるか、Linux環境にしろってことですよね。