引越し前のブログにも書いたけど、node.jsの最新バージョンをインストールすると発生するエラー

こんなメッセージ
gyp: name 'arm_version' is not defined while evaluating condition 'arm_version==7' in /home/pi/node-v0.11.13/deps/v8/tools/gyp/v8.gyp while loading dependencies of /home/pi/node-v0.11.13/node.gyp while trying to load /home/pi/node-v0.11.13/node.gyp

こいつはnodebrewを使ってインストールしなくても発生してる問題で、nodebrewを使わずインストールする場合は簡単に対処が出来るのだけど、nodebrewの場合どうやって対処するのか調べてみた。

まず、nodebrewを使わずに対処する場合、common.gypiファイルというファイルをnodejsのv0.11.13ディレクトリから見つけて下記パラメータを14行目に追記すればmakeが通るようになる。


 'arm_version%' : '1',
 

 じゃあnodebrewの場合はどうやるの?って話になるのだけど
pi@raspberrypi ~/.nodebrew/node $ cd 色々検証してみた結果をメモしておく。
結論だけ見たい時はすっ飛ばして下を見れば良い。

最新バージョンのインストールを試みる
$ nodebrew install v0.11.13
エラー発生
{ 'target_defaults': { 'cflags': [],
                       'default_configuration': 'Release',
                       'defines': ['OPENSSL_NO_SSL2=1'],
                       'include_dirs': [],
                       'libraries': []},
  'variables': { 'arm_float_abi': 'hard',
                 'arm_fpu': 'vfpv3',
                 'arm_neon': 0,
                 'arm_thumb': 0,

~ 省略 ~
 
                 'v8_random_seed': 0,
                 'v8_use_snapshot': 'true'}}
creating  ./config.gypi
creating  ./config.mk
gyp: name 'arm_version' is not defined while evaluating condition 'arm_version==7' in /home/pi/.nodebrew/src/v0.11.13/node-v0.11.13/deps/v8/tools/gyp/v8.gyp while loading dependencies of /home/pi/.nodebrew/src/v0.11.13/node-v0.11.13/node.gyp while trying to load /home/pi/.nodebrew/src/v0.11.13/node-v0.11.13/node.gyp
Error running GYP
/usr/bin/python tools/gyp_node.py -f make
gyp: name 'arm_version' is not defined while evaluating condition 'arm_version==7' in /home/pi/.nodebrew/src/v0.11.13/node-v0.11.13/deps/v8/tools/gyp/v8.gyp
make: *** [out/Makefile] Error 1

エラーメッセージを見ると.nodebrewディレクトリ直下にsrcというディレクトリがあってその中に落としてきたnode.jsのソースがあるようなのでまずは開いてみる
$ cd .nodebrew/src/v0.11.13/node-v0.11.13/
$ ls -l
total 344 -rwxr-xr-x 1 pi pi 498 May 2 00:49 android-configure -rw-r--r-- 1 pi pi 20562 May 2 00:49 AUTHORS drwxr-xr-x 10 pi pi 4096 Jul 2 09:37 benchmark -rw-r--r-- 1 pi pi 61 May 2 00:49 BSDmakefile -rw-r--r-- 1 pi pi 148883 May 2 00:49 ChangeLog -rw-r--r-- 1 pi pi 8497 May 2 00:49 common.gypi -rw-r--r-- 1 pi pi 1695 Jul 2 09:39 config.gypi -rw-r--r-- 1 pi pi 155 Jul 2 09:39 config.mk -rwxr-xr-x 1 pi pi 21389 May 2 00:49 configure -rw-r--r-- 1 pi pi 4616 May 2 00:49 CONTRIBUTING.md drwxr-xr-x 10 pi pi 4096 Jul 2 09:38 deps drwxr-xr-x 4 pi pi 4096 Jul 2 09:38 doc drwxr-xr-x 2 pi pi 4096 Jul 2 09:38 lib -rw-r--r-- 1 pi pi 39874 May 2 00:49 LICENSE -rw-r--r-- 1 pi pi 11545 May 2 00:49 Makefile -rw-r--r-- 1 pi pi 17825 May 2 00:49 node.gyp -rw-r--r-- 1 pi pi 2395 May 2 00:49 README.md drwxr-xr-x 3 pi pi 4096 Jul 2 09:38 src drwxr-xr-x 12 pi pi 4096 Jul 2 09:38 test drwxr-xr-x 10 pi pi 4096 Jul 2 09:38 tools -rw-r--r-- 1 pi pi 8077 May 2 00:49 vcbuild.bat
common.gypiがある!ってことでまずは最初に書いたarm_versionうんちゃらを記述する処置を行ってみる。

