Sarge de ARM CROSS

今Sarge上で使っているtoolchainは回収して環境を再構築できるようにして、再配布できるようにソースも集めて、それでも足りないものは作ったりしたのだけど、バージョンはいかにも古くて、バグリポートも上がっているものが多く、ちょっと使えない。
こんなのもらってもうれしい人いないし。
おまけに今日はそれらの由来も判明してかなりがっかり... orz


Etchと違ってSargeならarm-linux-なんたらでやれるんじゃないかと思って、dokg-crossを一通り試す。
しかし、dpkg-crossでは以下の5つが自動生成できなかった。

cpp-3.4-arm-cross_3.4.3-13sarge1_all.deb
g++-3.4-arm-cross_3.4.3-13sarge1_all.deb
gcc-3.4-base-arm-cross_3.4.3-13sarge1_all.deb
libstdc++6-0-pic-arm-cross_3.4.3-13sarge1_all.deb
libc6-dbg-arm-cross_2.3.2.ds1-22sarge6_all.deb

それに、やっぱりgccの関係で、arm-linux-gnu-なんたらでやらないとダメみたいだ。


SlindベースでSargeをアップデートして、必要なものを入れる。
コンパイル可能かどうかテスト。

makai:~# vi hello.c
#include <stdio.h>

int main(void)
{
    printf("hello, world\n");
    return 0;
}
makai:~# arm-linux-gnu-gcc-3.4 hello.c
makai:~# ./a.out
-su: ./a.out: cannot execute binary file
makai:~# file a.out
a.out: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped
makai:~# rm hello.c a.out

バイナリはできている。


パッケージはというと、ビルドできずに失敗する。

makai:~# apt-get build-dep grep
makai:~# apt-get source grep
makai:~# cd grep-2.5.1.ds1/
makai:~/grep-2.5.1.ds1# dpkg-buildpackage -uc -us -aarm
(略)
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets ${MAKE}... yes
checking build system type... i386-pc-linux-gnu
checking host system type... arm-unknown-linux-gnu
checking for gawk... (cached) gawk
checking for arm-linux-gcc... arm-linux-gcc
checking for C compiler default output... configure: error: C compiler cannot create executables
make: *** [config.status] Error 77
make: Leaving directory `/root/grep-2.5.1.ds1'

arm-linux-gccを呼んでしまっている。
これって、確か、dpkg-architectureの吐く結果をパースしているだけのはずだ。

makai:~/grep-2.5.1.ds1# dpkg-architecture -aarm
dpkg-architecture: warning: Specified GNU system type arm-linux does not match gcc system type i386-linux.
DEB_BUILD_ARCH=i386
DEB_BUILD_GNU_CPU=i386
DEB_BUILD_GNU_SYSTEM=linux
DEB_BUILD_GNU_TYPE=i386-linux
DEB_HOST_ARCH=arm
DEB_HOST_GNU_CPU=arm
DEB_HOST_GNU_SYSTEM=linux
DEB_HOST_GNU_TYPE=arm-linux

正解。
これが悪い。
arm-linux-gnuと出してくれないとだめだ。
dpkg-architectureは単なるスクリプトファイルだったはずなので中を見る。

makai:~/grep-2.5.1.ds1# which dpkg-architecture
/usr/bin/dpkg-architecture
makai:~/grep-2.5.1.ds1# file /usr/bin/dpkg-architecture
/usr/bin/dpkg-architecture: perl script text executable
makai:~/grep-2.5.1.ds1# vi /usr/bin/dpkg-architecture
	%archtable=('i386',             'i386-linux',
	            'arm',              'arm-linux-gnu',

変更して試す。

makai:~/grep-2.5.1.ds1# dpkg-architecture -aarm
dpkg-architecture: warning: Specified GNU system type arm-linux-gnu does not match gcc system type i386-linux.
DEB_BUILD_ARCH=i386
DEB_BUILD_GNU_CPU=i386
DEB_BUILD_GNU_SYSTEM=linux
DEB_BUILD_GNU_TYPE=i386-linux
DEB_HOST_ARCH=arm
DEB_HOST_GNU_CPU=arm
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=arm-linux-gnu

出るようにはなった。


ビルドのテスト。

makai:~/grep-2.5.1.ds1# debian/rules clean
makai:~/grep-2.5.1.ds1# dpkg-buildpackage -uc -us -d  -aarm
(略)
dpkg-deb: building package `grep' in `../grep_2.5.1.ds1-4_arm.deb'.
make: Leaving directory `/root/grep-2.5.1.ds1'
 dpkg-genchanges
dpkg-genchanges: not including original source code in upload
dpkg-buildpackage: binary and diff upload (original source NOT included)

通った。

makai:~/grep-2.5.1.ds1# cd ..
makai:~# rm -r grep-2.5.1.ds1
makai:~# ar -x grep_2.5.1.ds1-4_arm.deb
makai:~# rm control.tar.gz debian-binary
makai:~# tar zxvf data.tar.gz
makai:~# file ./bin/grep
./bin/grep: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), stripped
makai:~# rm -r bin usr data.tar.gz

出来ている。
ただ、実機でテストまではしていないので、本当に動くかどうかはまだわからない。


kernelをビルドしてみる。
Makefileをちょっといじる。

makai:~# tar zxvf kernel.tar.gz
makai:~# cd linux-2.6.12.6/
makai:~/linux-2.6.12.6# vi Makefile
	CROSS_COMPILE   ?= $(shell if uname -m|grep arm>&/dev/null; then echo ''; else echo arm-linux-gnu-; fi)
makai:~/linux-2.6.12.6# make oldconfig
makai:~/linux-2.6.12.6# make ARCH=arm CROSS_COMPILE=arm-linux-gnu-

通っているようだ。
結果は明日のお楽しみ。
つーか、クロスなのにマシン遅いのしかないので、すぐに結果が見られない... orz