开发源码工程
首先进入<SDK>/app 目录下,在该目录下创建一个名为“mypackage”的文件夹。
在 mypackage 目录下创建一个.c 源文件 main.c,以及一个 Makefile 文件。
大家可以自己在 main.c 源文件中编写一个简单的测试代码,譬如打印一个“buildroot mypackage”
#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
进入<Buildroot>/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) 对应的名字(小写字母转换为大写)。
上面已经解释了这些变量、宏的作用, 除了这些变量、宏之外,还可以在.mk 文件中定义很多其它的变量或者宏,每个变量或宏都有自己的意义。
$(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 文件, 将下面这行内容添加到该文件中:
使能并编译 package
在自己的buildroot config文件添加:
BR2_PACKAGE_MYPACKAGE=y
编译:
./build.sh rootfs
或者:make mypackage-rebuild
编译成功后,生成可执行文件:
<SDK>/buildroot/output/rockchip_rk3568/target/usr/bin/mypackage