编写Yocto Recipe时如何获取构建依赖的版本等元数据?
在Yocto Recipe中获取依赖包的元数据并嵌入自身软件包
当然可以获取构建依赖的元数据,以下是几种实用的实现方法:
1. 直接引用依赖包的元数据变量
Yocto会为每个构建依赖的包暴露核心元数据变量,格式为${[变量名]_[依赖包PN]},常用的有:
- 获取依赖包的版本号:
${PV_package_b}(PV是包的标准版本变量) - 获取git源的提交哈希:
${SRCREV:package_b}(仅当package_b从git仓库构建时有效)
你可以把这些变量赋值给自定义变量,方便后续使用:
DEPENDS = "package_b" # 自定义变量存储package_b的元数据 PACKAGE_B_SRCREV = "${SRCREV:package_b}" PACKAGE_B_VERSION = "${PV_package_b}"
2. 生成头文件嵌入代码
最直接的方式是在编译前生成包含元数据的头文件,让软件代码直接引用:
do_compile:prepend() { # 在源码目录创建头文件存放目录(如果不存在) mkdir -p ${S}/include # 写入元数据到头文件 cat > ${S}/include/package_b_info.h << EOF #define PACKAGE_B_SRCREV "${PACKAGE_B_SRCREV}" #define PACKAGE_B_VERSION "${PACKAGE_B_VERSION}" EOF }
之后在你的软件代码中,只需引入这个头文件就能使用这些宏定义。
3. 通过配置脚本传递元数据
如果你的软件使用autotools类配置系统,可以通过EXTRA_OECONF将元数据传递给configure脚本:
EXTRA_OECONF += "--with-package-b-version=${PACKAGE_B_VERSION} \ --with-package-b-srcrev=${PACKAGE_B_SRCREV}"
然后在configure.ac中添加对应参数的处理逻辑,就能把版本信息嵌入到编译后的程序中。
注意事项
SRCREV:package_b仅适用于基于git等版本控制系统构建的package_b,若package_b是tarball包,该变量可能不存在,此时优先使用PV_package_b。- 确保package_b的Recipe正确设置了
PV变量,官方维护的Recipe通常都会规范设置。
内容的提问来源于stack exchange,提问作者catch22
相关产品推荐
相关产品推荐

