buildroot --- 添加一个 package(应用)
参考资料:https://buildroot.org/docs.html
buildroot-slides.pdf 章节 Integrating new packages in Buildroot
以下基于RK3308 SDK(与 SDK 关系不大,其他 SDK 类似)
在 app 文件夹下新建个文件夹 wifitest,里面新建两个文件
main.c
#include <stdio.h> int main(int argc, char **argv) { printf("hello world!\n"); return 0; }
Makefile
CC 的值是 make 的时候传入
删除 .stamp_configured 是因为防止重新编译提示:.files-list.before: No such file or directory
命令前不是4个空格,而是 TAB 键,博客输不了 TAB 键,所以拷贝出去后需要替换下,否则编译提示:
Makefile:2: *** 缺失分隔符。 停止。
buildroot/package 文件夹内新建一个文件夹 wifitest,里面新建两个文件
Config.in
config BR2_PACKAGE_WIFITEST bool "wifi test" default y help this configuration is used to enable or disable wifitest.
wifitest.mk(文件名就是package名)
PKG_UPPER := WIFITEST PKG_LOWER := wifitest
# 给你的软件包定义一个版本号 $(PKG_UPPER)_VERSION = 1.0
# 你的软件包所在目录 $(PKG_UPPER)_SITE = $($(PKG_UPPER)_PKGDIR)
# 获取软件包的方式, local 表示从本地获取,有些包可能需要通过网络下载,譬如 git 仓库中的项目 $(PKG_UPPER)_SITE_METHOD = local
# 列出在编译软件包之前 需要执行的配置操作 define $(PKG_UPPER)_CONFIGURE_CMDS endef
# 列出编译软件包时 需要执行的操作 define $(PKG_UPPER)_BUILD_CMDS $(MAKE) -C $(@D) clean $(MAKE) -C $(@D) CC=$(TARGET_CC) endef
# 列出将软件包安装到 target 目录(<Buildroot>/output/rockchip_rk3568/target)时需要执行的操作 define $(PKG_UPPER)_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(@D)/$(PKG_LOWER) $(TARGET_DIR)/usr/bin/$(PKG_LOWER) endef
# 表示当前软件包是一个通用型软件包基础结构 $(eval $(generic-package))
$(@D):表示软件包所在目录,注意这个目录并不是<SDK>/app/wifitest、而是该软件包在 output/rockchip_rk3308/build/目录下对应的文件夹;编译软件包之前,buildroot 会将<SDK>/app/wifitest 拷贝至 buildroot/output/rockchip_rk3308/build/ 目录 , 并重命名为wifitest-1.0(1.0 就是版本号)。所以这个“$(@D)”指的是 output/rockchip_rk3308/build/wifitest-1.0 这个目录。
$(TOPDIR):表示 buildroot 顶层目录,也就是<SDK>/buildroot 目录。
$(TARGET_CC):表示交叉编译器,RK 平台默认使用 buildroot 交叉编译器,交叉编译器所在路径为:<Buildroot>/output/rockchip_rk3308/host/bin/aarch64-buildroot-linux-gnu-gcc。
$(INSTALL):表示 install 命令。
$(TARGET_DIR):表示 target 目录<Buildroot>/output/rockchip_rk3308/target。
$($(PKG_UPPER)_PKGDIR):buildroot 提供变量 <pkg>_PKGDIR
<pkg>__DEPENDENCIES:设置 pkg 依赖的其他包,比如 SYSTEM_MANAGER_DEPENDENCIES = nanomsg remo_log
打开 package/Config.in 文件,将下面这行内容添加到该文件中:
source "package/wifitest/Config.in"
make menuconfig 可看见 "wifi test" 被选中
执行 make wifitest-rebuild
可执行文件 wifitest 根据 wifitest.mk 的设置,被拷贝到 buildroot/output/rockchip_rk3308_h_32_release/target/usr/bin/
可执行文件 wifitest 来源于 buildroot/output/rockchip_rk3308_h_32_release/build/wifitest-1.0/
执行 make wifitest-dirclean 删除文件夹 buildroot/output/rockchip_rk3308_h_32_release/build/wifitest-1.0/