You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于DISTRO_FEATURES变量在Yocto配方中创建符号链接失败求助

Yocto配方中根据DISTRO_FEATURES创建符号链接的修复方案

问题根源

你的脚本存在两个核心问题:

  • 配方变量var无法直接在shell任务中引用,Yocto的配方变量需要特殊处理才能传递到shell环境
  • 任务时机错误:do_compile执行后,二进制文件还在编译目录,并未被安装到bindir对应的临时部署目录,此时创建链接找不到目标文件

修复方案(推荐标准流程)

直接在do_install阶段处理,这是Yocto中处理文件部署的标准环节:

do_install() {
    # 执行默认安装步骤(如果配方原有安装逻辑,保留此句)
    oe_runmake install DESTDIR=${D}

    # 直接通过bb.utils.contains生成shell判断条件
    if ${@bb.utils.contains('DISTRO_FEATURES', 'TEMP', 'true', 'false', d)}; then
        ln -rsf ${D}${bindir}/x ${D}${bindir}/y
    fi
}

若坚持使用独立任务的修复方式

如果你需要保留独立的addlink任务,需调整变量传递和任务时机:

# 将配方变量导出到shell环境
export var = "${@bb.utils.contains('DISTRO_FEATURES', 'TEMP', 'temp1', 'temp2', d)}"

do_addlink() {
    if [ "${var}" = "temp1" ]; then
        # 必须操作${D}目录下的文件,这是Yocto临时安装目录
        ln -rsf ${D}${bindir}/x ${D}${bindir}/y
    fi
}
# 调整任务时机到do_install之后,确保文件已部署到临时目录
addtask addlink before do_package after do_install

关键注意事项

  • 必须使用${D}${bindir}而非直接${bindir}:bindir指向目标系统的最终路径,但构建过程中文件先存放在${D}(临时安装目录),直接用${bindir}会指向主机系统路径,导致找不到文件
  • 避免在do_compile后直接操作:编译完成的二进制还在编译工作目录,未被安装到部署目录,此时创建链接无效

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:52:04