You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将多个独立BitBake配方的软件模块打包为单个SquashFS包?

答案:当然可以实现!

首先得明确:packagegroup确实满足不了你的需求——它本质是依赖集合,只会告诉系统要安装哪些独立的包,不会把这些包的文件合并成一个单独的包。而你要的是把多个软件模块的文件打包成一个基于squashfs的自定义包,完全可以通过编写一个自定义BitBake配方来实现,PACKAGES关键字在这里是核心工具之一。

下面是具体的实现步骤和配方示例:

1. 创建自定义整合配方

新建一个配方文件,比如my-custom-net-stack.bb,作为整合openssl、libnss、curl的主配方。

2. 配方核心内容解析

基础信息与依赖声明

首先要明确该配方需要依赖哪些软件包的编译产物,同时声明运行时依赖(确保目标系统能正常运行):

SUMMARY = "Custom integrated package containing openssl, libnss and curl"
DESCRIPTION = "Single squashfs package bundling openssl libraries, libnss and curl binaries/libraries for lightweight embedded system"

# 编译阶段依赖:确保这些包先被编译完成
DEPENDS = "openssl libnss curl"

# 运行时依赖:因为我们会把所有依赖文件打包进来,这里可以留空;如果有系统级依赖(比如libc)需要保留
RDEPENDS_${PN} = ""

关键:do_install阶段拷贝所有需要的文件

BitBake中每个软件包的编译产物会被部署到${DEPLOY_DIR_TARGET}目录下,我们需要在do_install阶段把openssl、libnss、curl的相关文件(库、二进制、配置等)拷贝到当前配方的安装目录${D}中:

do_install() {
    # 拷贝openssl的库和二进制文件
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libssl*.so* ${D}/usr/lib/
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libcrypto*.so* ${D}/usr/lib/
    cp -r ${DEPLOY_DIR_TARGET}/usr/bin/openssl ${D}/usr/bin/

    # 拷贝libnss的库文件及配置
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libnss*.so* ${D}/usr/lib/
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libsmime*.so* ${D}/usr/lib/
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libsoftokn*.so* ${D}/usr/lib/
    cp -r ${DEPLOY_DIR_TARGET}/usr/share/nss ${D}/usr/share/

    # 拷贝curl的二进制和库文件
    cp -r ${DEPLOY_DIR_TARGET}/usr/bin/curl ${D}/usr/bin/
    cp -r ${DEPLOY_DIR_TARGET}/usr/lib/libcurl*.so* ${D}/usr/lib/

    # 按需添加其他依赖文件,比如CA证书等
}

用PACKAGES定义单个包

PACKAGES关键字用来声明当前配方要生成的包列表。默认情况下BitBake会生成${PN}${PN}-dev${PN}-dbg等多个包,我们需要覆盖它,只生成一个主包:

# 只生成一个包,就是配方本身的名字(${PN})
PACKAGES = "${PN}"

# 定义这个包包含的所有文件路径,确保覆盖我们拷贝的所有内容
FILES_${PN} = "\
    /usr/bin/openssl \
    /usr/bin/curl \
    /usr/lib/libssl*.so* \
    /usr/lib/libcrypto*.so* \
    /usr/lib/libnss*.so* \
    /usr/lib/libsmime*.so* \
    /usr/lib/libsoftokn*.so* \
    /usr/lib/libcurl*.so* \
    /usr/share/nss \
"

配置生成squashfs格式的包

要生成squashfs格式的包,需要确保你的构建环境支持squashfs打包,然后在配方中指定打包格式:

# 指定包的格式为squashfs
PACKAGE_FMT = "squashfs"

# 自定义squashfs压缩参数(可选,根据嵌入式系统需求调整)
SQUASHFS_ARGS = "-comp xz -Xbcj x86"

3. 注意事项

  • 文件冲突处理:如果多个依赖包有同名文件(比如不同包的配置文件同名),你需要在do_install阶段手动处理,决定保留哪个或者合并内容。
  • 路径准确性:如果不确定${DEPLOY_DIR_TARGET}的具体路径,可以用bitbake -e <package-name>命令查看对应包的部署路径。
  • 功能验证:构建完成后,挂载生成的squashfs包检查文件完整性,再到目标嵌入式系统上测试curl、openssl的功能是否正常。

内容的提问来源于stack exchange,提问作者user803422

火山引擎 最新活动