configure→make→make installなどの直感的な操作だけでビルドできる。
npietは多くの機能のサポートを外し、多くのライブラリをビルドすればビルドできた。
gpsim、zsh、bash、OpenMPI、OpenSSHなどは、がんばってファイルを書き換えたり、ハリボテライブラリを追加したりしても、
ビルドが通らないか、通ってもまともに動作しなかった。(ライブラリがハリボテなので当たり前に近い)
しかし今回のecmは、少しの独自実装(ハリボテではない!)ライブラリの追加とconfigureの書き換えでビルドでき、
おそらくまともに動作している。
その記録をここに記す。
1. ダウンロード
ダウンロードはいたって普通である。
「GMP-ECM」でググって出てきたサイトのReleased Filesというリンクをたどり、
「ecm-6.4.4.tar.gz」というリンクにアクセスするだけである。
2. configure
ここが一番の曲者である。
まずは深く考えず、prefixとGMPのディレクトリを指定し、configureを行った。
すると、isasciiというrequired functionが無いと怒られた。
config.logを見ると、undefined referenceエラーのようである。
そこで、まずはgccのlibsフォルダをgrepで漁ると、isascii関数はlibmsvcrt.aなどに含まれているようである。
(厳密には関数かどうかはわからない)
そこで、LDFLAGSに-lmsvcrtを追加したが、状況は変わらなかった。
LDFLAGSの内容がコンパイルするファイルの前に追加されてしまい、リンク指示には使えないようだ。
そこで、gccをラップするシェルスクリプトを書いて環境変数CCで利用するように指定し、
さらにisasciiを適当に実装したライブラリをリンクするようにした。
gccwrap.sh isalpha.c
int __cdecl isascii (int c) {
return (0x00
#include
int __cdecl strncasecmp_hack(const char *s1, const char *s2, size_t n) {
while((n--)>0) {
unsigned char a=*((unsigned char*)(s1++));
unsigned char b=*((unsigned char*)(s2++));
if(isupper(a))a=tolower(a);
if(isupper(b))b=tolower(b);
if(a>b)return 1;
if(a<b)return -1;
}
return 0;
}
config.logを見ると、正解のオプションである-fopenmpを指定したときは-lpthreadが見つからないと怒られていた。
これは比較的闇である気がしたし、OpenMPのサポートは本質ではないので、OpenMP抜きでビルドを行うことにした。
3. make、make install
以上のハックを行ってconfigureを通したあと、makeを実行すると、
一旦command not foundが出てrecheckがかかったが、その後コンパイルが実行され、見事実行ファイルの生成に成功した。
niceとかfcntlとかの怪しい関数をチェックしていて不安だったが、
syslogとかforkなどの実装が難しい関数は利用されていなかったようだ。
windows.hのチェックもあったし、公式でWindows環境のことも考えられていたのかもしれない。
4. テスト
exeファイルはできたが、まだまともに動くかわからない。動作確認をしよう。
まずはGMP-ECMを紹介している素因数分解プロジェクトへの参加方法の入力例でテスト。
・・・あれ?分解されない。
さらに、「素数を2つ思い浮かべてくさい」の入力でテスト。
・・・やっぱり分解されない。
よく見ると、isasciiで1と判定する範囲が0x20~0x7eになっていた。修正し、バイナリを消してmakeしなおす。
素因数分解プロジェクトへの参加方法の入力例:
やっぱり分解されない。しかし、よく見ると下の2個はサンプル出力でも分解できてないし、運が悪かっただけかも。
「素数を2つ思い浮かべてくさい」の入力:
40桁の数は分解できた。しかし、次の100桁の数は分解できない。
サンプルの90桁でも分解できていないし、100桁を超える数を分解しようとするのはCPUの無駄かもしれない。
[hr]
環境
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM)2Duo T8100 @2.10GHz 2.10GHz
RAM 4.00GB
gcc 4.8.1
MSYS