RK3588 Buildroot 增加本地模块(单独编译/加入系统配置)

前言

本文基于 RK3588 + Buildroot 编写.
在RK3588开发板环境下,开发者通常利用Buildroot来定制适合RK3588芯片特性的嵌入式Linux系统。通过Buildroot,开发者能够根据实际需求裁剪系统组件、添加特定驱动、配置内核特性,并集成用户应用程序,最终生成最小化且高效的Bootloader、Linux内核镜像、根文件系统镜像(例如rootfs.ext2或 squashfs格式)以及其他必要的启动和系统配置文件。

结合RK3588芯片的强大功能与Buildroot的高度灵活性,开发者能够快速实现针对RK3588平台的嵌入式Linux系统的定制开发,确保系统不仅满足性能要求,还能达到资源占用小、启动速度快、稳定性高的目标,广泛应用于各种工业控制、智能家居、物联网终端等应用场景。
在这里插入图片描述

目标:

在这里插入图片描述

  1. 增加自定义软件模块(模块使用Cmake + C/C++, 源文件基于本地)
  2. 模块单独编译并支持配置默认编译

1. 增加自定义软件模块(模块使用Cmake + C/C++, 源文件基于本地)

增加模块配置:

buildroot/package/test_app/
├── Config.in
└── test.mk

package/test_app/Config.in

config BR2_PACKAGE_TEST_APP
bool "TestApp build!"
help
Add add app for test!

package/test_app/test.mk

TEST_APP_SITE = $(TOPDIR)/test_app
TEST_APP_SITE_METHOD = local
TEST_APP_INSTALL_STAGING = YES
#TEST_APP_CONF_OPTS = -DBUILD_DEMOS=ON
$(eval $(cmake-package))

模块C和CMakeLists源码

buildroot/test_app/
├── CMakeLists.txt
└── main.c

test_app/CMakeLists.txt

cmake_minimum_required(VERSION 3.1.0)
set(CMAKE_CXX_STANDARD 11)
project(test_app)
include_directories(inc)
set(SOURCES main.c)
add_executable(${PROJECT_NAME} ${SOURCES})
install(TARGETS test_app DESTINATION bin)

test_app/main.c

#include <stdio.h>

int main()
{
   printf("Test App by add new package!\n");
   return 0;
}

2. 模块单独编译并支持配置默认编译

参考: The Buildroot user manual:Understanding how to rebuild packages 和RK的SDK文档.

## 切换到buildroot目录下.
source build/envsetup.sh (config_name)
## 编译模块和系统
#选好编译平台,接下来就可以编译每⼀个package,它主要是config、build、install三部分组成
make <package>-reconfigure
make <package>-rebuild
make <package>-reinstall

#清理包命令如下:
make <package>-dirclean

# 其他的一些编译命令:
make <package>-<target>
Package-specific:
  <pkg>                  - Build and install <pkg> and all its dependencies
  <pkg>-source           - Only download the source files for <pkg>
  <pkg>-extract          - Extract <pkg> sources
  <pkg>-patch            - Apply patches to <pkg>
  <pkg>-depends          - Build <pkg>'s dependencies
  <pkg>-configure        - Build <pkg> up to the configure step
  <pkg>-build            - Build <pkg> up to the build step
  <pkg>-graph-depends    - Generate a graph of <pkg>'s dependencies
  <pkg>-dirclean         - Remove <pkg> build directory
  <pkg>-reconfigure      - Restart the build from the configure step
  <pkg>-rebuild          - Restart the build from the build step

