/ NodeJS

[RasPi] Cross Compile NodeJS for RaspberryPi

這篇其實只是筆記一下而已,因為之前一直再做 Cross Compile 總是遇到詭異問題,雖然都有解,但是每次都要找總不是個辦法,所以寫一下筆記以防自己老年痴呆忘記了。

首先請先去買個樹莓派。


事前

我的作業系統是 Ubuntu 12.04LTS,然後這次用的是目前最新的 nodejs-0.8.16,至於 toolchain 的部份請參考這篇:

Node.js for Raspberry Pi

其實上面那篇就已經把全部都交代完畢了,所以我筆記文就到這裡結束吧(打手

實際操作

首先抓下 raspberrypi 所提供的 tool,

git clone git://github.com/raspberrypi/tools.git

從 git 拉下來之後,請在你的 shell 中的 PATH 加入這個東西,

/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin

然後去抓一下這個 shell script 來用,

wget -c https://gist.github.com/raw/3246346/crosscompile.sh

為了怕鍊結失效,所以我這裡備份一下,

#!/bin/sh -e
if [ -z "$HOST" ]; then
    HOST=arm-bcm2708hardfp-linux-gnueabi
fi

export CPP="${HOST}-gcc -E"
export STRIP="${HOST}-strip"
export OBJCOPY="${HOST}-objcopy"
export AR="${HOST}-ar"
export RANLIB="${HOST}-ranlib"
export LD="${HOST}-ld"
export OBJDUMP="${HOST}-objdump"
export CC="${HOST}-gcc"
export CXX="${HOST}-g++"
export NM="${HOST}-nm"
export AS="${HOST}-as"
export PS1="[${HOST}] \w$ "
bash --norc

執行 ./crosscompile.sh 之後,會進入一個 shell,

hinablue at hinablue-HP-ENVY-14-Notebook-PC in ~
$ ./crosscompile.sh
[arm-bcm2708hardfp-linux-gnueabi] ~$

然後就進入你抓下來的 nodejs 原始碼資料夾,執行 configure 來作設定,

[arm-bcm2708hardfp-linux-gnueabi] ~$ cd node-v0.8.16/
/home/hinablue/node-v0.8.16
[arm-bcm2708hardfp-linux-gnueabi] ~/node-v0.8.16$ ./configure --without-snapshot --prefix=/opt/node

就是,我不需要 snapshot,然後目標資料夾是 /opt/node,你可以先建立這個資料夾,然後把 owner 改成你現在的帳號,屆時要 make install 的時候才不會噴錯誤。

[arm-bcm2708hardfp-linux-gnueabi] ~/node-v0.8.16$ ./configure --without-snapshot --prefix=/opt/node
{ 'target_defaults': { 'cflags': [],
                       'default_configuration': 'Release',
                       'defines': [],
                       'include_dirs': [],
                       'libraries': []},
  'variables': { 'armv7': 0,
                 'clang': 0,
                 'gcc_version': 47,
                 'host_arch': 'arm',
                 'node_install_npm': 'true',
                 'node_install_waf': 'true',
                 'node_prefix': '/opt/node',
                 'node_shared_openssl': 'false',
                 'node_shared_v8': 'false',
                 'node_shared_zlib': 'false',
                 'node_unsafe_optimizations': 0,
                 'node_use_dtrace': 'false',
                 'node_use_etw': 'false',
                 'node_use_openssl': 'true',
                 'target_arch': 'arm',
                 'v8_no_strict_aliasing': 1,
                 'v8_use_arm_eabi_hardfloat': 'true',
                 'v8_use_snapshot': 'false'}}
creating  ./config.gypi
creating  ./config.mk

上面就是執行完 configure 之後顯示的東西啦,然後就,

make --jobs=8
make install

然後就打完收工了(喂

由於我是要做 Hard Float Point 的,畢竟由硬體來作效能會好些。而且樹莓派本身的 ARM 也支援 armhf 所以這方面沒有太大的問題。然後,如果你 make 出了問題,這個設定看能不能解,我是可以啦,如果不行可能就是人品問題了

export LD="$CXX"
export LINK="$CXX"
export GYP_DEFINES="armv7=0"
export CCFLAGS='-march=armv6'
export CXXFLAGS='-march=armv6'

結語

最後把 /opt/node 整組拷貝到樹莓派裡面,就可以用了,

pi at raspberrypi in ~
$ node -v
v0.8.16

pi at raspberrypi in ~
$ npm -v
1.1.69

歐,/opt/node 拷貝過去之後 PATH 請自己設定一下啦(啦啦啦啦啦啦啦啦啦