configs/my_module_defconfig添加定义
#
# MY_MODULE package
#
BR2_PACKAGE_MY_MODULE=y
package/Config.in添加配置
menu "MY_MODULE package"
source "package/my_module/Config.in"
新建package/es-dma/
添加Config.in和my_module.mk
Config.in:
config BR2_PACKAGE_MY_MODULE
bool "my_module"
help
my_module help.
my_module.mk:
###########################################################
# my_module
###########################################################
MY_MODULE_VERSION:= 0.9
MY_MODULE_SITE:= $(TOPDIR)/../libs/my_module
MY_MODULE_SITE_METHOD:=local
MY_MODULE_INSTALL_TARGET:=YES
define MY_MODULE_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
endef
define MY_MODULE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/libmy_module.so $(TARGET_DIR)/lib
endef
$(eval $(generic-package))
MY_MODULE_SITE:= KaTeX parse error: Undefined control sequence: \mson at position 114: …根据情况可以选择其他cmake\̲m̲s̲o̲n̲等编译包. 只需要将(eval ( g e n e r i c − p a c k a g e ) ) 更 改 为 (generic-package))更改为 (generic−package))更改为(eval $(cmake-package))等标记即可,参考官方文档:infrastructure_for_cmake_based_packages
在源代码中修改Makefile
…/libs/my_module/Makefile
TARGET = libmy_module.so
CFLAGS += -I$(PWD)/../../../linux/linux-5.17/usr/include/
all: $(TARGET)
$(TARGET):my_module.c
$(CC) $(CFLAGS) $(LDFLAGS) -Wall -shared -fPIC -Os -g -o $@ $<
clean:
rm -rf $(TARGET)
编译和安装,以及第三方依赖
- 编译
此时编译buildroot会自动将代码拷贝到buildroot的build目录编译.
如果文件有修改, 可以在buildroot直接使用make my_module-rebuild单独重新拷贝编译代码. - 安装到目标文件夹
并根据$(INSTALL) 命令安装到目标位置.
$(TARGET_DIR)/lib是库路径, $(TARGET_DIR)/bin是执行文件路径. - 安装到本地依赖
如果该模组是一个基础库, 要为第三方编译提供依赖, 那么也需要安装到,$(STAGING_DIR)/, 包含include,lib.
my_module.mk中添加:
MY_MODULE_INSTALL_STAGING:=YES
define MY_MODULE_INSTALL_STAGING_CMDS
$(INSTALL) -D -m 0755 $(@D)/libmy_module.so $(STAGING_DIR)/usr/lib
$(INSTALL) -D -m 0644 $(@D)/my_module.h $(STAGING_DIR)/usr/include
endef
这样, 当其它模组在config.in中声明:
depends on BR2_PACKAGE_MY_MODULE
就可以直接在$(STAGING_DIR)中搜寻头文件和库文件, 不用在mk文件中去手动指定.
mk中定义:
B_MODULE_DEPENDENCIES += my_module
就可以在编译b_module时先编译my_module并安装对应文件。
多级目录编写
如果涉及到自定义的多级目录, 则每一几目录都需要创建Config.in和my_module.mk文件, 将子目录包含进来.
config中设定参照上述, 包含子目录的config.
my_module.mk则使用类似include $(waildcard package/my_module/sub_mode//.mk) 之类的遍历函数来包含所有的子目录.