相关package的开发,可以参考 /buildroot/package/* , 其中package/rockchip是Rockchip开发的相关package


添加后模块不会参与编译, 增加配置项到构建系统也很简单:

buildroot/package/Config.in

diff --git a/buildroot/package/Config.in b/buildroot/package/Config.in
index 75cfa5799..e593037ca 100755
--- a/buildroot/package/Config.in
+++ b/buildroot/package/Config.in
@@ -2601,4 +2601,8 @@ menu "Text editors and viewers"
       source "package/vim/Config.in"
endmenu

+menu "Customize Packages"
+       source "package/test_app/Config.in"
+endmenu
+
endmenu

在文件末尾增加模块的Config.in
运行 make menuconfig 进入 Target packages
在这里插入图片描述
可以看到增加的菜单, 进入后可以看到并选中菜单.
在这里插入图片描述
保存配置后, 重新make即可.

编译完成后可以看到:
在这里插入图片描述

一些问题记录

  1. No rule to make target ‘test_app’. Stop
$ make test_app
/xxx/...../buildroot/../prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf GCC10 
arm64 arm64 arm64
arm64
make[1]: *** No rule to make target 'test_app'.  Stop.
make: *** [Makefile:88: _all] Error 2

test_app 实际上是模块的文件夹名称, 如: package/test_app, 写成*package/testapp 会报这个问题

  1. package/test_app/test_app.mk中 test_app.mk 的文件名没有限定, 也可以存在多个, 只要内容定义不冲突
    比如, 前面的代码用的文件名是: test.mk
  2. does not appear to contain CMakeLists.txt.
buildroot/../prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf GCC10 
arm64 arm64 arm64
arm64
>>> test_app  Extracting
>>> test_app  Patching
>>> test_app  Configuring
(mkdir -p /buildroot/output/rockchip_rk3588/build/test_app/ && cd /buildroot/output/rockchip_rk3588/build/test_app/ && rm -f CMakeCache.txt && sed -e 's#@@STAGING_SUBDIR@@#aarch64-buildroot-linux-gnu/sysroot#' -e 's#@@RELOCATED_HOST_DIR@@#/buildroot/output/rockchip_rk3588/host/share/buildroot/#' -e 's#@@TARGET_CFLAGS@@#-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -g0 -D_FORTIFY_SOURCE=1#' -e 's#@@TARGET_CXXFLAGS@@#-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -g0 -D_FORTIFY_SOURCE=1#' -e 's#@@TARGET_FCFLAGS@@#-Os -g0#' -e 's#@@TARGET_LDFLAGS@@##' -e 's#@@TARGET_CC@@#bin/aarch64-buildroot-linux-gnu-gcc#' -e 's#@@TARGET_CXX@@#bin/aarch64-buildroot-linux-gnu-g++#' -e 's#@@TARGET_AR@@#bin/aarch64-buildroot-linux-gnu-ar#' -e 's#@@TARGET_AS@@#bin/aarch64-buildroot-linux-gnu-as#' -e 's#@@TARGET_LD@@#bin/aarch64-buildroot-linux-gnu-ld#' -e 's#@@TARGET_NM@@#bin/aarch64-buildroot-linux-gnu-nm#' -e 's#@@TARGET_RANLIB@@#bin/aarch64-buildroot-linux-gnu-ranlib#' -e 's#@@TARGET_READELF@@#bin/aarch64-buildroot-linux-gnu-readelf#' -e 's#@@TARGET_STRIP@@#bin/aarch64-buildroot-linux-gnu-strip#' -e 's#@@TARGET_OBJCOPY@@#bin/aarch64-buildroot-linux-gnu-objcopy#' -e 's#@@TARGET_OBJDUMP@@#bin/aarch64-buildroot-linux-gnu-objdump#' -e 's#@@TARGET_FC@@#bin/aarch64-buildroot-linux-gnu-gfortran#' -e 's#@@CMAKE_SYSTEM_PROCESSOR@@#aarch64#' -e 's#@@TOOLCHAIN_HAS_CXX@@#1#' -e 's#@@TOOLCHAIN_HAS_FORTRAN@@#0#' -e 's#@@CMAKE_BUILD_TYPE@@#Release#' /buildroot/support/misc/toolchainfile.cmake.in > /buildroot/output/rockchip_rk3588/build/test_app//toolchainfile.cmake && PATH="/buildroot/output/rockchip_rk3588/host/bin:/buildroot/output/rockchip_rk3588/host/sbin:/home/anson/.local/bin:/home/anson/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin"  /usr/bin/cmake /buildroot/output/rockchip_rk3588/build/test_app/ -DCMAKE_TOOLCHAIN_FILE="/buildroot/output/rockchip_rk3588/build/test_app//toolchainfile.cmake" -DCMAKE_INSTALL_PREFIX="/usr" -DCMAKE_COLOR_MAKEFILE=OFF -DBUILD_DOC=OFF -DBUILD_DOCS=OFF -DBUILD_EXAMPLE=OFF -DBUILD_EXAMPLES=OFF -DBUILD_TEST=OFF -DBUILD_TESTS=OFF -DBUILD_TESTING=OFF -DBUILD_SHARED_LIBS=ON   )
CMake Error: The source directory "/buildroot/output/rockchip_rk3588/build/test_app" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.
make[1]: *** [package/pkg-generic.mk:287: /buildroot/output/rockchip_rk3588/build/test_app/.stamp_configured] Error 1
make: *** [Makefile:88: _all] Error 2

出现这个问题的原因是test.mk中的配置问题:

TESTAPP_SITE = $(TOPDIR)/work/test_app
TESTAPP_SITE_METHOD = local
TESTAPP_INSTALL_STAGING = YES
$(eval $(cmake-package))

TESTAPP 名称需要与编译模块对应, 假如是make test_app, 对应应该是TEST_APP_*
所以, 正确的配置是:

TEST_APP_SITE = $(TOPDIR)/work/test_app
TEST_APP_SITE_METHOD = local
TEST_APP_INSTALL_STAGING = YES
$(eval $(cmake-package))
  1. 关于MK文件(内容来自Google bard)
# 模块源码的路径
TEST_APP_SITE = $(TOPDIR)/work/test_app
# 
TEST_APP_SITE_METHOD = local
TEST_APP_INSTALL_STAGING = YES

TEST_APP_SITE 变量定义测试应用程序的源代码目录。在本例中,它位于 $(TOPDIR)/work/test_app

TEST_APP_SITE_METHOD 变量定义测试应用程序的获取方式。在本例中,它设置为 local,表示应用程序源代码已存在于本地目录 $(TEST_APP_SITE) 中。

TEST_APP_INSTALL_STAGING 变量定义是否将测试应用程序安装到暂存目录。在本例中,它设置为 YES,表示应用程序将安装到 $(STAGING_DIR) 目录。

以下是这段代码的详细解释:

  • TEST_APP_SITE 变量:
    • 该变量定义测试应用程序的源代码目录。
    • 可以使用绝对路径或相对路径。
    • 如果使用相对路径,则相对于 $(TOPDIR) 目录。
  • TEST_APP_SITE_METHOD 变量:
    • 该变量定义测试应用程序的获取方式。
    • 可以设置以下值:
      • local:表示应用程序源代码已存在于本地目录 $(TEST_APP_SITE) 中。
      • git:表示应用程序源代码将从 Git 仓库克隆。
      • svn:表示应用程序源代码将从 SVN 仓库检出。
      • http:表示应用程序源代码将从 HTTP 服务器下载。
      • ftp:表示应用程序源代码将从 FTP 服务器下载。
  • TEST_APP_INSTALL_STAGING 变量:
    • 该变量定义是否将测试应用程序安装到暂存目录。
    • 可以设置以下值:
      • YES:表示应用程序将安装到 $(STAGING_DIR) 目录。
      • NO:表示应用程序不会安装到暂存目录。

示例

假设 TEST_APP_SITE 设置为 $(TOPDIR)/work/test_appTEST_APP_SITE_METHOD 设置为 localTEST_APP_INSTALL_STAGING 设置为 YES

在这种情况下,Buildroot 将执行以下操作:

  1. $(TOPDIR)/work/test_app 目录获取测试应用程序源代码。
  2. 编译测试应用程序。
  3. 将测试应用程序安装到 $(STAGING_DIR) 目录。

注意

  • 如果 TEST_APP_SITE_METHOD 设置为 gitsvnhttpftp,则 Buildroot 将自动下载应用程序源代码。
  • 如果 TEST_APP_INSTALL_STAGING 设置为 NO,则 Buildroot 将只编译测试应用程序,不会将其安装到暂存目录。

参考

[ 编译篇 ] Buildroot Add Package的一些坑
嵌入式Linux构建框架Buildroot创建自己的软件包(基于传统makefile和cmake)(篇二)
buildroot中配置自定义APP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466768.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

哪里有视频素材网站免费下载?高清烟花视频素材哪里有?

如果你在寻找那些能点亮夜空的绚丽烟花视频素材&#xff0c;或者无水印的高清视频素材&#xff0c;那下面这些资源网站将会是你的宝库。今天&#xff0c;我要分享给你一些最佳的无水印视频素材下载网站&#xff0c;让你的视频制作闪耀起来。 1.蛙学府 这个网站是视频创作者的天…

C++之入门一

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

网安渗透攻击作业(4)

Unload-labs-01 function checkFile() { var file document.getElementsByName(upload_file)[0].value; if (file null || file "") { alert("请选择要上传的文件!"); return false; } //定义允许上传的文件类型 v…

PHP反序列化--引用

一、引用的理解&#xff1a; 引用就是给予一个变量一个恒定的别名。 int a 10; int b &a; a 20; cout<<a<<b<<endl; 输出结果 : a20、b20 二、靶场复现&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); include("flag.p…

10大漏洞评估和渗透测试工具【附安装包】

1、Netsparker Security Scanner 专为企业设计的强大的漏洞扫描和管理工具&#xff0c;它可以检测和利用 SQL 注入和 XSS 等漏洞。 https://www.netsparker.com/product/ 2、Acunetix Scanner 针对中小型企业的 Web 应用程序漏洞扫描程序&#xff0c;但也可以扩展到更大的组…

Jenkins实现CICD(3)_Jenkins连接到git

文章目录 1、如何完成上述操作&#xff0c;并且不报如下错&#xff1a;2、连接不上git&#xff0c;操作如下&#xff1a;3、将上边产生的3个文件拷贝到&#xff1a;C:\Windows\System32\config\systemprofile\.ssh4、新建下图凭证&#xff1a;创建步骤&#xff1a; 5、公钥填到…

搜索练习(地下城主,查找倍数)

地下城主 思路&#xff1a;这个其实就是bfs的板子&#xff0c;但是和以往的bfs不同&#xff0c;这个bfs适用于三维空间&#xff0c;也就是说多出一维需要进行搜索&#xff1a; 犯下的错误&#xff1a;在bfs的输出中我写成了cout<<q[tail].step1<<endl; 由于在之前…

机器人路径规划:基于流场寻路算法(Flow Field Pathfinding)的机器人路径规划(提供Python代码)

流场寻路算法(Flow Field Pathfinding)是一种基于流体动力学理论的路径规划算法&#xff0c;它模拟了流体在空间中的流动&#xff0c;并利用流体的运动特性来指导路径的选择。下面是流场寻路算法的基本介绍及算法描述&#xff1a; 1. 基本介绍 流场寻路算法通过将环境划分为网…

JWT原理

JWT 介绍 JWT&#xff08;JSON Web Token&#xff09;是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。这种信息可以被验证和信任&#xff0c;因为它是数字签名的。JWT通常用于…

洛谷P1100 高低位交换

#先看题目 题目描述 给出一个小于 的非负整数。这个数可以用一个 32 位的二进制数表示&#xff08;不足 32 位用 0 补足&#xff09;。我们称这个二进制数的前 16 位为“高位”&#xff0c;后 16 位为“低位”。将它的高低位交换&#xff0c;我们可以得到一个新的数。试问这…

算法之前缀和

题目1: 【模板】一维前缀和&#xff08;easy&#xff09; 方法一: 暴力解法, 时间复杂度O(n*q), 当n10^5, q 10^5, 时间复杂度为O(10^10), 会超时. 方法二: 前缀和: 快速求出数组中某一段连续区间的和. 第一步: 预处理出来一个前缀和数组dp: 1. dp[i]表示区间[1,i]里所有元…

ConcurrentHashMap的相关介绍和使用

概述 ConcurrentHashMap是Java中提供的一个关于线程安全的哈希表实现&#xff0c;他是java.util.concurrent包的一部分&#xff0c;允许多个读操作并发进行&#xff0c;提高了并发环境下的性能。ConcurrentHashMap实现了ConcurrentMap接口&#xff0c;故而他也有ConcurrentMap…

2024.3.18

1、试编程 封装一个动物的基类&#xff0c;类中有私有成员:姓名&#xff0c;颜色&#xff0c;指针成员年纪再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有:指针成员:腿的个数(整型intcount)&#xff0c;共有成员函数:会叫:void speak() 要求…

ardupilot开发 --- 机载(边缘)计算机-VISP 篇

啊啊啊我的妻王氏宝钏 1. 一些概念 1. 一些概念 什么是VISP VISP即Visual servoing platform. Allows to control a robot equipped with a camera from measures extracted from the images.实现无人机飞行控制&#xff0c;机器人运动控制。实现实时目标检测。实现实时位姿估…

SpringCloud Sleuth 分布式请求链路跟踪

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十篇&#xff0c;即介绍 Sleuth 分布式请求链路跟踪。 二、概述 2.1 出现的原因 在微服务框架中&…

什么是IoT物联网平台?

在数字化浪潮的席卷下&#xff0c;物联网&#xff08;IoT&#xff09;技术逐渐渗透到我们生活的方方面面&#xff0c;从智能家居到智慧城市&#xff0c;从工业自动化到智能农业&#xff0c;IoT正以其独特的魅力改变着世界。然而&#xff0c;当我们谈论IoT时&#xff0c;我们究竟…

maven一点通

1.maven简介 Maven是一个基于Java的工程构建工具&#xff0c;用于管理和构建项目的依赖关系。它提供了一种标准的项目结构和一组约定&#xff0c;使得项目的开发、构建、部署和文档化更加容易和可靠。 Maven的主要功能包括&#xff1a; 依赖管理&#xff1a;Maven可以自动下载…

elementui el-table表格自动循环滚动【超详细图解】

效果如图 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚动。 直接贴代码 <template><div><div class"app-container"><e…

蓝桥杯前端Web赛道-输入搜索联想

蓝桥杯前端Web赛道-输入搜索联想 题目链接&#xff1a;1.输入搜索联想 - 蓝桥云课 (lanqiao.cn) 题目要求&#xff1a; 题目中还包含effect.gif 更详细的说明了需求 那么观察这道题需要做两件事情 把表头的每一个字母进行大写进行模糊查询 这里我们会用到几个js函数&#…

matlab FR共轭梯度法求解无约束问题

1、内容简介 略 75-可以交流、咨询、答疑 matlab FR共轭梯度法求解无约束问题 一维搜索 黄金搜索到单峰&#xff0c;单变量最小值 2、内容说明 略 Fletcher-Reeves共轭梯度法&#xff0c;简称FR法。 共轭梯度法的基本思想是把共轭性与最速下降方法相结合&#xff0c;利用…