Buildroot介绍

defconfig
平台厂商提供,内核编译用做.config的参考;
文件位于:/kernel/../arch/arm/configs/xxx_defconfig

kconfig
分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,
每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。
在内核配置make menuconfig(或xconfig等)时,
从Kconfig中读出配置菜单,
用户配置完后保存到.config(在顶层目录下生成)中。
内核2.4以前的配置文件 config.in
以后的配置文件 kconfig

makefile
分布在各个目录下,用于集成编译。

 

关系如下:
defconfig----->.config---------->makefile
kconfig/config.in------->.config---------->makefile

 

Kconfig是菜单,.config就是你点的菜,Makefile是做法。

Makefile:一个文本形式的文件,编译源文件的方法。

.config:编译所依据的配置。

Kconfig:一个文本形式的文件,内核的配置菜单。

==========================================================

执行make menuconfig后,系统会读取arch/$ARCH/目录下的Kconfig文件生成整个配置界面选项
Kconfig是整个linux配置机制的核心。

 

builroot是一系列makefile文件的集合。
这些makefile文件用于下载,配置,编译软件;
而且包含各个软件包的patches文件。

 

原则上一个makefile对应一个软件包。

config.in   //菜单,每个包都会有这个文件,它描述了跟软件包有关的选项;
something.mk  //做法,是用于下载,配置,编译,安装包的makefile文件;

 

主makefile运行如下步骤(一旦配置完成后)
1、Create all the output directories: staging, target, build, etc. in the output directory (output/ by default, another value can be specified using O=)
2、Generate the toolchain target.
When an internal toolchain is used, this means generating the cross-compilation toolchain.
When an external toolchain is used, this means checking the features of the external toolchain and importing it into the Buildroot environment.

3、Generate all the targets listed in the TARGETS variable.
This variable is filled by all the individual components' Makefiles.
4、Generating these targets will trigger the compilation of the userspace packages (libraries, programs),
the kernel, the bootloader and the generation of the root filesystem images, depending on the configuration.
=======================================================

目录结构:

.
├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
├── board:存放了一些默认开发板的配置补丁之类的
├── boot:
├── configs: 放置开发板的一些配置参数文件.
├── dl: 存放下载的第三方源代码及应用软件的压缩包.
├── docs: 存放相关的参考文档.
├── fs: 放各种文件系统的源代码.
├── host:
├── image:
├── linux: 存放着Linux kernel的自动构建脚本. 很多.mk文件
├── output: 是编译出来的输出文件夹. 放置解压的代码、编译的输出文件。
│ ├── build: 存放解压后的各种软件包编译完成后的现场.
│ ├── host:
│ ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
│ ├── staging
│ └── target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
├── package: 放置应用软件的配置文件,每个应用软件的配置文件有Config.in、xxx..hash和xxx.mk。会配置软件下载路径。
├── support: 提供工具或脚本, kconfig就在其中。
├── system: 放置根文件系统的原始版本,skeleton/下就能看到板子中那种熟悉的目录。
└── toolchain: 放置工具链的自动构建脚本
├── .config: 完整的菜单
├── Makefile: 主目录的makefile文件
└──

根目录下的Makefile会调用各个目录下自动构建脚本文件。
常见的uboot, linux kernel, 文件系统,外部的应用程序就会自动下载,配置,编译,安装,打包,最后输出可烧写的文件。

通过make menuconfig 出现图形化菜单可以配置应用菜单,这样就可以裁剪出需要的最小系统。
同时还具有生成文档的功能,方便开发。

============【buildroot介绍】=======================
buildroot是Linux平台上一个构建嵌入式Linux系统的框架。
整个Buildroot是由Makefile脚本Kconfig配置文件构成的。

可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,

编译出一个完整的可以直接烧写到机器上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。

buildboot也可以单独通过配置和使用交叉编译链工具来实现制作一个Linux文件系统。

 



Buildroot将每个编译单元称为package,编译过程是完成每一个package的编译。

Package的编译结果可以是一个静态库,也可以是一个动态库或者一个可执行文件。

每个package目录下包含两个文件,一个是Config.in文件,一个是<模块名>.mk文件。

Buildroot根据<模块名>.mk文件进行编译工作。

/image     //制作镜像的地方,存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来
/configs   //存放各个机型的编译时配置文件的地方,放置开发板的一些配置参数.
/output    //是编译出来的输出文件夹
/target    //用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)
/dl        //存放下载的源代码及应用软件的压缩包.
/fs        //放各种文件系统的源代码
/linux     //存放着Linux kernel的自动构建脚本.
/docs      //存放相关的参考文档
/arch      //存放CPU架构相关的配置脚本,如arm/mips/x86
/boot
/board
/build
/host
/package
/support
/system
/toochain


