cpan でBit::Vector をインストールしようとしたらこけた

CPAN になかなかなじめない。大抵インストールこけるから。CPAN がんがん使えるとかっこいいな〜。
ということで、今回もインストールに失敗したのでメモ。

環境
$ cat /etc/redhat-release 
CentOS release 5.2 (Final)

エラー内容

$ sudo cpan -i Bit::Vector

....

make: *** [Vector.o] Error 1
  STBEY/Bit-Vector-6.4.tar.gz
  /usr/bin/make -- NOT OK
CPAN: YAML loaded ok (v0.66)
Running make test
  Can't test without successful make
Running make install
  Make had returned bad status, install seems impossible


make でこける。エラーした箇所をみてみると。以下のようになっていました。

/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/perl.h:496:23: error: unistd.h: No such file or directory


unistd.h がないとか。そんなことあるのか?ということでチェック。

$ locate unistd.h
/usr/include/asm/unistd.h
/usr/include/bits/unistd.h
/usr/include/linux/unistd.h
/usr/include/sys/unistd.h
/usr/lib/syslinux/com32/include/unistd.h
/usr/share/man/man0p/unistd.h.0p.gz


・・・こんなに沢山あるものなのか?でも、unistd.h はあることにはある。
でも、普通「/usr/include/unistd.h」があるものなんじゃないのかなと思いローカルのMac で見てみる。

$ locate unistd.h 
......

/usr/include/sys/unistd.h
/usr/include/unistd.h


あった!
ここで仮説。多分、cpan モジュールをインストールする際に、デフォルトでは「/usr/include」以下にヘッダファイルがあると仮定されている。で、そこにはないのでエラー。

解決策

「/usr/include」以下に「unistd.h」があればいいと予想できるので、シンボリックリンクをはることにしました。でも、あまり良い方法ではないと思う。ヘッダファイルの位置を指定できるオプションとかがあるのだろうか。

$ sudo ln -s /usr/include/linux/unistd.h /usr/include/unistd.h
$ sudo cpan -i Bit::Vector
...
Appending installation info to /usr/lib/perl5/5.8.8/i386-linux-thread-multi/perllocal.pod
  STBEY/Bit-Vector-6.4.tar.gz
  /usr/bin/make install  -- OK


入った。特に問題なく使えました。

感想

入ったには入ったけど、解決策としては微妙。多分、次のように解決するのがいい。

  • 1. 本当は「/usr/include/unistd.h」がある

今回はCentOS をインストールする際に開発ツールなどは何もインストールしなかった。unistd.h が「/usr/include/」下になかったのはこのせいかもしれない。
実際、CentOS 4.4には「/usr/include/unistd.h」がある。

  • 2. ヘッダファイルの位置を指定できる方法がある

これはかなり有力。configure 実行するときとか、make する際にオプションをつけることは多いし、そこでヘッダファイルの位置を指定する方法があると期待できる。


linux は奥が深い。make とか実際中身はよくわかってないからな〜。勉強しなきゃな!