4.7.2、编写规则

1、规范概述

Buildroot 像一个「自动化厨房」,每个包是一道菜。如果菜名(包名)、食材位置(路径)、做法(脚本)不统一,厨房会报错。规范是让机器人(Buildroot 脚本)能读懂你的菜谱。

2、命名规则
  1. 包目录名(package/ 下的文件夹)

    小写字母 + 短横线,如 package/my-app

  2. 配置项名(Config.in 里的变量)

    BR2_PACKAGE_ + 包目录名大写 + 下划线分隔,如 BR2_PACKAGE_MY_APP,和包目录名严格对应(复制粘贴避免拼写错误)

  3. .mk 文件中的变量

    • 包名:PKG_NAME := my-app(和目录名一致)
    • 版本:PKG_VERSION := 1.0(语义化版本)
    • 源文件:PKG_SOURCE := my_app.tar.gz(建议和包名相关)
  4. 脚本中的路径

    禁止硬编码,比如 /home/user/... ,必须使用 Buildroot 内置变量:

    • $(TOPDIR)Buildroot 根目录(自动识别)
    • $(TARGET_DIR):最终生成的根文件系统目录(如 /output/target
    • $(BUILD_DIR):编译中间目录(如 /output/build
3、文件结构
buildroot/
└─ package/
└─ my-app/ 包目录(和包名一致)
├─ Config.in 菜单配置(必选)
├─ my-app.mk 构建脚本(必选)
└─ my_app.tar.gz 源文件(可选,本地文件)
4、Config.in 编写(让包出现在菜单里)
config BR2_PACKAGE_MY_APP  配置项名(必须和包目录名对应)
bool "My Qt Application" 菜单显示的名称(用户看到的)
help 帮助说明(按 H 键显示)
这是我自己的 应用,安装到 /usr/bin/panorama
依赖:Qt5 库
  • 必须有 config 行:否则 make menuconfig 找不到你的包
  • 不要用中文:菜单显示可能乱码(虽然 Buildroot 支持,但不建议)
5、.mk 文件编写(核心脚本,分 6 步)

下载源文件 → 编译 → 安装

  1. 基本信息

    PKG_NAME := my-app  包名(和目录名一致)
    PKG_VERSION := 1.0 版本号
    PKG_LICENSE := MIT 许可证(必填,否则警告)
    PKG_LICENSE_FILES := LICENSE 许可证文件(如果有源文件)
  2. 源文件位置

    • 本地文件(推荐,避免网络问题):

      PKG_SITE := $(TOPDIR)/package/my-app  本地目录
      PKG_SOURCE := my_app.tar.gz 源文件名
    • 远程下载(需网络):

      PKG_SITE := http://example.com/packages  下载地址
      PKG_SOURCE := my-app-$(PKG_VERSION).tar.gz
  3. 解压命令

    define PKG_EXTRACT_CMDS
    # 创建解压目录(Buildroot 自动管理,无需硬编码路径)
    mkdir -p $(BUILD_DIR)/my-qt-app-$(PKG_VERSION)
    # 复制本地文件到编译目录
    cp $(PKG_SITE)/$(PKG_SOURCE) $(BUILD_DIR)/
    # 解压(注意 .tar.gz 用 xvzf,.tar.xz 用 xvJf)
    tar -xvzf $(BUILD_DIR)/$(PKG_SOURCE) -C $(BUILD_DIR)
    endef
  4. 编译命令(可选)

    • 如果是预编译好的二进制文件(如果应用已经是可执行文件):

      define PKG_BUILD_CMDS
      true 跳过编译(写 `true` 避免报错)
      endef
    • 如果需要编译(如 C 代码):

      define PKG_BUILD_CMDS
      $(MAKE) -C $(BUILD_DIR)/my-app-1.0 进入源码目录编译
      endef
  5. 安装命令

    define PKG_INSTALL_TARGET_CMDS
    # 创建目标目录(避免因目录不存在报错)
    mkdir -p $(TARGET_DIR)/usr/bin
    # 安装文件(-D 自动创建路径,-m 755 设置权限)
    install -D -m 755 $(BUILD_DIR)/my-qt-app-1.0/panorama $(TARGET_DIR)/usr/bin/panorama
    endef
  6. 依赖项

    PKG_DEPENDS := qt5-base  依赖的包(如你的程序需要 Qt5)
6、package变量名规范
6.1、基础元数据后缀(必选 / 常用)
后缀名 作用描述 示例(以 mypackage 为例) 注意事项
_NAME 包的唯一标识(小写,无空格) mypackage_NAME := mypackage 必须与目录名一致(package/mypackage/mypackage.mk
_VERSION 版本号(遵循语义化或上游格式) mypackage_VERSION := 1.2.3 支持 git describe 等动态版本(需配合 _SITE_METHOD := git
_SITE 源代码下载地址(HTTP/FTP/Git) mypackage_SITE := https://example.com 优先使用官方源,避免第三方镜像
_LICENSE 许可证(SPDX 标识符) mypackage_LICENSE := GPL-2.0 需与 LICENSES 目录下的文本匹配(可选)
_LIC_FILES_SCAN 许可证文件路径(相对于解压目录) mypackage_LIC_FILES_SCAN := */LICENSE 自动扫描许可证时使用(非必选)
6.2、源代码处理后缀(核心)
后缀名 作用描述 示例 场景说明
_SOURCE 源代码压缩包名(含扩展名) mypackage_SOURCE := mypackage-$(mypackage_VERSION).tar.gz 配合 _SITE 下载,支持 xz, gz, bz2 等格式
_EXTRACT_CMDS 自定义解压命令(覆盖默认行为) mypackage_EXTRACT_CMDS := tar -C $@ -xzf ... 处理特殊压缩格式或加密包时使用
_SITE_METHOD 源代码获取方式(url, git, svn, hg mypackage_SITE_METHOD := git Git 需配合 _SITE_URL_SITE_TAG(替代 _VERSION
_PATCH_DIR 补丁目录(相对于 package/mypackage mypackage_PATCH_DIR := patches 补丁命名需遵循 0001-xxx.patch 格式(按顺序应用)
_NO_EXTRACT 跳过解压(用于无需解压的包,如脚本) mypackage_NO_EXTRACT := y 需配合 _BUILD_IN_SOURCE := y
6.3、编译与安装后缀(关键)
后缀名 作用描述 示例 经典场景
_BUILD_IN_SOURCE 在解压目录直接编译(而非 build 子目录) mypackage_BUILD_IN_SOURCE := y 适用于 CMake 项目(默认隔离编译)
_CONFIGURE_CMD 配置命令(替代默认 ./configure mypackage_CONFIGURE_CMD := ./autogen.sh 处理需要预处理的项目(如 autotools)
_CONFIGURE_ARGS 配置参数(追加到默认参数) mypackage_CONFIGURE_ARGS := --prefix=/usr 覆盖默认安装路径($(STAGING_DIR)
_BUILD_CMD 编译命令(替代默认 make mypackage_BUILD_CMD := make -j$(nproc) 自定义并行编译参数
_INSTALL_CMD 安装命令(替代默认 make install mypackage_INSTALL_CMD := make DESTDIR=$(TARGET_DIR) install 明确指定安装目录(避免污染宿主)
_STRIP_CMD 二进制瘦身命令(默认自动调用) mypackage_STRIP_CMD := strip --strip-debug 针对特殊文件格式(如 WebAssembly)
6.4、依赖与配置后缀
后缀名 作用描述 示例 注意事项
_DEPENDS 依赖包列表(空格分隔) mypackage_DEPENDS := host-pkgconfig zlib 区分 host-(宿主工具)和 target-(目标运行时)依赖
_KCONFIG_DEPENDS 配置菜单依赖(Kconfig 表达式) mypackage_KCONFIG_DEPENDS := \$(CONFIG_PACKAGE_ZLIB) 控制包在菜单中的可见性(需与 Config.in 配合)
_DISABLED 禁用包(通过配置菜单隐藏) mypackage_DISABLED := y 临时禁用,优先级高于 Kconfig 条件
_SELECT 隐式依赖(自动选中其他包) mypackage_SELECT := packageA packageB 用于功能捆绑(如 qt5 依赖 qtbase
6.5、高级功能后缀(扩展)
后缀名 作用描述 示例 适用场景
_SOVERSION 共享库版本号(用于动态链接库) mypackage_SOVERSION := 1 需配合 PKG_CONFIG 生成 .pc 文件
_TEST_SUITE 测试套件命令 mypackage_TEST_SUITE := make check 仅在 BR2_PACKAGE_mypackage_TEST 启用时执行
_AUTORECONF_CMD 自动生成配置文件(替代 autoreconf mypackage_AUTORECONF_CMD := autoreconf -fi 处理老旧 autotools 项目
_POST_INSTALL_SCRIPT 安装后脚本(目标根文件系统) mypackage_POST_INSTALL_SCRIPT := $(call script,post_install) 用于创建符号链接、初始化配置等
_HOST_BUILD_CMDS 宿主工具编译命令(区分目标和宿主) mypackage_HOST_BUILD_CMDS := make -C hosttools 同时生成宿主工具和目标库的场景(如交叉编译工具)
6.6、特殊约定后缀(官方保留)
后缀名 作用描述 示例 禁止自定义
_PKG_DIR 包目录路径(自动生成:$(TOPDIR)/package/mypackage 无需手动设置 内部使用,禁止修改
_TARGET_BIN 目标二进制文件路径(用于 file 检测) mypackage_TARGET_BIN := /usr/bin/mypkg 配合 TARGET_CROSS 校验架构兼容性
_FINGERPRINT 源代码指纹(校验完整性) 自动生成(基于 _SOURCE_VERSION 用于增量下载时的哈希校验

十四、buildroot 系统package新增应用 编写规则的更多相关文章

  1. Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理

    Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...

  2. centos Linux系统日常管理1 cpuinfo cpu核数 命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ,lsof ,pidof 第十四节课

    centos Linux系统日常管理1  cpuinfo cpu核数   命令 w, vmstat, uptime ,top ,kill ,ps ,free,netstat ,sar, ulimit ...

  3. 我是如何一步步编码完成万仓网ERP系统的(十四)库存 3.库存日志

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧

    之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...

  5. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  6. Flask 教程 第十四章:Ajax

    本文翻译自The Flask Mega-Tutorial Part XIV: Ajax 这是Flask Mega-Tutorial系列的第十四部分,我将使用Microsoft翻译服务和少许JavaSc ...

  7. 【odoo14】第十四章、CMS网站开发

    第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...

  8. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  9. NeHe OpenGL教程 第二十四课:扩展

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. NeHe OpenGL教程 第十四课:图形字体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(11)

    1.问题描述: 鸿蒙push右侧图表没有正常展示. 解决方案: .jpg格式文件,头信息必须是这个"jpg:ffd8". 2.问题描述: 安卓端App在开发者平台申请了Androi ...

  2. 【Docker】容器数据卷

    Docker容器数据卷 第一次听说这个名字,我一直以为是数据卷(juǎn),后来查看官方英文文档的"volume"这个单词的时候,我才反应过来,这是容器数据卷(juàn),书卷的卷 ...

  3. IP地址查询服务

    IP地址查询站点 https://ip.cn/ http://ip.qq.com/ http://ip138.com/ https://www.apnic.net/ ... IP计算 ip地址在线计算 ...

  4. pg的计算百分数的问题

    SELECT cast("dept_id" as varchar(32)) , cast("dept_name" as varchar(30)) AS &quo ...

  5. C# 调用 Win10/11 文件关联对话框

    方法一:调用未公开接口 IOpenWithLauncher Adobe Acrobat 应该是调用的未公开接口方法 [ComImport] [InterfaceType(ComInterfaceTyp ...

  6. 独家推荐!这款端到端AI测试工具 Testim,让效率飙升!(支持移动端、Web端)

    在当今快速发展的软件开发时代,确保软件质量成为每个开发团队的首要任务. 随着人工智能(AI)和机器学习(ML)技术的飞速发展,AI测试工具应运而生,为软件测试领域带来了革命性的变化.今天,我要向大家强 ...

  7. Linux centos8 VPS基本配置之SSH

    Linux centos8 VPS基本配置之SSH 最近在使用阿里云的时候,需要安装一些nodejs模块,但是总是安装失败,我已经使用了淘宝镜像cnpm加速,查看了具体原因是有github的依赖. 阿 ...

  8. IDEA target中没有class文件/target中有class没有yml文件/yml文件不显示叶子

    target中没有class文件.表现为文件显示红波浪线,但是点进去自己又好了,但是编译会说找不到.点进入target文件夹发现没有class文件,只有yml文件或者什么都没有 解决方法:rebuil ...

  9. 第十五届蓝桥杯javaA组 砍柴 (两种写法)详解

    参考资料 原题链接砍柴 - 蓝桥云课 (lanqiao.cn) 区间质数搜索--埃拉托斯特尼筛法和欧拉筛法-CSDN博客 思路 质数筛 + 二分 + 博弈 + 状态机(只因bushi) $$ 状态转移 ...

  10. Vue计算属性computed与监听器watch

    Vue计算属性computed与监听器watch 诞生原因:在模板中放入太多的逻辑会让模板过重且难以维护,比如 对后台插入地数据进行切割重组  <div id="example&quo ...