FON2100E openwrt backfire 10.03.1用クロスコンパイル環境の構築

昨日やったのでかなりうろ覚え。ホストはarch linux x86_64

参考:http://wiki.openwrt.org/doc/howto/buildroot.exigence

svn co --revision=29596 svn://svn.openwrt.org/openwrt/branches/backfire
cd backfire
./scripts/feeds update -a
make menuconfig # targetとか設定
m -j 8
export PATH=$PATH:`pwd`/staging_dir/toolchain-mips_gcc-4.3.3+cs_uClibc-0.9.30.1/usr/bin
export CC=mips-openwrt-linux-uclibc-gcc
export LD=mips-openwrt-linux-uclibc-ld

あとは適当にクロスコンパイル。configure引数:

CFLAGS=-Os ./configure --build=x86_64-pc-linux-gnu --host=mips-openwrt-linux-uclibc --target=mips-openwrt-linux-uclibc

C++プログラムはこのままだとstdc++にリンクする(でかい!)ので、uclibcxxを使いたい。

uclibcxxのビルド:

./scripts/feed install -p uclibcxx
make menuconfig # libs/uclibcxxをYに指定
m package/uclibc++/compile V=99
m package/uclibc++/install V=99

configure指定してクロスコンパイル対象のビルド。適宜変更すること:

CFLAGS=-Os CXXFLAGS="-fno-builtin -nostdinc++" LDFLAGS="-L/home/kouhei/openwrt/backfire/staging_dir/target-mips_uClibc-0.9.30.1/usr/lib" CPPFLAGS="-I/home/kouhei/openwrt/backfire/staging_dir/target-mips_uClibc-0.9.30.1/usr/include/uClibc++" LIBS="-nodefaultlibs -luClibc++ -lm -lgcc" ./configure --build=x86_64-pc-linux-gnu --host=mips-openwrt-linux-uclibc --target=mips-openwrt-linux-uclibc

stripしとくといいかも:

mips-openwrt-linux-uclibc-strip hogehoge

openwrt上で:

opkg update
opkg install uclibcxx

これで動くバイナリができるはず。

XPathをクエリするだけのコンソールアプリ

組み込み環境上でXMLをクエリしたいんだけど、そのためだけにrubyとかいれてもでかい。
小さいXML処理系としてはTinyXML+TinyXPathがよさげだったんだけど、フロントエンドがないので、簡単なフロントエンドを作った。

TinyXPath: http://tinyxpath.sourceforge.net/

tinyxpath_1_3_1.zipを解凍して、main.cppをこれといれかえ。

tinyxpath付属test.xmlに対して:

./tinyxpath "//x/text()" test.xml # => sub text
cat test.xml | ./tinyxpath "//x/text()"

wget -O -に対してそのままパイプで処理できるので便利。

uclibcとuclibcxx環境下でもうごいた。