先日、「ソフトウェアのインストールや更新はやっぱりメンドクサイ」という記事を書きましたが、またしてもソフトウェアのインストールで時間を取られてしまいました。Linux用だがWindowsでも使える(とかその逆の)ソフトウェアって、けっこうハマります。
事の発端は、SLOCCount(http://www.dwheeler.com/sloccount/)をWindowsにインストールしてみようと、sloccount-2.26.tar.gz をダウンロード。http://www.dwheeler.com/sloccount/sloccount.html に、Cygwinベースのインストール方法が丁寧に書いてあります。僕はMinGW/MSYSを使ってますが、大差ないだろうと。
早速makeしてみると、flexが足りないようです。いつもの悪い癖で、あんまり考えないでそれらしきアーカイブを探してはとりあえずインストール。GnuWin32の提供しているパッケージの一覧 http://gnuwin32.sourceforge.net/packages.html から http://gnuwin32.sourceforge.net/packages/flex.htm を見つけて Developer files : flex-2.5.4a-1-lib.zip をダウンロードしたんですが、必要なのはflexのlib/* やinclude/* ではなくて、flexコマンドでした。 Binaries : http://gnuwin32.sourceforge.net/downlinks/flex-bin-zip.php のほうから実行可能なflex一式 flex-2.5.4a-1-bin.zip を入手してインストール。
zlibも必要だ、ってんで、http://gnuwin32.sourceforge.net/packages/zlib.htm → http://gnuwin32.sourceforge.net/downlinks/zlib-lib-zip.php とたどって、zlib-1.2.3-lib.zipを入手。
一回目のmakeが失敗した残骸が原因で、
gcc -Wall pascal_count.c -o pascal_count.exe
c:/Installed/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../libmingw32.a(main.o):main.c:(.text+0x104): undefined reference to `WinMain@16'
collect2: ld returned 1 exit status
make: *** [pascal_count.exe] Error 1
なんてエラーが出てしばし悩んでいました。Makefileの書き方を工夫すれば回避できるでしょうが、まー残骸に気付かなかった僕も悪い、と。
ここで、MinGW/MSYSの問題点に触れておくと、パッケージマネージャとか統合されたアーカイブサイトがないんですよね。http://gnuwin32.sourceforge.net/ と http://sourceforge.net/projects/mingw/ にアーカイブがありますが、同じものが重複しているのか違う品揃えなのかよくわかりません。ダウンロードした後、どうやってインストールするか一律に決まっているわけでもないようです。僕は全部手作業でやりましたが、自由度がある反面、とても面倒で時間がかかります。
MinGW/MSYSでは、gccとGNU Autotoolsを使う最小限のビルド環境をMinGWが提供し、それ以上のツールやソフトウェアはMSYSが受け持つ建前です。が、境界線は曖昧です。flexはMinGW側に入れた(/mingw/bin/flex.exe)のですが、後述のPerlはMSYS用だったのでMSYS側(/bin/perl.exe)に入れました。ライブラリファイルも .a、.lib、.dllがあり、配置する場所に気を付けないとうまく見つけられなかったりします。ああーメンドクサイ。
さて、sloccountのコンパイルはできたのですが、make -n install してみると、たくさんの実行ファイルを /usr/local/bin/ にコピーするようです。
install \ ada_count \ asm_count \ awk_count \ break_filelist \ cobol_count \ compute_all \ compute_sloc_lang \ count_extensions \ count_unknown_ext \ csh_count \ exp_count \ fortran_count \ f90_count \ generic_count \ get_sloc \ get_sloc_details \ haskell_count \ lex_count \ lisp_count \ make_filelists \ makefile_count \ modula3_count \ objc_count \ perl_count \ print_sum \ python_count \ ruby_count \ sed_count \ sh_count \ show_filecount \ sloccount \ sql_count \ tcl_count \ c_count.exe \ java_count.exe \ lexcount1.exe \ pascal_count.exe \ php_count.exe \ jsp_count.exe \ ml_count.exe \ /usr/local/bin install -d /usr/local/share/man/man1 install sloccount.1.gz /usr/local/share/man/man1 install -d /usr/local/share/doc/sloccount-2.26-1 install sloccount.html README TODO ChangeLog /usr/local/share/doc/sloccount-2.26-1
MinGW/MSYSだと、/usr/local/ は(デフォルトでは)使わないのですよね。/usr/local/bin/ とか作ればいいのですが、ナントカbin/ になんでも詰め込むのはイヤなので、sloccountコマンド群は /usr/local/sloccount/ に入れることにしました。
sloccountには、Perlスクリプトもあるのですが、それらは #!/bin/perl で始まっています。/bin/perl はありません。Windows用のActivePerlがあるので、シンボリックリンクを張ってみました。ところが、MinGW/MSYSでは、ln -s としても豪快に丸ごとコピーするのです。それでも動けばいいのですが、やっぱりうまく動きませんわ。
http://sourceforge.net/projects/mingw/files/MSYS/Extension/perl/ から perl-5.8.8-1-msys-1.0.17-bin.tar.lzma をダウンロード。拡張子 .lzma がなんだかワカリマセン。tar tvf perl-5.8.8-1-msys-1.0.17-bin.tar.lzma --lzma とか、お尻に--lzmaオプションを付けると扱えるようです。フム。
MSYSの /usr/ 以下にPerlをインストールして、/bin/perl が使えると思ったら、cryptのDLLがないとか言ってるし。http://sourceforge.net/projects/mingw/files/MSYS/Extension/crypt/ から libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma をダウンロードしてインストール。/bin/perl が起動できる。フー。
これでやっとsloccountが動くようになりました。sloccountは、ソースコードのサイズから掛け算と割り算して、人月だの値段だのを出してくれるという、役に立つんだかジョークなんだか分かんないツールですが、Catyのソースコードを測ってみましょう。
$ sloccount .
Creating filelist for caty
Creating filelist for lib
Creating filelist for test
Categorizing files.
Finding a working MD5 command....
Found a working MD5 command.
Computing results.
SLOC Directory SLOC-by-Language (Sorted)
28923 caty python=28923
5964 lib python=5964
2351 test python=2351
Totals grouped by language (dominant language first):
python: 37238 (100.00%)
Total Physical Source Lines of Code (SLOC) = 37,238
Development Effort Estimate, Person-Years (Person-Months) = 8.92 (107.09)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 1.23 (14.77)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 7.25
Total Estimated Cost to Develop = $ 1,205,528
(average salary = $56,286/year, overhead = 2.40).
SLOCCount, Copyright (C) 2001-2004 David A. Wheeler
SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL.
SLOCCount comes with ABSOLUTELY NO WARRANTY, and you are welcome to
redistribute it under certain conditions as specified by the GNU GPL license;
see the documentation for details.
Please credit this data as "generated using David A. Wheeler's 'SLOCCount'."$
開発費 $ 1,205,528、だいたい1億円と評価。ふーん。