使用Buildroot,让嵌入式Linux系统建立愈发方便。本文以Buildroot-2016.05的版本为基础来讲解,不同版本之间有细节差别,须要依照读者使用的版本自行调整。
Buildroot是哪些
Buildroot是Linux平台上一个开源的嵌入式Linux系统手动建立框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。你可以和编译Linux内核一样,通过buildroot配置,menuconfig更改,编译出一个完整的可以直接烧讲到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各类库和应用程序)。
Buildroot使用演示
以Buildroot官方开源社区维护的精典mini2440开发板的项目为例,演示其使用方式。
1)先从Buildroot官网:下载最新的稳定版Buildroot-2016.05压缩包,放在Ubuntu系统下解压
2)步入解压后的Buildroot主目录,其目录结布光如下
Figure1Buildroot-2016.05解压后主目录
3)makemini2440_defconfig
4)makeall
5)编译完,生成的可烧录文件镜像,主目录的在output/images/文件夹下,截图如下:
Figure2mini2440开发板,用buildroot编译生成的可烧录镜像
看上去,只要执行make*config和makeall的命令,u-boot/linuxkernel/rootfs都能一次性编译好,并且编下来的镜像可以直接烧到mini2440开发板中运行,之后制做uboot,编译kenrel,编译各类app,制做rootfs的繁杂工作都可以手动化一步搞定,父亲再也不用害怕我建立过程出错了。Buildroot不愧是手动建立利器。
Buildroot的优势
Buildroot大约有以下几点优势:
a).可以通在make*config然后,makemenuconfig配置须要编译的软件包,menuconfig目录如下:
Figure3makemenuconfig的一级界面
Figure4makemenuconfig下的targetpackages配置选项
实际上,uboot,linuxkernel还有ffmpeg等这种应用包,并不是强制都有编译下来的,都可以通过makemenuconfig进行选择,编译和重构。Buildroot原则上是提供手动建立框架,具体要编译哪些包,都是用户自己可以选择的。
b).对丰富的开源应用软件包的支持,谁说嵌入式软件工程师都是搞内核驱动的,有了Buildroot,那么多开源应用都能移植建立到你的开发板中去,以下是Buildroot/package/目录下支持的手动建立开源项目的截图:
boost、python、ffmpeg、redis、opencv、opengl、webkit……这些开源应用软件是不是耳熟能详呢?没错,这种开源应用软件包都可以在Buildroot下通过你的配置脚本,手动完成官网下载à解压à系统环境配置à编译à安装到根文件系统等这一系列机械繁杂的工作。
你不用再为某甲开源软件怎样移植到我的Linux开发板而四处在QQ群和峰会问人了,哪怕之后还要你自己开发的新的软件包,所有繁杂的移植工作,只要做了一次,都可以用Makefile写成手动建立脚本linux mint,移植工作做了一次,就不用做第二次了,交给Buildroot手动来做就可以了。
Figure5Buildroot所能建立的开源应用软件包部份截图a
Figure6Buildroot所能建立的开源应用软件包部份截图b
Figure7Buildroot所能建立的开源应用软件包部份截图c
c).可以一块开发板多次借助。一块板子,可以配置成手机,机顶盒,监控器,路由器或则各类想不到的有意思的应用。没错,只要把相应的配置文件加到configs/目录下,上次编译的时侯arm嵌入式linux系统构建与驱动开发,选择该种配置,makeall。这么马上就可以建立出相应的可烧录镜像,烧写的开发板中,让你的开发板顿时从手机弄成路由器,无需每次历时地移植和改动了。
Figure8Buildroot官方社区目前维护的各类开发板配置截图
d).团队协作的神器。不用手把手告诉你的朋友或则合作伙伴假如重头建立某种系统的整个软件包,把你配置好的Buildroot交给他,一切手动完成,不明白的步骤,瞧瞧各个软件包的建立脚本,顿时一目了然。
Buildroot的工作原理
Buildroot原则上是一个手动建立框架,即使说u-boot、linuxkernel这种精典的开源软件包的建立脚本,官方社区都在帮你实现了,并且有时侯你还是须要加入你自己特有的app_pkg软件包,用以建立自己的应用。
Buildroot提供了函数框架和变量命令框架(下一篇文章将介绍细节),采用它的框架编撰的app_pkg.mk这些Makefile格式的手动建立脚本,将被package/pkg-generic.mk这个核心脚本展开填充到buildroot主目录下的Makefile中去。最后makeall执行Buildroot主目录下的Makefile,生成你想要的image。
package/pkg-generic.mk中通过调用同目录下的pkg-download.mk、pkg-utils.mk文件,早已帮你手动实现了下载、解压、依赖包下载编译等一系列机械化的流程。你只要须要根据格式写Makefile脚app_pkg.mk,填充下载地址,链接依赖库的名子等一些特有的建立细节即可。
总而言之,Buildroot本身提供完善流程的框架,开发者根据格式写脚本,提供必要的建立细节,配置整个系统,最后手动建立出你的系统。
Figure9Buildroot的大约建立流程
Buildroot目录结构简介
Buildroot主目录截图如下,其中各个目录储存的脚本简略介绍。
Figure10Buildroot主目录截图
arch/目录储存CPU构架相关的配置脚本,如arm/mips/x86,这种CPU相关的配置,在制做工具链,编译boot和内核时很关键。
board/目录储存各类board特有的一些配置脚本,在建立系统时,board默认的boot和Linuxkernel配置文件,以及一些板相关特殊建立流程的脚本,都在该目录下,等待手动建立时调用。
boot/目录存在各类boot软件的手动建立脚本,不只是u-boot,还有grub等,也可以通过Buildroot来打造。
configs/目录储存这每种方案下层的全局配置文件,之前的makemini2440_defconfig实际上就是调用了该目录下的mini2440方案的配置。该目录下的配置文件记录着该机器平台或则方案使用的工具栏arm嵌入式linux系统构建与驱动开发,boot,kernel,各类应用软件包的配置和是否编译选择的状态,之前所说的某个特殊开发板整个系统的配置文件,就在configs/目录下。
dl/目录存在从官网上下载的开源软件包,第一次下载后,上次就不会再去从官网下载了,而是从dl/目录下拿开源包,以节省时间。
docs/储存相关的参考文档。
fs/储存着各类文件系统的手动建立脚本。
linux/储存着Linuxkernel的手动建立脚本。
output/是编译下来的输出文件夹,上面的build/目录储存着解压后的各类软件包编译完后的现场。host/目录放着制做好的编译工具链,target/目录是拿来制做rootfs的,上面放着Linux系统基本的目录结构,以及各类编译好的应用库和bin可执行文件。Images/目录下就是最终生成的可烧讲到板子上的各类image。
package/目录储存着各类第三方开源应用软件包的手动编译建立脚本linux服务器搭建,这种建立脚本通常都是经过测试,才能建立出相应的软件包的。
support/目录储存着一些固定的流程脚本,以备建立时调用执行。
system/目录储存着文件系统目录的和设备节点的模板,这种模板会被拷贝到output/目录下,用于制做根文件系统rootfs。
toolchain/目录中储存着各类制做工具链的脚本,buildroot可以选择从0开始,用gcc和linux内核,glibc、uclibc库等原材料制做一个自己工具链,也可以下载第三方制做好的开源工具。