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. MinGWgccで、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__)な環境以外はコンパイル通らないんじゃないか、ってくらいソースがおかしいです。MinisatMiniSatって書いてあったり。
とりあえず、#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環境にしろってことですよね。