cppref をCygwin@WindowsXPに入れたお。

プログラミング言語が普及するかどうかは,そのドキュメントおよびリファレンスをいかに素早く参照できるかどうかにかかっている。

とは,かのwhitypigさんの遺言(死んでへんちゅーねん)ですが,
皆様いかがお過ごしでしょうか。
ワタシはというもの,涼しくなってきて,うれしい限りでございます。

Cygwin on Windows XP SP3 に cppref を入れたおメモ

なぜかC++をおっぱじめるという荒行に出たわけでして,
そろそろドキュメント環境を整えたいなと思いまして,
此度,cpprefというスーパーウルトラ級に便利なツールを
インストールした次第ですが,これが結構はまって,時間がかかったので,
そのときのメモを残しておこうということを企てたのでござる。にんにん。
絶対現実逃避じゃないからね。ほんとだよ。

ソースコードのダウンロード

http://github.com/kazuho/cppref の右上の「Download Source」から。
ほいで,伸張します。
このときは,make して make install で完了ばかりだと思ってたさ−。

Makefile がない・・・だと?

なんかないので,キーボードの一番上のキーをよく使うperlという言語を使って
作るみたいです。

% perl Makefile.PL
# なんかいろいろ怒られる。

CPAN っておいちいの?

Makefileを作るのに必要なモジュールが足らんらしいので,
CPANというのを使ってインストールすることに。
ワタシのスタックはすごーく小さいので,すでに本来の目的を忘れつつある。
おれはただ,cpprefというのをインストールしたかっ・・た。

cygwin 上で作業します。
% cpan

とすれば,色々でてきて,色々できるようになりました。
初めて使いました。えぇ,世間知らずもいいとこですよ。
ほいで,

install Module::Install

だっけな? して,依存関係を解消していくために色々インストールしていき,
途中で errno=11 みたいなんがいっぱいでてきたので,
C-c押しっぱなしで終了。
ググると,例の rebaseall をすれば解消するみたい。
MeadowCygwin などをすべて終了して,コマンドプロンプト立ち上げて,
ash して,/bin/rebaseall した。
したけど,なんか権限関係でスキップしてたので,なにくそとばかりに,
文句の対象を,chmod 777 してやった。
でも,だめ。なので,Windowsを再起動。ほいで,再度チャレンジ。
なんとかうまくいく。

まだまだ続くよ,CPAN

install Module::Install して,よくわからんので,片っ端からインストールしていきます。
といっても,デフォルトがyesなので,noと言えない日本人なwhitypigさんは,
yes! we can! とばかりにyesを選択してきます。


ほいで,テレビを見ながら様子を見つつ,機を見てenterして,終わりを待つ。
終わった。うそ,終わってない。
えーとなんだっけなぁ。
そうそう,

cpan[1]> install Module::Install::ReadmeFromPod

とか,

cpan[2]> install File::ShareDir File::Slurp 

こんなんを実行します。
それから,これもしてみた。意味はわかっとらんですたい!

cpan[3]> install ExtUtils::MakeMaker

さてこれで必要なもんは揃っているはず。きっと。
結構な時間かかりましたんよ。
うち,perlもその慣習,文化も知らんから大変。
READMEもついてないから大変。

perl Makefile.PL をします。

やっとMakefileを作る準備が整いました。

% perl Makefile.PL
include /home/whitypig/src/cppref/kazuho-cppref-44dfe39/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/Makefile.pm
include inc/Module/Install/ReadmeFromPod.pm
Writing README from cppref
include inc/Module/Install/External.pm
include inc/Module/Install/Can.pm
Locating required external dependency bin:w3m... found at /usr/bin/w3m.
include inc/Module/Install/Scripts.pm
include inc/Module/Install/Share.pm # <-- これが阿呆みたいに時間がかかった。ハングしてるかと思った。
include inc/Module/Install/Include.pm
include inc/ExtUtils/MakeMaker.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Fetch.pm
Writing Makefile for cppref
Writing META.yml

これでやっとMakefileができましたよっと。

ささっとmake。

echo $? してみたら,0。ほう。
いけたのか?

