如果同学们想要做嵌入式Linux系统开发,强烈建议对Buildroot的使用很熟练,Buildroot可以让我们的工作效率成倍的提升。本文以RK3308平台为例介绍Buildroot的基本开发。
1、Buildroot介绍
buildroot是Linux平台上一个构建嵌入式Linux系统的框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。
1.1 Buildroot目录介绍
进入Buildroot目录后,会看到如下目录结构:
arch 存放CPU架构相关的配置脚本,如arm/mips/x86, 这些CPU相关的配置
board 不同开发板的配置
build 存放解压后的各种软件包编译完成后的现场
configs 放置开发板的一些配置参数
dl 存放下载的源代码及应用软件的压缩包
docs 存放相关的参考文档
fs 放各种文件系统的源代码
linux 存放着Linux kernel的自动构建脚本
Makefile 编译脚本
output 是编译出来的输出文件夹,可以在这里进行编译
package 所有的用户空间包、busybox/gcc/qt等
support 工具libtool patchs等
system 根目录骨架,制作根目录时先将该处的文件拷贝到output作为基础
toolchain 交叉编译工具链
2、Buildroot配置
#source build/envsetup.sh //选择需要的默认配置(如rockchip_rk3308_release_defconfig)来编译buildroot
#make menuconfig //打开图示配置如下
Target options --->选择目标板架构特性。
Build options --->配置编译选项。
Toolchain ---> 配置交叉工具链,使用buildroot工具链还是外部提供。
System configuration --->可设置主机系统相关。
Kernel --->无需配置
Target packages --->所有应用包以及第三方开源工具和库相关配置。
Filesystem images --->配置文件系统格式相关
Bootloaders --->无需配置
Host utilities --->无需配置
Legacy config options --->无需配置
2.1 进入target options
配置CPU参数:little endian 指的是小端存储;二进制格式是ELF;CPU是Cortex-A35;浮点书处理采用VFP-v4;
2.2 进入toolchain
根据toolchain位置不同,可将Toolchain Type配置成Buildroot toolchain (或者 External toolchain,然后在Toolchain中选择交叉编译工具的版本,如Custom toolchain,在Toolchain origin中选择Pre-installed toolchain,后面编译时,buildroot将会根据Toolchain path找到我们的交叉编译工具)。选中Enable MMU support,退回上一界面;
2.3 进入System configuration
在system hostname一栏中输入开发板的名称,如rockchip,在system banner中可输入欢迎语,如welcome to Rochchip。在Init system中选择BusyBox,在/dev management中选择Dynamic using devtmpfs + eudev,然后在Path to thepermission tables中选择设备节点的配置表,这里我们一定要选择system/device_table_dev.txt,否则后面在dev目录下将不会生成各 种设备节点。当然我们也可以手动的配置该文件,添加必要的节点或删除不需要的节点。使能Enable root login with passwd0,Root password为配置进入linux控制台终端后的密码,为空则登录时不需要密码,默认登录用户名为root。
2.4 进入target packages
在target packages目录下,有一大堆第三方的开源工具软件,基本上嵌入式上可能会用到得或用不到的,在这里都用,如果你想要把这个工具软件包含进固件里面,很简单,只要在这个软件的名称前面打个*星号,表示要编译这个软件到固件里面。你也可以在这里面添加自己写的App应用。
执行以下命令,将会保存当前配置到buildroot/configs/目录,下次编译的时候会使用此默认配置。
#make savedefconfig
3、Buildroot编译
只需在buildroot的根目录下执行make指令即可编译整个buildroot。
#make
Buildroot 输出结果保存在 output 目录,具体目录由配置文件决定。 例如,编译配置rockchip_rk3308_release,输出结果保存在buildroot/output/rockchip_rk3308_release目录。
后续编译可以在buildroot/output/rockchip_rk3308_release目录或是工程根目录下执行(make menuconfig也可以在工程根目录下执行),这个目录底下包括几个子目录:
image/:包含压缩好的根文件系统镜像文件。
build/: 包含所有的源文件,包括 Buildroot 所需主机工具和选择的包,这个目录包含所有模块源码。
staging/:这个目录类似根文件系统的目录结构,包含编译生成的所有头文件和库,以及其他 开发文件,不过他们没有裁剪,比较庞大,不适用于目标文件系统。
buildroot下make使用说明:
Cleaning:
clean - delete all files created by build
distclean - delete all non-source files (including .config)
Build:
all - make world
toolchain - build toolchain
Configuration:
menuconfig - interactive curses-based configurator--------------------------------对整个buildroot进行配置
savedefconfig - Save current config to BR2_DEFCONFIG (minimal config)----------------保存menuconfig的配置
Package-specific:-------------------------------------------------------------------------------对package配置
<pkg> - Build and install <pkg> and all its dependencies---------------------单独编译对应APP
<pkg>-source - Only download the source files for <pkg>
<pkg>-extract - Extract <pkg> sources
<pkg>-patch - Apply patches to <pkg>
<pkg>-depends - Build <pkg>'s dependencies
<pkg>-configure - Build <pkg> up to the configure step
<pkg>-build - Build <pkg> up to the build step
<pkg>-show-depends - List packages on which <pkg> depends
<pkg>-show-rdepends - List packages which have <pkg> as a dependency
<pkg>-graph-depends - Generate a graph of <pkg>'s dependencies
<pkg>-graph-rdepends - Generate a graph of <pkg>'s reverse dependencies
<pkg>-dirclean - Remove <pkg> build directory-----------------------------------------清除对应APP的编译目录
<pkg>-reconfigure - Restart the build from the configure step
<pkg>-rebuild - Restart the build from the build step--------------------------------单独重新编译对应APP
busybox:
busybox-menuconfig - Run BusyBox menuconfig
uclibc:
uclibc-menuconfig - Run uClibc menuconfig
linux:
linux-menuconfig - Run Linux kernel menuconfig-----------------------------------------配置Linux并保存设置
linux-savedefconfig - Run Linux kernel savedefconfig
linux-update-defconfig - Save the Linux configuration to the path specified
by BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE
Documentation:
manual - build manual in all formats
manual-pdf - build manual in PDF
graph-build - generate graphs of the build times----------------------------------对编译时间、编译依赖、文件系统大小生成图标
graph-depends - generate graph of the dependency tree
graph-size - generate stats of the filesystem size
4、如何增加自己的应用程序
要添加自己的本地APP, 首先在package/Config.in中添加指向新增APP目录的Config.in;
然后在package中新增目录helloworld,并在里面添加Config.in和helloworld.mk;
举例说明:
需要添加自己的应用程序mydemo
1,创建工程
buildroot/package/rockchip/mydemo/
2,新建Config.in
config BR2_PACKAGE_MYDEMO
bool "Simple My Demo"
3,新建mydemo.mk,添加以下内容
##################################################
###########
#
## mydemo
#
###################################################
###########
ifeq ($(BR2_PACKAGE_MDEMO), y)
MYDEMO_VERSION:=1.0.0
MYDEMO_SITE=$(TOPDIR)/../external/mydemo/
MYDEMO_SITE_METHOD=local
define MYDEMO_BUILD_CMDS
$(TARGET_MAKE_ENV) $(MAKE) CC=$(TARGET_CC) CXX=$(TARGET_CXX) -C $(@D)
endef
define MYDEMO_CLEAN_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) clean
endef
define MYDEMO_INSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install
endef
define MYDEMO_UNINSTALL_TARGET_CMDS
$(TARGET_MAKE_ENV) $(MAKE) -C $(@D) uninstall
endef
$(eval $(generic-package))
endif
4,创建源码目录
external/mydemo/
5,将编写的源码文件和Makefile文件添加到external/mydemo/目录
6,将新建的包加入到Buildroot编译系统内,修改package/rockchip/Cnfig.in,最后加入如下行
source "package/rockchip/fireflydemo/Config.in"
7,执行make menuconfig 选择上mydemo 应用包
# make menuconfig
8,编译:
#make mydemo-dirclean && make mydemo //生成二进制执行文件到buildroot/output/rockchip_rk3308_release/target/usr/bin/
9,打包进文件系统:
#make
10,打包整个工程生成 img镜像,烧录到开发板即可运行,也可通过NFS文件系统将生成的二进制mydemo 拷贝到开发板运行。