当前位置: 首页 > news >正文

Buildroot自定义package

Buildroot 笔记

    1. 自定义package
    1. Kconfig与.mk文件语法
    • 2.1. Kconfig语法
    • 2.2. .mk语法

1. 自定义package

本次以hy_lib_hal自定义package为例:

  1. 创建hy_lib_hal目录:
mkdir -p package/rockchip/hy_lib_hal
  1. 在hy_lib_hal文件夹下的新建Config.in和hy_lib_hal.mk文件:
touch Config.in hy_lib_hal.mk


3. 在hy_lib_hal.mk文件中添加如下内容:

################################################################################## hy_lib_hal#################################################################################HY_LIB_HAL_VERSION=1.0.0 HY_LIB_HAL_SITE_METHOD:=local HY_LIB_HAL_SITE=$(CURDIR)/../app/hy-lib-hal HY_LIB_HAL_INSTALL_TARGET:=YES HY_LIB_HAL_DEPENDENCIES+=rkmedia define HY_LIB_HAL_BUILD_CMDS$(@D)/build.sh$(STAGING_DIR)$(TARGET_CC)$(TARGET_CXX)endef define HY_LIB_HAL_INSTALL_TARGET_CMDS$(INSTALL)-D-m0755$(@D)/build/libhy_api.so$(TARGET_DIR)/usr/lib$(INSTALL)-D-m0755$(@D)/build/libhy_api.so$(STAGING_DIR)/usr/libcp-f$(@D)/*.h$(STAGING_DIR)/usr/include endef$(eval$(generic-package))

注意:上面的#号内容格式要严格遵循,否则会编译失败!!!

  1. 在Config.in(hy_lib_hal文件夹下)中添加如下内容:
config BR2_PACKAGE_HY_LIB_HAL bool"hy_lib_hal"depends on BR2_USE_MMU# fork()depends on BR2_PACKAGE_RKMEDIA depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL# clock_nanosleep()helpEmbedded Linux ahd cameraforrv1126 comment"hy_lib_hal needs rkmedia, please enable BR2_PACKAGE_RKMEDIA"depends on BR2_USE_MMU depends on!BR2_PACKAGE_RKMEDIA

注:以上两个文件的语法为Kconfig和mk的语法,具体可以参考Kconfig和mk文档

基于上述步骤,已经添加好编译自己的package所需的配置文件,下面将编译规则添加到对应的上层配置文件中

首先需要明确我们的自定义package的路径

package │ ├── rockchip │ │ ├── hy_lib_hal │ │ │ ├── Config.in │ │ │ ├── hy_lib_hal.mk
  1. 从上面的路径可以看出,package的路径为:package/rockchip/hy_lib_hal,所以我们要在package文件目录下的Condifg.in文件中添加如下内容:
source"package/rockchip/Config.in"

  1. 在package/rockchip/Config.in文件中添加如下内容:
source"package/rockchip/hy_lib_hal/Config.in"

基于此,自定义package的配置文件已经添加完毕,接下来编译

  1. 由hy_lib_hal.mk文件可知,我们的自定义package的源码路径在 buildroot/…/app/hy-lib-hal,所以我们需要在源码同级目录下创建一个build.sh文件,并添加如下内容:
1#!/bin/sh23set-e45exportSYSROOT=$16exportTARGET_CC=$27exportTARGET_CXX=$389echo"SYSROOT=$SYSROOT+++++"1011SHELL_FOLDER=$(cd"$(dirname"$0")";pwd)12cd$SHELL_FOLDER1314# clear15if["$1"="clear"];then16rm-rfbuild17exit018fi1920# build21rm-rfbuild22mkdirbuild23cdbuild24cmake..25make-j2426

这样buildroot就可以通过rockchip/hy_lib_hal/hy_lib_hal.mk文件,找到路径,编译hy_lib_hal了

2. Kconfig与.mk文件语法

2.1. Kconfig语法

Kconfig是Linux内核及许多其它系统广泛使用的一款配置管理工具,用于配置选择功能模块的编译与否。

  1. Kconfig是脚本语言,用于定义配置选项和配置菜单
  2. Kconfig文件分布在各级目录下,构成一个分布式的配置数据库
  3. 一般来说,make menuconfig通过make命令执行menuconfig目标,来调用Kconfig生成界面
