系统架构:uboot+kernel+buildroot 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目录介绍buildroot ├── arch: 存放CPU架构相关的配置脚本,如arm/mips/x86,这些CPU相关的配置,在制作工具链时,编译uboot和kernel时很关键 ├── board:在构建系统时,board默认的boot和kernel配置文件,以及一些板级相关脚本,存放一些默认开发板的配置补丁之类 ├── boot:bootloader配置脚本目录,可以选择使用uboot作为bootloader ├── build:所有源码包解压出来的文件存放目录和编译过程的发生目录 ├── configs: 板级配置文件,该目录下的配置文件记录着该机器平台或者方案使用的工具链,boot,kernel,各种应用软件包的配置 ├── dl: download的简写,一些开源包下载后存在该目录;首次下载后,下次不会再从官网下载,而从dl/目录拿开源包,以节约时间 ├── docs: 存放相关的参考帮助文档 ├── fs: 各种文件系统的自动构建脚本 ├── linux: 存放着kernel的自动构建脚本 ├── output: 是编译出来的输出文件夹 │ ├── build: 存放解压后的各种软件包编译完成后的现场,包括主机上Buildroot所需的工具和针对目标编译的软件包 │ ├── host: 存放着制作好的编译工具链,如gcc、arm-linux-gcc等工具 │ ├── images: 存放着编译好的uboot.bin, zImage, rootfs等镜像文件,可烧写到板子里, 让linux系统跑起来 │ ├── staging:是到内部目标工具链host/的符号链接 │ └── target: 用来制作rootfs文件系统,存放Linux系统基本的目录结构,以及编译好的应用库和bin可执行文件。(buildroot根据用户配置把.ko .so .bin文件安装到对应目录中)├── package:下面放着应用软件的配置文件,每个应用软件的配置文件有Config.in和soft_name.mk ├── support:公共的支持文档(kconfig code, libtool patches, download helpers, and more)├── system:根目录主要骨架和相关启动初始化配置,存放文件系统目录的和设备节点的模板,这些模板会被拷贝到output/目录下,用于制作根文件系统rootfs ├── toolchain:目录中存放着各种制作工具链的脚本 ├── utils:常用工具 ├── CHANGES├── Config.in ├── Config.in.legacy ├── COPYING├── DEVELOPERS├── Makefile ├── Makefile.legacy └── README 二、Buildroot整体框架Buildroot是一个自动构建框架,提供函数框架和变量命令框架,采用它的框架编写的app_pkg.mk这种Makefile格式的自动构建脚本,将被 注意:Buildroot整体框架与kernel类似,Config.in类似于kernel中Kconfig文件,用于配置Buildroot功能模块到最终的.config中,影响后面make过程,也是 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 执行命令: 三、Buildroot配置介绍首先通过 Target options ---> 选择目标板架构特性。 Build options ---> 配置编译选项。 Toolchain ---> 配置交叉工具链,使用buildroot工具链还是外部提供。 System configuration ---> 配置生成的根文件系统中所需功能 Kernel ---> 配置kernel是否编译以及编译选项 Target packages ---> 配置生成的根文件系统中的工具以及库 Filesystem images ---> 配置生成的根文件系统的格式,是ext2还是其他 Bootloaders ---> 配置使用哪种bootloader以及编译选项,uboot只是其中一种 Host utilities ---> 主机使用功能 Legacy config options ---> 以前遗留的配置选项 四、Buildroot中添加本地APP对目标板文件系统内容进行配置主要通过 例如:创建本地应用helloworld过程 1、在 menu "Daniel private app package" source "package/helloworld/Config.in"endmenu 2、创建并修改 config BR2_PACKAGE_HELLOWORLD bool "helloworld" help This is a demo to add local app. 3、创建并修改 ########################################################### # helloworld ########################################################### HELLOWORLD_VERSION:= 1.0.0HELLOWORLD_SITE:= $(TOPDIR)/../app/helloworldHELLOWORLD_SITE_METHOD:=localHELLOWORLD_INSTALL_TARGET:=YES define HELLOWORLD_BUILD_CMDS $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all endef define HELLOWORLD_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/helloworld $(TARGET_DIR)/bin endef define HELLOWORLD_PERMISSIONS /bin/helloworld f 4755 0 0 - - - - - endef $(eval $(generic-package)) 注意:
(eval(generic-package))最核心的就是这个,一定不能漏掉,不然源码不会被编译,该函数就是把整个.mk构建脚本,通过Buildroot框架的方式,展开到buildroot/目录下的Makfile中,生成的构建目标。 4、创建并修改 #include <stdio.h> int main(int argc, char *argv[]){ printf("Hello world.\n"); return 0;} 5、创建并修改 CPPFLAGS +=LDLIBS += all: helloworld analyzestack: helloworld.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) clean: rm -f *.o helloworld .PHONY: all clean 6、修改 BR2_PACKAGE_HELLOWORLD=y 7、这样之后就可编译Buildroot,命令行中执行 |
|
来自: charlie_linux > 《buildroot》