14行目

 'arm_version%' : '1',
 


この状態で再度nodebrewコマンド実行してみたらやっぱり止まってしまった。
どうやら、毎回落としてダウンロードして解凍でもしてるのか記述した内容を上書きして元の状態に戻してしまうみたい。

って事でnodebrewコマンドが何をやっているのかを見てみる。
幸いnodebrewコマンドはperlで書かれているので読める。
installという文言を検索していくとインストール処理を行っているらしい箇所を発見

88行目
sub _cmd_install {
    my ($self, $args) = @_;

    my $version = $self->find_install_version($args->[0]);
    my $tarball_url = $self->get_tarball($self->{tarballs}, $version);
    my $src_dir = "$self->{src_dir}/$version";
    my $target_name = "node-$version";
    my $tarball_path = "$src_dir/$target_name.tar.gz";

    $self->clean($version);
    mkdir $src_dir;

    print "fetch: $tarball_url\n";
    $self->{fetcher}->download($tarball_url, $tarball_path)
        or error_and_exit("download faild: $tarball_url");

    Nodebrew::Utils::extract_tar($tarball_path, $src_dir);

    system qq[
        cd "$src_dir/$target_name" &&
        ./configure --prefix="$self->{node_dir}/$version" &&
        make &&
        make install
    ];
}

ここでやっている事を手動でやれば、、、ってことで試してみる。

もう一度common.gypiファイルに1行追加

14行目
 'arm_version%' : '1',

コマンドを実行していく。
$ cd /home/pi/.nodebrew/src/v0.11.13/node-v0.11.13
$ ./configure --prefix="/home/pi/.nodebrew/node/v0.11.13"
今度はエラーもなく完了した!
$ make && make install
さて、4時間待つのか・・・。
さて次の日、会社に来て見てみた結果は。。。
ダメだったorz
SSHが切断されたのが原因なのかな?
途中でmakeが終わってるぽいのと画面が消えちゃってるので何があったのか確かめられない。。。
ってか何かRaspberryPIがおかしい。突然SSHがブチブチ切れる。
こっちの原因も気になるけどとりあえず。。。

ってことで、nodebrewコマンド挙動を書き換える事にした。

.nodebrew/nodebrewを開いてみると毎回ディレクトリ単位で消したあと、ダウンロードして解凍後に実行している事が分かる。

88行目あたり
sub _cmd_install {
    my ($self, $args) = @_;

    my $version = $self->find_install_version($args->[0]);
    my $tarball_url = $self->get_tarball($self->{tarballs}, $version);
    my $src_dir = "$self->{src_dir}/$version";
    my $target_name = "node-$version";
    my $tarball_path = "$src_dir/$target_name.tar.gz";

    $self->clean($version);
    mkdir $src_dir;

    print "fetch: $tarball_url\n";
    $self->{fetcher}->download($tarball_url, $tarball_path)
        or error_and_exit("download faild: $tarball_url");

    Nodebrew::Utils::extract_tar($tarball_path, $src_dir);

    system qq[
        cd "$src_dir/$target_name" &&
        ./configure --prefix="$self->{node_dir}/$version" &&
        make &&
        make install
    ];
}

ならば、と言うことで
$ nodebrew install v0.11.13
とやって、一度綺麗な状態に戻して、arm_versionのエラーで停止させた後

.nodebrew/src/v0.11.13/node-v0.11.13/common.gypi を開いて
 
  'arm_version%' : '1',
 

を追記。
その後、nodebrewコマンドを書き換える。
上で黄色で示した箇所をコメントアウトする。
    $self->clean($version);
    ↓に変更
#    $self->clean($version);
-----------------------------------------------------------
    $self->{fetcher}->download($tarball_url, $tarball_path)
        or error_and_exit("download faild: $tarball_url");
    ↓に変更
#    $self->{fetcher}->download($tarball_url, $tarball_path)
#        or error_and_exit("download faild: $tarball_url");
-----------------------------------------------------------    Nodebrew::Utils::extract_tar($tarball_path, $src_dir);
    ↓に変更
#    Nodebrew::Utils::extract_tar($tarball_path, $src_dir);

再度実行!

$ pi@raspberrypi ~ $ nodebrew ls
v0.10.23
v0.10.24
v0.11.13

current: v0.10.24
pi@raspberrypi ~ $ 

出来た。。。疲れた。。。
でも、、まだ終わりじゃないんだな~

続きは来週やな。。 

続き