目录
瑞芯微目前官方提供有Buildroot和yocto工具去构建根文件系统,对于很多新人来说往往没有多少关于构建根文件系统的一些概念,新人觉得我手动去构建就行了,何必使用这些工具呢,这中构建工具能帮助我们干什么?本章我们先带着这些问题去思考
构建工具能帮助我们干什么?
其实这个问题在我刚入门嵌入式的时候就遇到过,我既然有busybox了,我要这些工具会不会脱裤子放屁?如果需要某个工具或者开源项目我手动移植就行了,何必去专门花时间学习这么一套玩意呢。
其实我们手动去构建根文件系统的时候,我们其实遇到很多问题
1.首先我们需要移植某个工具包或者开源包时我们从哪里下载(这个貌似好解决)
2.我们移植某个工具包或者开源包的时候如果遇到依赖怎么办(这个貌似手动解决也行,只不过要浪费多点时间去移植其他依赖包)
3.我们移植某个工具包或者开源包的时候环境怎么设置?每台电脑安装的环境都不一样,有可能编译包这台电脑能编译通过了,另外一台编译就没通过了,结果发现是少了某个工具包没安装
4.当我们团队开发的时候不想浪费时间在移植工具包或者开源包的时间,我们就想让工程师专注他的事情。
5.当开源包或者工具包需要修改定制我该怎么办?直接上传patch?还是修改开源包,然后整个上传?如果我上传patch的话,将来某个家伙下载的开源包和我的移植版本不对应,结果打patch失败了,如果我上传整包,那将来git的服务器会越来越大,而且整包的话对应的版本怎么管理?(往往很多细节想起来都让人头大)
6.编译的依赖问题,例如某天某个工程师移植了FFMPEG,然后我今天修改了FFMPEG使用RK的硬件去编解码,而RK的硬件编解码部分的依赖的rockit包或者mpp包的so文件我该怎么解决?是要我先编译mpp或者rocki的so,然后把SO文件上传到git,然后去叼FFMPEG的x26x软件编解码这部分的配置,还是干脆我把SO文件全部都上传?(那么乱。我想想都不想活了)
有需求就有市场,所以这个世界出现了构建工具这玩意,其中最具代表的就是Buildroot和yocoto。构建工具,帮我们解决了上述6个问题,但是衍生出一下几个问题
1.学习成本:使用构建工具需要一定的学习成本,用户需要了解构建工具的配置文件结构和相关概念。
2.依赖性:构建工具会自动下载编译所需的软件包,但这也意味着用户需要保持网络连接,并且需要一定的存储空间来存放下载的软件包和编译生成的文件。
3.灵活性:虽然构建工具提供了一定的定制性,但对于一些特殊需求或非常规配置,可能需要手动进行修改或扩展。
buildroot的配置
我们先进入Buildroot看看文件家里面有些啥。
cd 356xSDK/buildroot/
ls
arch:CPU架构相关的配置脚本
board:在构建系统时,board默认的boot和Linux kernel配置文件,以及一些板级相关脚本
boot:uboot的配置脚本目录
configs:板级配置文件,该目录下的配置文件记录这该机器平台或者方案使用的工具链,boot,kernel,各种应用软件包配置
docs:
fs:各种文件系统的自动配置脚本
linux:存放Linux kernel的自动构建脚本
package:第三方开源包的自动构建脚本,用来配置编译dl目录下载的开源包
support:
system:存放文件系统目录的和设备节点的模板,这些模板会被拷贝到output/目录下,用于制作根文件系统rootfs
toolchain:存放着各种制作工具链的脚本
编译之后的源码目录中增加了dl 和 output 目录
dl:download的简写,下载一些开源包。第一次下载之后,下次就不会再去从官网下载了,而是从dl/目录下拿开源包,以节约时间
编译出的output输出目录介绍:
images:存放所有编译生成的映像文件(内核、bootloader、根文件系统映像)
build:构建所有组件的位置,包括主机上Buildroot所需的工具和针对目标编译的软件包。该目录为每个组件包含一个子目录
host:包含为主机构建的工具和目标工具链
staging:是到内部目标工具链host/的符号链接
target:它几乎包含了目标的完整根文件系统。除了设备文件/dev/(Buildroot无法创建它们,因为Buildroot不能以root身份运行并且不想以root身份运行)之外,所需的一切都存在
output:RK创建的编译临时文件夹
说了一堆废话,其实我们重点关注的就是configs,package,dl还有rk创建的output文件夹,其他文件夹或者文件我们用到再研究。
首先我们研究一个开源工具的时候,必须知道这个工具怎么配置,配置完了才能编译,而Buildroot的配置在configs文件中
这些xxxxx_defconfig都是某个板子的配置,Buildroot是根据配置文件去构建根文件系统的,这么多文件,我们是需要那个文件作为Buildroot的配置文件呢?还记得我们看build.sh的时候传lunch参数选择的值吗?
我们已经分析过build.sh脚本的lunch,这里就略过,我们就直接看BoardConfig-rk3568-evb1-ddr4-v10.mk文件
我们查找到rockchip_rk3568_defconfig这个配置文件就是我们需要配置的文件
我们打开rockchip_rk3568_defconfig 再看看
这就是配置文件里面的内容,我们可以增加,修改配置文件,我们可以尝试修改这个文件。
我们就增加一个zip解压缩的工具包试试 在文件的最后添加 BR2_PACKAGE_ZIP=y
cd RK356xSDK/
./build.sh rootfs #只需要编译构建根文件系统就行
以下就是编译log
我们可以看到zip已经编入文件系统,就是这么简单!!!!!
我们可以验证一下
file buildroot/output/rockchip_rk3568/target/usr/bin/zip
使用file命令看,确实有这个文件,而且这个文件运行在aarch64架构上的
下一节,我们添加自己的hello world程序到Buildroot中更直观的学习Buildroot