本文通过一个简单的例子介绍如何在 RK3568的buildroot/package 目录下添加一个自己的
package(软件包)
一、开发源码工程
首先进入/app 目录下,在该目录下创建一个名为“mypackage”的文件夹,如下所示:
在 mypackage 目录下创建一个.c 源文件 main.c,以及一个 Makefile 文件:
在 main.c 源文件中编写一个简单的测试代码
#include <stdio.h>
int main(int argc, char **argv)
{
printf("buildroot mypackage\n");
return 0;
}
Makefile 文件中的内容如下所示:
mypackage: main.o
$(CC) -o mypackage main.o
%.o: %.c
$(CC) -c $< -o $@
目的就是将 main.c 源文件编译成一个可执行文件 mypackage
二、 添加 package
进入/package 目录,在该目录下创建一个名为 mypackage 的目录:
在 mypackage 目录下创建两个文件:Config.in 和 mypackage.mk:
Config.in 文件的内容如下所示:
config BR2_PACKAGE_MYPACKAGE
bool "my package"
help
this configuration is used to enable or disable mypackage.
Config.in 文件的语法规则与 Linux Kernel、U-Boot 中 Kconfig 文件的语法规则是一样的。
mypackage.mk 文件的内容如下所示:
################################################################################
#
# mypackage
#
################################################################################
# 给你的软件包定义一个版本号
MYPACKAGE_VERSION = 1.0
# 你的软件包所在目录
MYPACKAGE_SITE = $(TOPDIR)/../app/mypackage
# 获取软件包的方式, local 表示从本地获取,有些包可能需要通过网络下载,譬如 git 仓库中的项目
MYPACKAGE_SITE_METHOD = local
# 列出在编译软件包之前 需要执行的配置操作
define MYPACKAGE_CONFIGURE_CMDS
endef
# 列出编译软件包时 需要执行的操作
define MYPACKAGE_BUILD_CMDS
$(MAKE) -C $(@D) CC=$(TARGET_CC)
endef
# 列出将软件包安装到 target 目录(<Buildroot>/output/rockchip_rk3568/target)时需要执行的操作
define MYPACKAGE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/mypackage $(TARGET_DIR)/usr/bin/mypackage
endef
# 表示当前软件包是一个通用型软件包基础结构
$(eval $(generic-package))
注意:该文件中定义了一些变量以及宏,所有的这些变量、宏都以前缀 MYPACKAGE_开头,不能乱来,它必须等于 Config.in、mypackage.mk 文件所在目录(mypackage)对应的名字
(小写字母转换为大写)。
$(MAKE):表示 make 命令;
$(@D):表示软件包所在目录,注意这个目录并不是<SDK>/app/mypackage、而是该软件包在 output/rockchip_rk3568/build/目录下对应的文件夹;编译软件包之前,buildroot 会将
<SDK>/app/mypackage 拷 贝 至 <Buildroot>/output/rockchip_rk3568/build/ 目 录 , 并 重 命 名 为
mypackage-1.0(1.0 就是版本号)。所以这个“$(@D)”指的是 output/rockchip_rk3568/build/mypackage-1.0 这个目录。
$(TOPDIR):表示 buildroot 顶层目录,也就是<SDK>/buildroot 目录。
$(TARGET_CC):表示交叉编译器,RK 平台默认使用 buildroot 交叉编译器,交叉编译器所在路径为:<Buildroot>/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc。
$(INSTALL):表示 install 命令。
$(TARGET_DIR):表示 target 目录<Buildroot>/output/rockchip_rk3568/target。
接下来打开 package/Config.in 文件,将下面这行内容添加到该文件中:
source "package/mypackage/Config.in"
添加完成后保存退出。
三、使能并编译 package
执行“make menuconfig”打开图形化配置界面,找到我们添加的 package,然后将其使能:
然后保存配置、退出图形化配置界面。
执行如下命令编译该软件包,如下所示:
make mypackage-rebuild
编 译 生 成 一 个 可 执 行 文 件 mypackage , 其 所 在 路 径 为 :output/rockchip_rk3568/target/usr/bin/mypackage。