Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323719
  • 博文数量: 101
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 774
  • 用 户 组: 普通用户
  • 注册时间: 2018-10-15 14:13
个人简介

搭建一个和linux开发者知识共享和学习的平台

文章分类

全部博文(101)

文章存档

2024年(15)

2023年(24)

2022年(27)

2019年(8)

2018年(27)

分类: LINUX

2022-12-30 14:57:53

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,整个Buildroot是由Makefile脚本和Kconfig配置文件构成。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。
制作的rootfs通常需要包含很多第三方软件,比如busybox,udhcpc,tftp,apache,sqlite,PHP,iptable,DNS等,为避免复杂的移植工作,在buildroot中通过menuconfig配置我们根文件系统中需要的功能,将不需要的去掉,再执行make编译,buildroot就会自动从指定的服务器上下载源码包,自动编译,自动搭建我们所需要的嵌入式根文件系统。
一、Buildroot目录介绍
  1. buildroot
  2. ├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键
  3. ├── board:在构建系统时,board默认的boot和kernel配置文件,以及一些板级相关脚本,存放一些默认开发板的配置补丁之类
  4. ├── boot:bootloader配置脚本目录,可以选择使用uboot作为bootloader
  5. ├── build:所有源码包解压出来的文件存放目录和编译过程的发生目录
  6. ├── configs: 板级配置文件,该目录下的配置文件记录着该机器平台或者方案使用的工具链,boot,kernel,各种应用软件包的配置
  7. ├── dl: download的简写,一些开源包下载后存在该目录;首次下载后,下次不会再从官网下载,而从dl/目录拿开源包,以节约时间 
  8. ├── docs: 存放相关的参考帮助文档
  9. ├── fs: 各种文件系统的自动构建脚本 
  10. ├── linux: 存放着kernel的自动构建脚本
  11. ├── output: 是编译出来的输出文件夹
  12. │   ├── build: 存放解压后的各种软件包编译完成后的现场,包括主机上Buildroot所需的工具和针对目标编译的软件包
  13. │   ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具
  14. │   ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来
  15. │   ├── staging:是到内部目标工具链host/的符号链接
  16. │   └── target: 用来制作rootfs文件系统,存放Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件。(buildroot根据用户配置把.ko .so .bin文件安装到对应目录中)
  17. ├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk
  18. ├── support:公共的支持文档(kconfig code, libtool patches, download helpers, and more)
  19. ├── system:根目录主要骨架和相关启动初始化配置,存放文件系统目录的和设备节点的模板,这些模板会被拷贝到output/目录下,用于制作根文件系统rootfs
  20. ├── toolchain:目录中存放着各种制作工具链的脚本
  21. ├── utils:常用工具

二、Buildroot整体框架
Buildroot是一个自动构建框架,提供函数框架和变量命令框架,采用它的框架编写的app_pkg.mk这种Makefile格式的自动构建脚本,将被package/pkg-generic.mk这个核心脚本展开并填充到Buildroot主目录下的Makefile中。{BANNED}最佳后make all执行Buildroot主目录下的Makefile,将生成的image输出到buildroot/output中。在buildroot/package/pkg-generic.mk中通过调用同目录下的pkg-download.mk、pkg-utils.mk文件,Buildroot已经帮你自动实现下载、解压、依赖包下载编译等一系列机械化的流程。你只需要按照格式编写Makefile脚本app_pkg.mk,填充下载地址,链接依赖库的名字等一些特有的构建细节即可。总而言之,Buildroot本身提供构建流程的框架,开发者按照格式写脚本,提供必要的构建细节,配置整个系统,{BANNED}最佳后自动构建出你的系统。
注意:
Buildroot整体框架与kernel类似,Config.in类似于kernel中Kconfig文件,用于配置Buildroot功能模块到{BANNED}最佳终的.config中,影响后面make过程,也是make menuconfig中呈现出来的选项,xxx.mk类似于kernel中Makefile,指定相应源码包位置和下载地址之类。
Buildroot的编译流程是先从dl/xxx.tar下解压出源码到output/build/xxx,然后利用本身的配置文件(如果有的话)覆盖output/build/xxx下的配置文件,在开始编译连接完成后安装到output/相应文件夹下。
使用Buildroot创建一个根文件系统编译流程:
Copy the skeleton to $(TARGET_DIR) --> Build/install all packages -->Run a number of cleanup steps --> Copy rootfs overlays --> Execute post-build scripts --> Create rootfs images --> Execute post-image scripts
执行命令:make list-defconfigs 查看当前的Buildroot中支持的开发板
三、Buildroot配置介绍
首先通过make xxx_defconfig来选择一个defconfig,这个文件在config目录下,{BANNED}最佳终生成.config文件。然后通过make menuconfig进行配置,{BANNED}最佳终的配置更新在.config文件中。这样后Buildroot整体功能确定。
  1. Target options  ---> 选择目标板架构特性。
  2. Build options  ---> 配置编译选项。
  3. Toolchain  ---> 配置交叉工具链,使用buildroot工具链还是外部提供。
  4. System configuration  ---> 配置生成的根文件系统中所需功能
  5. Kernel  ---> 配置kernel是否编译以及编译选项
  6. Target packages  ---> 配置生成的根文件系统中的工具以及库
  7. Filesystem images  ---> 配置生成的根文件系统的格式,是ext2还是其他
  8. Bootloaders  ---> 配置使用哪种bootloader以及编译选项,uboot只是其中一种
  9. Host utilities  ---> 主机使用功能
  10. Legacy config options  ---> 以前遗留的配置选项

