Buildroot 笔记自定义packageKconfig与.mk文件语法2.1. Kconfig语法2.2. .mk语法1. 自定义package本次以hy_lib_hal自定义package为例创建hy_lib_hal目录mkdir -p package/rockchip/hy_lib_hal在hy_lib_hal文件夹下的新建Config.in和hy_lib_hal.mk文件touch Config.in hy_lib_hal.mk3. 在hy_lib_hal.mk文件中添加如下内容################################################################################## hy_lib_hal#################################################################################HY_LIB_HAL_VERSION1.0.0 HY_LIB_HAL_SITE_METHOD:local HY_LIB_HAL_SITE$(CURDIR)/../app/hy-lib-hal HY_LIB_HAL_INSTALL_TARGET:YES HY_LIB_HAL_DEPENDENCIESrkmedia define HY_LIB_HAL_BUILD_CMDS$(D)/build.sh$(STAGING_DIR)$(TARGET_CC)$(TARGET_CXX)endef define HY_LIB_HAL_INSTALL_TARGET_CMDS$(INSTALL)-D-m0755$(D)/build/libhy_api.so$(TARGET_DIR)/usr/lib$(INSTALL)-D-m0755$(D)/build/libhy_api.so$(STAGING_DIR)/usr/libcp-f$(D)/*.h$(STAGING_DIR)/usr/include endef$(eval$(generic-package))注意上面的#号内容格式要严格遵循否则会编译失败在Config.in(hy_lib_hal文件夹下)中添加如下内容config BR2_PACKAGE_HY_LIB_HAL boolhy_lib_haldepends on BR2_USE_MMU# fork()depends on BR2_PACKAGE_RKMEDIA depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL# clock_nanosleep()helpEmbedded Linux ahd cameraforrv1126 commenthy_lib_hal needs rkmedia, please enable BR2_PACKAGE_RKMEDIAdepends on BR2_USE_MMU depends on!BR2_PACKAGE_RKMEDIA注以上两个文件的语法为Kconfig和mk的语法具体可以参考Kconfig和mk文档基于上述步骤已经添加好编译自己的package所需的配置文件,下面将编译规则添加到对应的上层配置文件中首先需要明确我们的自定义package的路径package │ ├── rockchip │ │ ├── hy_lib_hal │ │ │ ├── Config.in │ │ │ ├── hy_lib_hal.mk从上面的路径可以看出package的路径为package/rockchip/hy_lib_hal所以我们要在package文件目录下的Condifg.in文件中添加如下内容sourcepackage/rockchip/Config.in在package/rockchip/Config.in文件中添加如下内容sourcepackage/rockchip/hy_lib_hal/Config.in基于此自定义package的配置文件已经添加完毕接下来编译由hy_lib_hal.mk文件可知我们的自定义package的源码路径在 buildroot/…/app/hy-lib-hal,所以我们需要在源码同级目录下创建一个build.sh文件并添加如下内容1#!/bin/sh23set-e45exportSYSROOT$16exportTARGET_CC$27exportTARGET_CXX$389echoSYSROOT$SYSROOT1011SHELL_FOLDER$(cd$(dirname$0);pwd)12cd$SHELL_FOLDER1314# clear15if[$1clear];then16rm-rfbuild17exit018fi1920# build21rm-rfbuild22mkdirbuild23cdbuild24cmake..25make-j2426这样buildroot就可以通过rockchip/hy_lib_hal/hy_lib_hal.mk文件找到路径编译hy_lib_hal了2. Kconfig与.mk文件语法2.1. Kconfig语法Kconfig是Linux内核及许多其它系统广泛使用的一款配置管理工具用于配置选择功能模块的编译与否。Kconfig是脚本语言用于定义配置选项和配置菜单Kconfig文件分布在各级目录下构成一个分布式的配置数据库一般来说make menuconfig通过make命令执行menuconfig目标来调用Kconfig生成界面configoption-name# config配置选项的名称[boolstring]# bool配置变量的类型[depends onexpr]# depends on该配置选项依赖的其它配置选项[selectexpr]# select其下所包含的选择项[defaultexpr]# default该配置选项的默认值[promptstring]# prompt提示信息[helpstring]# help帮助信息[commentstring]# comment: 注释简单示例, 如我们自定义的Config.in文件BR2_PACKAGE_HY_LIB_HAL是一个bool类型该配置依赖BR2_USE_MMU、BR2_PACKAGE_RKMEDIA和BR2_TOOLCHAIN_HAS_THREADS_NPTLconfig BR2_PACKAGE_HY_LIB_HAL boolhy_lib_haldepends on BR2_USE_MMU# fork()depends on BR2_PACKAGE_RKMEDIA depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL# clock_nanosleep()helpEmbedded Linux ahd cameraforrv1126 commenthy_lib_hal needs rkmedia, please enable BR2_PACKAGE_RKMEDIAdepends on BR2_USE_MMU depends on!BR2_PACKAGE_RKMEDIA在我们的上级配置文件package/rockchip/Config.in中可能涉及到一些其他语法我做了简要总结如下source语句用于读取另一个文件中的 Kconfig 文件.# 从package/rockchip/hy_lib_hal/Config.in文件中读取sourcepackage/rockchip/hy_lib_hal/Config.inif语句用于根据条件来显示或隐藏配置选项.ifBR2_PACKAGE_QT5 commentQT libraries and helper librariessourcepackage/grantlee/Config.insourcepackage/qextserialport/Config.insourcepackage/qjson/Config.insourcepackage/quazip/Config.insourcepackage/qwt/Config.inendifmenu语句用于创建一个菜单项并显示为菜单项.menuCompressors and decompressorssourcepackage/bzip2/Config.insourcepackage/gzip/Config.insourcepackage/lz4/Config.insourcepackage/lzip/Config.insourcepackage/lzop/Config.insourcepackage/p7zip/Config.insourcepackage/pixz/Config.insourcepackage/unrar/Config.insourcepackage/unzip/Config.insourcepackage/xz/Config.insourcepackage/zip/Config.insourcepackage/zstd/Config.inendmenutristate类型:用于定义三态配置选项,可以设置为y、n或mKconfig语法参考https://jindu-chen.github.io/2024/01/05/%E3%80%90%E6%9E%84%E5%BB%BA%E3%80%91Kconfig%E5%85%A5%E9%97%A8%E3%80%81%E5%B8%B8%E7%94%A8%E8%AF%AD%E6%B3%95%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/2.2. .mk语法.mk文件是Makefile的扩展用于定义编译规则和依赖关系.简单示例, 如我们自定义的hy_lib_hal.mk文件################################################################################## hy_lib_hal#################################################################################HY_LIB_HAL_VERSION1.0.0 HY_LIB_HAL_SITE_METHOD:local HY_LIB_HAL_SITE$(CURDIR)/../app/hy-lib-hal HY_LIB_HAL_INSTALL_TARGET:YES HY_LIB_HAL_DEPENDENCIESrkmedia define HY_LIB_HAL_BUILD_CMDS$(D)/build.sh$(STAGING_DIR)$(TARGET_CC)$(TARGET_CXX)endef define HY_LIB_HAL_INSTALL_TARGET_CMDS$(INSTALL)-D-m0755$(D)/build/libhy_api.so$(TARGET_DIR)/usr/lib$(INSTALL)-D-m0755$(D)/build/libhy_api.so$(STAGING_DIR)/usr/libcp-f$(D)/*.h$(STAGING_DIR)/usr/include endef$(eval$(generic-package))标头该文件以标头起始。它包含模块名称最好用小写字母并包含在由 80 个“#”字符组成的分隔符之间。标头后必须有一行空白行:################################################################################ # # hy_lib_hal # ################################################################################版本定义定义软件包版本号为 1.0.0HY_LIB_HAL_VERSION 1.0.0获取方式定义HY_LIB_HAL_SITE_METHOD设置为 local表示源码在本地路径HY_LIB_HAL_SITE指定源码所在路径为 $(CURDIR)/…/app/hy-lib-halHY_LIB_HAL_SITE_METHOD:local HY_LIB_HAL_SITE $(CURDIR)/../app/hy-lib-hal安装目标设置为 YES表示需要将此包安装到目标文件系统HY_LIB_HAL_INSTALL_TARGET:YES依赖项声明此包依赖 rkmedia 包Buildroot 会先编译 rkmediaHY_LIB_HAL_DEPENDENCIES rkmedia构建命令定义构建命令调用源码目录下的 build.sh 脚本并传入交叉编译的系统根目录 目标平台的 C 编译器 目标平台的 C 编译器.define HY_LIB_HAL_BUILD_CMDS $(D)/build.sh $(STAGING_DIR) $(TARGET_CC) $(TARGET_CXX) endef安装目标命令定义安装目标命令将 libhy_api.so 动态库安装到目标目录 $(TARGET_DIR)/usr/lib将 libhy_api.so 动态库安装到暂存目录 $(STAGING_DIR)/usr/lib 将所有头文件 *.h 复制到 $(STAGING_DIR)/usr/include.define HY_LIB_HAL_INSTALL_TARGET_CMDS $(INSTALL) -D -m 0755 $(D)/build/libhy_api.so $(TARGET_DIR)/usr/lib $(INSTALL) -D -m 0755 $(D)/build/libhy_api.so $(STAGING_DIR)/usr/lib cp -f $(D)/*.h $(STAGING_DIR)/usr/include endef评估包宏调用 Buildroot 的 generic-package 宏 此宏会根据上述定义自动生成完整的编译规则.注评估包宏必须放在最后否则会报错$(eval $(generic-package)).mk语法参考Buildroot 用户手册中文版正点原子翻译 http://www.openedv.com/forum.php?modattachmentaidMjAxMjg1fGRmOWJkZmQ0fDE3NzMyMjkzNDF8NTUyNjYwfDMzNjc0MQ%3D%3D