04 Dec 2012

CentOS 5 に nvm で node をインストールする際の wrokaround

いまどき CentOS 5 系, しかも nvm は無いだろと思うかもしれませんが, そういう人もいるかもしれないので, インストールするためのもろもろの手順を残しておきます. とてもひどい内容なので注意のこと.

nvm をいれる

ここは困ることはないです

$ git clone git://github.com/creationix/nvm.git ~/nvm
$ . ~/nvm/nvm.sh

いまさら nvm を使おうと思っている人に zsh 使いはいないと思いますが, zsh だと nvm_ls:1: no matches found: vdefault* みたいな warning がでたり remote-ls が動かなかったりしますが, インストールやバージョンの切り替えは一応大丈夫です. ただ nvm は zsh 対応することは無いと思うので素直に nodebrew を使ったほうが良いと思います.

node をインストール

インストールの前に shasum を準備する必要があります. nvm はダウンロードしたバイナリ・コードのチェックに shasum を使っていますが, CentOS には入っていません. 準備しておかないとコマンドが無いよと怒られてしまします.

shasum を新たにインストールしてもいいんですが, sha1sum にエイリアスをはるのが楽だと思います.

$ alias shasum='sha1sum'

この件いちおう pull request は投げてるんですが, たぶん取り込まれないだろうなあ.

次は glibc 対応です. 最近のバージョンの node のバイナリを持ってきてもうまく動きません. glibc が古いからで, こんなエラーがでます

$ nvm install v0.8.14
######################################################################## 100.0%
Now using node v0.8.14
$ node
node: /lib64/libc.so.6: version `GLIBC_2.9' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.6' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.7' not found (required by node)

glibc は 2.5 が入っているようです

$ yum info glibc

Name       : glibc
Arch       : x86_64
Version    : 2.5
Release    : 65.el5_7.1
Size       : 11 M
...

glibc を新しくしてもいいのですが, 今回はバイナリではなくてソースからコンパイルして対応したいと思います. ものすごくしょうもないですが nvm.sh からバイナリをダウンロードしている処理を一時的に除いてあるげことにしました. 203 行目の if で始まるブロックに入らないようにすればなんでも OK です.

diff --git a/nvm.sh b/nvm.sh
index bc42df2..83ad795 100755
--- a/nvm.sh
+++ b/nvm.sh
@@ -201,6 +201,7 @@ nvm()

       # shortcut - try the binary if possible.
       if [ -n "$os" ]; then
+      else
         binavail=
         # binaries started with node 0.8.6
         case "$VERSION" in

これでソースからコンパイルしてのインストールが強制されるようになりました.

次は python です. CentOS 5x に入っている python は例のごとく 2.4 です. node の configure スクリプトは python で書かれているんですが, A if B else c という三項演算子の書き方をしているところがあります. この機能は python 2.5 以降でしか使えないんわけなんですね

$ nvm install v0.8.14
Additional options while compiling:
######################################################################## 100.0%
  File "./configure", line 355
    1 if options.unsafe_optimizations else 0)
       ^
SyntaxError: invalid syntax
nvm: install v0.8.14 failed!

epel に python2.6 があるのでそいつを入れます. まだ epel の設定がない場合は http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/epel-release-5-4.noarch.rpm などから rpm をもってきて入れておいて,

$ sudo yum install python26
$ python26 -V
Python 2.6.8
$ python -V
Python2.4.3

configure スクリプトは /usr/bin/env python とやっているので, /usr/bin/python のシンボリックリンクを一旦切り替えてあげることにしました. (またひどい対応ですが)

$ ls -l /usr/bin/python*
-rwxr-xr-x 2 root root 8304  9月 22  2011 /usr/bin/python
lrwxrwxrwx 1 root root    6  3月  1  2012 /usr/bin/python2 -> python
-rwxr-xr-x 2 root root 8304  9月 22  2011 /usr/bin/python2.4
-rwxr-xr-x 2 root root 4736 11月  7 23:48 /usr/bin/python2.6
-rwxr-xr-x 2 root root 4736 11月  7 23:48 /usr/bin/python26
$ sudo rm /usr/bin/python
$ sudo ln -s /usr/bin/python26 /usr/bin/python

これでビルドが通るようになるかと思います.

$ nvm install v0.8.14
$ node -v
v0.8.14

終わったあとは python のシンボリックリンクをもとに戻しておきましょう

$ sudo rm /usr/bin/python
$ sudo ln -s /usr/bin/python2 /usr/bin/python

まとめ

かなりしょうもない対応をたくさんすることになるので, 素直に, CentOS は 6 系にしましょう. nodebrew をつかいましょう.