buildroot/output: 是编译出来的输出文件夹.
output/build: 存放解压后的各种软件包编译完成后的现场.
output/host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具.
output/images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来.
output/target: 用来制作rootfs文件系统,里面放着Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件. (buildroot根据用户配置把.ko .so .bin文件安装到对应的目录下去,根据用户的配置安装指定位置)

buildroot/dl: 存放下载的源代码及应用软件的压缩包.
buildroot/fs: 放各种文件系统的源代码.
buildroot/linux: 存放着Linux kernel的自动构建脚本.
buildroot/configs: 放置开发板的一些配置参数.
buildroot/docs: 存放相关的参考文档.
buildroot/arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,
这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键.
========================================================
/output    //是编译出来的输出文件夹
    /output/xxx机型  //这个是编译根目录,或者叫总目录


总目录/根目录底下:
/build  //编译目录,按照一个模块一个文件夹(目录)来划分;里面有源码,和编译出来的目标文件;
/package //包管理文件夹,里面有各种包的管理策略;
/configs //编译的配置文件,_defconfig,实际上不建议直接修改,需要通过menu_config来修改生成.config;改个名称放到/configs文件夹底下;
         //_defconfig需要的时候可以拿出来替换buildroot根目录下的.config文件;
         //make O=build/xxx xxxx_defconfig 就会替换.config文件;
=============================================
buildroot最外层的makefile实际上是一个很大的命令工具;
里面有各种命令手段可以供用户进行编译;
===========【buildroot make pkg 管理命令】=======================
1、make O="机型目录xxx" pkgname-dirclean
     //会把build底下对应模块的目录删掉

2、make O=output/xxxx dkmgt-configure
//会自动从源代码目录下把文件都拷贝一份过来

3、make O=output/ccc dkmgt-build
//对模块进行单独编译

============【源代码】=====================
源代码的模块目录中有两个文件需要手动编写
1、configure.ac
2、Makefile.am
//这两个文件主要是用于autotools工具套件进行自动生成makefile用的;

============【问题】=======================
1、pkg是怎么注册的?//buildroot机制
2、需要了解configure.ac,Makefile.am的编写规则 //autotools机制
3、了解buildroot中makefile的常用命令使用技巧;
4、根文件系统怎么制作的?


============【buildroot的config.in】=======================
A depends on B  //只有在B选中后才能选A
A select B      //只有选中A后才会选中B  //select叫做反向依赖

config A
    depends on B
    select C
//CONFIG_A配置与否,取决于CONFIG_B是否配置。一旦CONFIG_A配置了,CONFIG_C也自动配置了。


每个package包都会有一个config.in文件;

============【buildroot的something.mk】=======================
实际上就是makefile文件;
有好几种makefile文件;
generic makefile : 要自己写,有一定的规则  //了解something.mk的编写规则
基于CMake的makefile:
基于autotools的makefile:

========【pkg添加机制//buildroot机制】===================
1、generic_package添加机制
2、基于autotools的package
3、基于CMake的package

//其实包都是要在/package文件夹下注册的;
例如:有个包叫abc,只有一层 /package/abc
如有有一种很大的包,里面还有子包,就会有两层

//这个big_pack的打包里面有两个子包a1和a2
//big_pack
    a1/
    a2/
/package/big_pack/a1/
/package/big_pack/a2/

在添加包的时候要做的工作:
1、编写config.in文件
2、编写something.mk文件
3、然后在/package/Config.in文件中 注册包 source "source "package/xxx/Config.in" "

========【buildroot机制】===================
1、包如何编译  something.mk
2、选择哪些包(包的定义)  config.in

=======================================================

参考链接:

buildroot教程:https://buildroot.org/downloads/manual/manual.html#writing-rules-config-in

buildroot教程: https://www.cnblogs.com/fuzidage/p/12049442.html 

嵌入式linux内核中Makefile、Kconfig、.config的关系及增加开机Hello World:
https://blog.csdn.net/fengyuwuzu0519/article/details/73772109

buildroot结构: https://blog.csdn.net/sheji105/article/details/79406348 //调用流程图很清晰

buildroot详解和分析:https://blog.csdn.net/baidu_38661691/article/details/94732843

 

posted @ 2021-04-11 23:36  Grooovvve  阅读(843)  评论(0编辑  收藏  举报