Ruby をDebian x86から ARM ABI にクロスコンパイル

クロスコンパイルは初心者なのでイケてない方法でコンパイルしてる可能性が高いですが・・・

# 環境
- ターゲットのruby のバージョンは2.0.0系
- Debian のバージョンは6.0.10 でした
- arm-linux-gnueabiXXX 系のコマンドを先にインストールする必要があります
- 環境は /media/mmc (SDカード配下)で動作するように作成

# 方針

- なるべく最新をインストール
- 困ったら aptitude show <パッケージ名> でクロスコンパイル環境のdebian にインストールされているバージョンを確認して、そのバージョンに近いバージョンをインストール
- ./configure --help を確認して 利用可能なら --build --host と --prefix を指定 後は色々

# コンパイル
## 前準備

```
mkdir /media/mmc
mkdir /media/mmc/src
cd /media/mmc/src
```

## ncurses
```
wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.9.tar.gz
tar zxvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
make
make install
```

## libffi

```
wget ftp://sourceware.org/pub/libffi/libffi-3.0.13.tar.gz
tar zxvf libffi-3.0.13.tar.gz
cd libffi-3.0.13
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
make
make install
ln -s /media/mmc/lib/libffi-3.0.13/include/* /media/mmc/include
# ↑ヘッダーをリンクしておく
```

## readline
```
wget ftp://ftp.gnu.org/gnu/readline/readline-6.1.tar.gz
tar zxvf readline-6.1.tar.gz
cd readline-6.1
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
```

## zlib
openssl の前にコンパイルする必要がある

```
wget http://zlib.net/zlib-1.2.8.tar.gz
CC=arm-linux-gnueabi-gcc LDSHARED="arm-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1" ./configure --prefix=/media/mmc --shared
make
make prefix=/media/mmc install
```

## openssl

```
wget https://www.openssl.org/source/openssl-1.0.2a.tar.gz
tar zxvf openssl-1.0.2a.tar.gz
cd openssl-1.0.2a
./Configure --prefix=/media/mmc --openssldir=/media/mmc/etc threads zlib shared no-asm linux-armv4 -I/media/mmc/include -L/media/mmc/lib
export cross=arm-linux-gnueabi-
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib" install
```

## libyaml

```
wget http://pyyaml.org/download/libyaml/yaml-0.1.5.tar.gz
tar zxvf libxml2-2.9.2.tar.gz
cd libxml2-2.9.2
./configure --help
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
make
make install
```


## libxml

```
wget ftp://xmlsoft.org/libxml2/libxml2-2.7.8.tar.gz
tar zxvf libxml2-2.7.8.tar.gz
cd libxml2-2.7.8
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
make
make install
```

## sqlite

```
wget https://www.sqlite.org/2015/sqlite-autoconf-3080900.tar.gz
tar zxvf sqlite-autoconf-3080900.tar.gz
cd sqlite-autoconf-3080900
./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu
make
make install
```

## ruby

確か``` --with-out-ext```を指定すると標準添付ライブラリもコンパイルしてくれる気がする

```
wget http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p643.tar.gz
tar zxvf ruby-2.0.0-p643.tar.gz
cd ruby-2.0.0-p643
CFLAGS="-I/media/mmc/include" LDFLAGS="-Wl,-rpath-link=/media/mmc/lib -L/media/mmc/lib -L/usr/arm-linux-gnueabi/lib" ./configure --prefix=/media/mmc --host=arm-linux-gnueabi --build=i686-pc-linux-gnu --with-baseruby=ruby --disable-install-rdoc --with-out-ext="*dbm,tk,win32ole" --disable-ipv6
make
make install
```

```
ruby library version = 2.0.0
configure: creating ./config.status
config.status: creating Makefile
config.status: creating ruby-2.0.pc
configure: WARNING: unrecognized options: --disable-ipv6
```
--disable-ipv6オプションで警告が出るが無視して良い

# 追記
rails を使いたかったのだが、gem execjs がnodejs を要求しておりasset pipeline を使うためにはnodejs 等が必要

```
wget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gz
tar zxvf node-v0.8.9.tar.gz
node-v0.8.9
./configure --without-snapshot --dest-cpu=arm --dest-os=linux
```

下記のようなエラーが出るのでコメントアウト
```
'For thumb inter-working we require an architecture which supports blx'
```

```
CC="${cross}gcc" CXX="${cross}g++" AR="${cross}ar" LINK="${cross}g++" RANLIB="${cross}ranlib" make install
```



# 参考にさせて頂いたサイト
http://blog.kmckk.com/archives/3867590.html
http://www.yoovant.com/how-install-node-js-0-8-arm-based-sbc-fox-board-g20/