config<option-name># config:配置选项的名称[bool<string>]# bool:配置变量的类型[depends on<expr>]# depends on:该配置选项依赖的其它配置选项[select<expr>]# select:其下所包含的选择项[default<expr>]# default:该配置选项的默认值[prompt<string>]# prompt:提示信息[help<string>]# help:帮助信息[comment<string>]# comment: 注释

简单示例, 如我们自定义的Config.in文件:

BR2_PACKAGE_HY_LIB_HAL是一个bool类型,该配置依赖BR2_USE_MMU、BR2_PACKAGE_RKMEDIA和BR2_TOOLCHAIN_HAS_THREADS_NPTL

config BR2_PACKAGE_HY_LIB_HAL bool"hy_lib_hal"depends on BR2_USE_MMU# fork()depends on BR2_PACKAGE_RKMEDIA depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL# clock_nanosleep()helpEmbedded Linux ahd cameraforrv1126 comment"hy_lib_hal needs rkmedia, please enable BR2_PACKAGE_RKMEDIA"depends on BR2_USE_MMU depends on!BR2_PACKAGE_RKMEDIA

在我们的上级配置文件package/rockchip/Config.in中可能涉及到一些其他语法,我做了简要总结,如下:

  1. source语句:用于读取另一个文件中的 Kconfig 文件.
# 从package/rockchip/hy_lib_hal/Config.in文件中读取source"package/rockchip/hy_lib_hal/Config.in"
  1. if语句:用于根据条件来显示或隐藏配置选项.
ifBR2_PACKAGE_QT5 comment"QT libraries and helper libraries"source"package/grantlee/Config.in"source"package/qextserialport/Config.in"source"package/qjson/Config.in"source"package/quazip/Config.in"source"package/qwt/Config.in"endif
  1. menu语句:用于创建一个菜单项,并显示为菜单项.
menu"Compressors and decompressors"source"package/bzip2/Config.in"source"package/gzip/Config.in"source"package/lz4/Config.in"source"package/lzip/Config.in"source"package/lzop/Config.in"source"package/p7zip/Config.in"source"package/pixz/Config.in"source"package/unrar/Config.in"source"package/unzip/Config.in"source"package/xz/Config.in"source"package/zip/Config.in"source"package/zstd/Config.in"endmenu
  1. tristate类型:用于定义三态配置选项,可以设置为y、n或m

Kconfig语法参考:https://jindu-chen.github.io/2024/01/05/%E3%80%90%E6%9E%84%E5%BB%BA%E3%80%91Kconfig%E5%85%A5%E9%97%A8%E3%80%81%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

2.2. .mk语法

.mk文件是Makefile的扩展,用于定义编译规则和依赖关系.

简单示例, 如我们自定义的hy_lib_hal.mk文件

################################################################################## hy_lib_hal#################################################################################HY_LIB_HAL_VERSION=1.0.0 HY_LIB_HAL_SITE_METHOD:=local HY_LIB_HAL_SITE=$(CURDIR)/../app/hy-lib-hal HY_LIB_HAL_INSTALL_TARGET:=YES HY_LIB_HAL_DEPENDENCIES+=rkmedia define HY_LIB_HAL_BUILD_CMDS$(@D)/build.sh$(STAGING_DIR)$(TARGET_CC)$(TARGET_CXX)endef define HY_LIB_HAL_INSTALL_TARGET_CMDS$(INSTALL)-D-m0755$(@D)/build/libhy_api.so$(TARGET_DIR)/usr/lib$(INSTALL)-D-m0755$(@D)/build/libhy_api.so$(STAGING_DIR)/usr/libcp-f$(@D)/*.h$(STAGING_DIR)/usr/include endef$(eval$(generic-package))
  1. 标头:该文件以标头起始。它包含模块名称,最好用小写字母,并包含在由 80 个“#”
    字符组成的分隔符之间。标头后必须有一行空白行:
################################################################################ # # hy_lib_hal # ################################################################################
  1. 版本定义:定义软件包版本号为 1.0.0
HY_LIB_HAL_VERSION = 1.0.0
  1. 获取方式定义:HY_LIB_HAL_SITE_METHOD:设置为 local,表示源码在本地路径
    HY_LIB_HAL_SITE:指定源码所在路径为 $(CURDIR)/…/app/hy-lib-hal
HY_LIB_HAL_SITE_METHOD:=local HY_LIB_HAL_SITE = $(CURDIR)/../app/hy-lib-hal
  1. 安装目标:设置为 YES,表示需要将此包安装到目标文件系统
