RK1126从入门到放弃:(二)Buildroot说明

2023-05-16

一、目录介绍

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

二、配置介绍

首先通过make xxx_defconfig来选择一个defconfig,这个文件在config目录下,最终生成.config文件。然后通过make menuconfig进行配置,最终的配置更新在.config文件中。这样后Buildroot整体功能确定。

Target options  ---> 选择目标板架构特性。
Build options  ---> 配置编译选项。
Toolchain  ---> 配置交叉工具链,使用buildroot工具链还是外部提供。
System configuration  ---> 配置生成的根文件系统中所需功能
Kernel  ---> 配置kernel是否编译以及编译选项
Target packages  ---> 配置生成的根文件系统中的工具以及库
Filesystem images  ---> 配置生成的根文件系统的格式,是ext2还是其他
Bootloaders  ---> 配置使用哪种bootloader以及编译选项,uboot只是其中一种
Host utilities  ---> 主机使用功能
Legacy config options  ---> 以前遗留的配置选项

3.Buildroot中添加本地APP

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

  • 1、在package/Config.in修改并添加如下:
menu "Daniel private app package"
source "package/helloworld/Config.in"endmenu
  • 2、创建并修改buildroot/package/helloworld/Config.in如下:
config BR2_PACKAGE_HELLOWORLD
 bool "helloworld"
 help
  This is a demo to add local app.
  • 3、创建并修改buildroot/package/helloworld/helloworld.mk如下:
###########################################################
# 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))

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

  • 4、创建并修改buildroot/…/app/helloworld/helloworld.c如下:
#include <stdio.h>
 int main(int argc, char *argv[]){
 printf("Hello world.\n");
  return 0;}
  • 5、创建并修改buildroot/../app/helloworld/Makefile如下:
CPPFLAGS +=LDLIBS += 
 all: helloworld
analyzestack: helloworld.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
 clean:
 rm -f *.o helloworld 
.PHONY: all clean
  • 6、修改buildroot/configs/rockchip_rv1126_rv1109_defconfig中添加内容如下:
    BR2_PACKAGE_HELLOWORLD=y
  • 7、这样之后就可编译Buildroot,命令行中执行./build.sh rootfs即可,会在buildroot/output/rockchip_rv1126_rv1109/build/helloworld-1.0.0中执行编译,然后安装到buildroot/output/rockchip_rv1126_rv1109/target/bin中。

技术交流群

Q群:941962488(瑞芯微、海思、君正技术交流群)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RK1126从入门到放弃:(二)Buildroot说明 的相关文章

