Buildroot大大简化了交叉编译工具链的制作,并且能为目标平台产生完整的根文件系统,还可以制作在目标平台上运行的本机编译(Native Compile)工具链。
我花了大量的时间研究buildroot,基于2009.11的版本做了不少修改,使得它符合固件开发的要求。下面列出的是一些主要的改动:
- 增加了对2.6.12内核头文件的支持(编译uClibc需要)
- 增加了对uClibc-0.9.28的支持
- 增加了对busybox-1.15.3的支持
- 增加了对gcc 3.4.4和gcc 4.4.2的支持
- 增加了对nfs-utils-1.1.1的支持
- 为libiconv瘦身,只保留了unicode和简体中文的支持,编译出的动态库从900多K减小到200多K。(编译samba需要libiconv)
- 让libcurl和openssl只产生静态库。(编译transmission要用到)
1. 准备编译环境(适用于Ubuntu或Debian。我用的是Ubuntu 9.10)
安装编译所需软件包:
$ sudo apt-get install build-essential libncurses5-dev bison flex texinfo zlib1g-dev gettext libssl-dev autoconf
buildroot用wget下载软件包源码,因此需要安装wget:
$ sudo apt-get install wget
Ubuntu默认的shell是dash,它跟buildroot的脚本有些不兼容。用下面的命令切换到bash:
$ sudo dpkg-reconfigure dash
2. 下载buildroot-2009.11,放在HOME目录下,当然也可以放在其它目录。
$ cd
$ wget http://buildroot.net/downloads/buildroot-2009.11.tar.bz2
$ tar jxf buildroot-2009.11.tar.bz2
3. 打补丁。我把我的所有修改都放在一个补丁里:
buildroot-2009.11.patch.zip
$ cd buildroot-2009.11
$ patch -p1 < ../buildroot-2009.11.patch
4. 配置buildroot。buildroot采用了和Linux内核一样的配置工具,使用非常方便。建议第一次编译时只选择生成工具链,暂时不要选择额外的软件包。我的补丁已经设置好了适合于固件开发默认配置,因此你做配置时可以全部接受默认值。(C++默认是关闭的,如果需要可以打开)
$ make menuconfig
屏幕截图 - make menuconfig:
退出配置时会生成一个“.config”文件。
5. 编译buildroot。这可能会花几个小时,取决于你的Internet带宽以及CPU性能
$ make
编译好的工具链默认放在output/staging目录下,你可以在配置buildroot是指定到其它目录。我喜欢把它设为/opt/cross/gcc442-uc0928,表示gcc版本是4.4.2,uClibc版本是0.9.28。注意:指定的目录你一定要有写权限。如何设置:make menuconfig --> Build Options --> Toolchain and header file location
屏幕截图 - 设置工具链位置:
如果成功编译了工具链,接下来可以重新用
make menuconfig选择所需软件包,比如我一般会选择nfs-utils, portmap, wireless-tool, wpa-supplicant,ipkg等等。选好软件包再次执行
make。编译好的软件包会放在output/target目录下,这个目录拥有根文件系统的目录结构。
如果想要制作在目标平台运行的本机编译(Native Compile)工具链,则在
make menuconfig时打开下面两个选项:
1. Build options子菜单下的development files in target filesystem
屏幕截图 - development files in target filesystem:
2. Package Selection for the target子菜单下的native toolchain in the target filesystem
屏幕截图 -
native toolchain in the target filesystem
当然,为了能在目标平台上进行本机编译,还需要在配置时选择一些必要的编译工具以及程序库,如: make, autoconf, automake, bison, m4, flex, libz, libiconv 等等。
注:所谓本机编译(Native Compile),是相对于交叉编译而言的。其实这是最常见的编译方式,即在本机编译程序用于在本机或与本机兼容的硬件平台上运行。
补充:
1. autoconf, automake等软件包依赖于microperl软件包。在编译microperl时可能会遇到找不到m4的错误,这时只须执行make host-m4即可产生buildroot_dir/output/host/usr/bin/m4,然后再执行make,中断的编译将继续进行。
2. 编译某些软件包需要pkg-config for host(在编译平台上运行而非在目标平台上运行),执行make host-pkgconfig可编译产生buildroot_dir/output/host/usr/bin/pkg-config