HY_LIB_HAL_INSTALL_TARGET:=YES
  1. 依赖项:声明此包依赖 rkmedia 包,Buildroot 会先编译 rkmedia
HY_LIB_HAL_DEPENDENCIES += rkmedia
  1. 构建命令:定义构建命令,调用源码目录下的 build.sh 脚本,并传入交叉编译的系统根目录 目标平台的 C 编译器 目标平台的 C++ 编译器.
define HY_LIB_HAL_BUILD_CMDS $(@D)/build.sh $(STAGING_DIR) $(TARGET_CC) $(TARGET_CXX) endef
  1. 安装目标命令:定义安装目标命令,将 libhy_api.so 动态库安装到目标目录 $(TARGET_DIR)/usr/lib,将 libhy_api.so 动态库安装到暂存目录 $(STAGING_DIR)/usr/lib 将所有头文件 *.h 复制到 $(STAGING_DIR)/usr/include.
define HY_LIB_HAL_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/build/libhy_api.so $(TARGET_DIR)/usr/lib $(INSTALL) -D -m 0755 $(@D)/build/libhy_api.so $(STAGING_DIR)/usr/lib cp -f $(@D)/*.h $(STAGING_DIR)/usr/include endef
  1. 评估包宏:调用 Buildroot 的 generic-package 宏, 此宏会根据上述定义自动生成完整的编译规则.

注:评估包宏必须放在最后,否则会报错

$(eval $(generic-package))

.mk语法参考:Buildroot 用户手册(中文版)正点原子翻译 http://www.openedv.com/forum.php?mod=attachment&aid=MjAxMjg1fGRmOWJkZmQ0fDE3NzMyMjkzNDF8NTUyNjYwfDMzNjc0MQ%3D%3D

http://www.jsqmd.com/news/609983/

相关文章:

  • 横扫顶会!多模态融合+注意力机制,误差狂掉!准确率飙升!
  • 老年关怀:AI Agent作为健康与生活伴侣
  • 别再死记硬背!用这5个生活化比喻,轻松搞懂计算机网络三大交换技术
  • 计算机考研 408 数据结构 排序算法
  • 【数据治理实践】第 18 期:数据生命周期管理——从“无限囤积”走向“价值运营”
  • 2026.4.8
  • 零基础玩转AutoDock-Vina:配置文件避坑指南
  • 告别EEZ Studio的Flow:一份给STM32开发者的纯C语言LVGL UI事件处理教程
  • Jetson AGX Orin远程开发环境搭建避坑指南:VNC Viewer连接配置全解析与优化
  • 基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发,文复现。 MATLAB(工...
  • 别再手动解析了!STM32CubeMX + JY901陀螺仪,用DMA空闲中断实现稳定数据接收(附完整工程)
  • 深度学习_YOLO,卡尔曼滤波和
  • Python AOT编译性能幻觉破除实验:实测显示83%项目启用AOT后启动延迟反增,3个被忽略的元数据加载瓶颈(附patch PR链接)
  • TensorRT INT8量化实战:从算法原理到部署调优
  • go-systemd 守护进程通知机制详解:sd_notify 协议完整实现
  • 飞牛OS搭配acme.sh踩坑实录:从证书部署到Nginx配置更新的完整避坑指南
  • 做自媒体,别再“自嗨”了——我从数据中学到的3个教训
  • springboot基于Hadoop的健康饮食推荐系统的设计与实现_5578bn9k_yh025
  • 保姆级教程:在K230开发板上为张大头步进电机实现位置、速度、回零全功能控制
  • HLS高层次综合发展史
  • coze-loop部署教程:免配置镜像实现本地安全代码重构
  • Linux 的 mktemp 命令
  • Shell应用手册(一) 5 .终端连接与环境配置(SSH连接、命令行提示符含义)
  • ServiceMonitor如何与Prometheus关联?
  • VisDrone2019数据集COCO格式转换实战:代码解析与避坑指南
  • 虚拟磁链与直接功率控制:定频、VF-DPC及基于PI调节的仿真说明与相关论文
  • 避坑指南:如何选择靠谱的南京企业管理咨询公司?
  • 捡垃圾玩大模型:用E5神U+MI50矿卡在Ubuntu 22.04上搭建AI推理环境(保姆级避坑)
  • 游戏模组框架:SMAPI构建个性化星露谷体验的全栈解决方案
  • leetcode 1630. 等差子数组-Arithmetic Subarrays