make test が7個中6個こけた。

% make test
cp cppref blib/script/cppref
/usr/bin/perl.exe "-Iinc" "-MExtUtils::MY" -e "MY->fixin(shift)" blib/script/cppref
/usr/bin/perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.t
t/00base.t .. no document found for: start
t/00base.t .. 1/7 
#   Failed test 'top page'
#   at t/00base.t line 6.
#          got: '256'
#     expected: '0'
no document found for: stl/vector/push_back

## 長いので一部省略

#   Failed test 'multiple choices'
#   at t/00base.t line 12.
#          got: '256'
#     expected: '0'
# Looks like you failed 6 tests of 7.
t/00base.t .. Dubious, test returned 6 (wstat 1536, 0x600)
Failed 6/7 subtests 

Test Summary Report
-------------------
t/00base.t (Wstat: 1536 Tests: 7 Failed: 6)
  Failed tests:  1-5, 7
  Non-zero exit status: 6
Files=1, Tests=7,  3 wallclock secs ( 0.05 usr  0.02 sys +  1.25 cusr  2.28 csys =  3.59 CPU)
Result: FAIL


なので,よくわからんが,t/00base.t がテストなんだろうと思い,
中身を見てみた。やっていることは,なんとなくわかった。
けど,なぜこけるかがわからん。

そんなときは,気にしない気にしない(あっ,どうも一休さん)

南無三的に,make install してみる。

% make install
Installing /usr/share/man/man1/cppref.1
Installing /usr/share/man/man3/App.Cppref.3pm
Installing /usr/bin/cppref
Appending installation info to /usr/lib/perl5/5.10/i686-cygwin/perllocal.pod

試してみる。

% cppref
no document found for: start

あら,やっぱり。

cppref の中身を,perlを知らないくせに,見てみる。

そういえば,make install のログには,肝心なhtmlファイルをコピーした
形跡はないぞ。(なんかのフラグが立ちました!)
ほいで,マルタイの中身を一部抜粋。

my $doc_dir = $ENV{CPPREF_DOCROOT} || '';
if (! $doc_dir) {
    eval {
	$doc_dir = File::ShareDir::dist_dir('cppref');
    };
}

ま,ファイルが見つからんと言っているわけだから,探している部分があるだろうと。
ほいで,そのドキュメントルートを取得している部分が上の部分だろうと。
ENV と言っているくらいだから,環境変数だろうと。
環境変数で設定されてなかったら,dist_dir()という関数?メソッド?メンバ関数?
で,なんかを取得していると。


なので,

% ls
Changes        META.yml  Makefile.PL  blib    cppref-0.08  inc  make.install.log  pm_to_blib  tools
MANIFEST.SKIP  Makefile  README       cppref  doc          lib  orig              t

% CPPREF_DOCROOT=./doc cppref push_back

してみると,

You are here: C++ Reference >> Search results

  * stl >> deque >> push_back
  * stl >> list >> push_back
  * stl >> vector >> push_back
  * string >> push_back

キタコレ!!
ま,そりゃそうなんだわさ。
肝要なドキュメントをどこにもコピーしてないんだもん。
Not Found で当然だわさ。
あ,ビスケ師匠,わざわざすんません。連載早めに再開してください。
ワンピースの中の人と比較されちゃいますよ。

障壁は2つ

1つは,CPANでパチパチやる作業。
これは,最悪Windowsの再起動を伴うので,非常にやっかい。
Cygwinの問題らしい。
もう1つは,ドキュメントをどこに配置するか。
これは自分で場所を決めて,bashrc なり,zshrcなりに,
export CPPREF_DOCROOT='somewhere/to/the/document/root'
しておけば,いいでしょう。

まとめ

非常にお腹いっぱい。
気づいたけど,cpprefは,perl使い専用ツールだったりする?
ま,非常に時間がかかったのは,
当方の知識不足であることに起因するものですね。


それから,Emacs内から,M-x cppref できるelispがあるみたいだから,
それを導入する予定。


なんにせよ,非常によき環境ができつつあります。
作者様に感謝です。ありがとう!