四、Buildroot中添加本地APP
对目标板文件系统内容进行配置主要通过make menuconfig进入Target packages选项中进行修改,但首先需要将自己的APP添加进Buildroot框架中。要添加自己的本地APP,首先需要在package/Config.in中添加指向新增APP目录的Config.in;然后在package中创建新增APP目录,并在里面添加Config.in和helloworld.mk文件;{BANNED}最佳后创建对应的APP源码目录,并在里面添加.c源文件和Makefile文件。

例如:创建本地应用helloworld过程
1、在package/Config.in修改并添加如下:

  1. menu "Daniel private app package"
  2. source "package/helloworld/Config.in"
  3. endmenu

2、创建并修改buildroot/package/helloworld/Config.in如下:

  1. config BR2_PACKAGE_HELLOWORLD
  2. bool "helloworld"
  3. help
  4. This is a demo to add local app.

3、创建并修改buildroot/package/helloworld/helloworld.mk如下:

  1. ###########################################################
  2. # helloworld
  3. ###########################################################
  4. HELLOWORLD_VERSION:= 1.0.0
  5. HELLOWORLD_SITE:= $(TOPDIR)/../app/helloworld
  6. HELLOWORLD_SITE_METHOD:=local
  7. HELLOWORLD_INSTALL_TARGET:=YES
  8. define HELLOWORLD_BUILD_CMDS
  9. $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
  10. endef
  11. define HELLOWORLD_INSTALL_TARGET_CMDS
  12. $(INSTALL) -D -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin
  13. endef
  14. define HELLOWORLD_PERMISSIONS
  15. /bin/helloworld f 4755 0 0 - - - - -
  16. endef
  17. $(eval $(generic-package))

注意:
_VERSION结尾的变量是源码的版本
_SITE结尾变量是源码的下载地址
_SITE_METHOD结尾的变量是源码下载方法
_BUILD_CMDS结尾的变量会在buildroot框架编译的时候执行,用于给源码的Makefile传递编译选项和链接选项,调用源码的Makefile。
_INSTALL_TARGET_CMDS结尾的变量是在编译完之后,自动安装执行,一般是让buildroot把编译出来的的bin或lib拷贝到指定目录。
$(eval$(generic-package)) {BANNED}最佳核心的就是这个,一定不能漏掉,不然源码不会被编译,该函数就是把整个.mk构建脚本,通过Buildroot框架的方式,展开到buildroot/目录下的Makfile中,生成的构建目标。

4、创建并修改buildroot/../app/helloworld/helloworld.c如下:


  1. #include
  2. int main(int argc, char *argv[])
  3. {
  4. printf("Hello world.\n");
  5. return 0;
  6. }
阅读(1499) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~