随机推荐

  • python subprocess.Popen()执行耗时过长,不返回响应解决

    记录一下踩过的坑 xff0c 希望碰到此问题的人能看到 xff0c 平时对subprocess Popen 了解不多 xff0c 就用来执行命令 xff0c 都没出现什么问题 xff0c 此次开发中 xff0c 使用subprocess P
  • LiveNVR Onvif/RTSP监控视频平台如何给摄像头视频叠加水印

    介绍 监控视频平台播放视频监控的时候 xff0c 除了满足正常视频播放外 xff0c 有时还需要方便标记或者防盗用等添加视频水印 有些视频在原始摄像头端就可以添加OSD水印 xff0c 这种方式最好 但是有些原始视频没有水印 xff0c 但
  • 使用LiveNVR实现RTSP视频监控、直播推送

    LiveNVR LiveNVR能够通过简单的网络摄像机通道配置 xff0c 将传统监控行业里面的高清网络摄像机IPCamera NVR等具有RTSP Onvif协议输出的设备接入到LiveNVR xff0c LiveNVR能够将这些设备源的
  • 四旋翼飞行器——电调篇

    1 电调的作用 xff1a 电调的作用就是将飞控板的PWM控制信号转变为电流信号 xff0c 以控制电机的转速 因为电机的电流是很大的 xff0c 通常每个电机正常工作时 xff0c 平均有3A左右的电流 xff0c 如果没有电调的存在 x
  • GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG、ZDA、DTM

    NMEA协议是为了在不同的GPS xff08 全球定位系统 xff09 导航设备中建立统一的BTCM xff08 海事无线电技术委员会 xff09 标准 xff0c 由美国国家海洋电子协会 xff08 NMEA The National M
  • Github的branch是什么

    Github的branch是什么
  • extern C的作用详解

    extern 34 C 34 的主要作用就是为了能够正确实现C 43 43 代码调用其他C语言代码 加上extern 34 C 34 后 xff0c 会指示编译器这部分代码按C语言的进行编译 xff0c 而不是C 43 43 的 由于C 4
  • Linux socket CAN编程示例

    如下所示 xff0c 代码展示了Linux下CAN的发送和接收 xff1a include lt stdio h gt include lt stdlib h gt include lt string h gt include lt uni
  • windows下面安装git

    注意在安装过程中选择override这个选项
  • QT中Map的使用

    Qt中的QMap介绍与使用 xff0c 在坛子里逛了一圈 xff0c 发现在使用QMap中 xff0c 出现过很多的问题 xff0c Map是一个很有用的数据结构 它以 键 值 的形式保存数据 在使用的时候 xff0c 通过提供字符标示 x
  • ubuntu 更新内核切换内核启动

    1 查看需要更新的内核命令 xff1a apt cache search linux 该命令将会显示所有可以获取的内核 2 安装内核 xff0c 假设你要安装的内核为2 6 39 0 xff0c 则使用下面的命令 sudo apt get
  • 多线程实现对同一个或多个文件的读写操作

    程序用途 xff1a 实现多个线程对同一文件的读写操作 程序代码 xff1a test c 该程序在Ubuntu下测试通过 include lt stdio h gt include lt pthread h gt include lt s
  • linux下设置共享目录

    Linux系统的文件或目录的共享功能是非常强大 xff0c 而且是非常灵活的 xff0c 其对权限的控制可以做到非常的细致 xff0c 当然如果你是通过命令行方式进行设置的 话 xff0c 那么对于刚接触linux系统的用户来说将是一件十分
  • shell 数组赋值

    shell编程 xff0c 给数组赋值及两个数组初始化与比较 bin sh output files 61 cat outfiles for i 61 0 i lt output files 64 43 43 i do echo 34 ar
  • vnc的两种配置方法及解决vnc连不上的情况

    1 vnc连不上的现象 xff1a Timed out waiting for a response from the computer 解决方法 xff1a sudo sbin iptables I INPUT 1 p TCP dport
  • linux制作本地镜像

    1 前提条件 xff1a 有安装linux系统的iso 2 添加yum文件 xff1a touch etc yum repos d iso repo iso name 61 CentOS releasever Media baseurl 6
  • 使用parted创建分区

    今天在网上查找分区方法 xff0c 发现都是用的fdisk xff0c 但自己使用总是出错 xff0c 后来请求大神帮忙 xff0c 发现了一个好用的工具 xff0c 这里把具体的使用过程记录下来 root 64 pc160 parted
  • “结构体名”和“结构体名是个指针”的区别

    经常看见下面这样的定义 xff1a typedef struct int a double b emp i pemp i typedef 了两个新的数据类型 xff08 结构体 xff09 xff0c 其中一个是指针方式的名字 int ma
  • 简答实用的宏的写法

    本篇文章主要实现打印参数的传递 xff0c 这里定义了一个宏 define debug printf format printf 34 s d 34 format 34 34 func LINE VA ARGS
  • RK1126从入门到放弃:(二)Buildroot说明

    一 目录介绍 buildroot arch 存放CPU架构相关的配置脚本 xff0c 如arm mips x86 xff0c 这些CPU相关的配置 xff0c 在制作工具链时 xff0c 编译uboot和kernel时很关键 board x