You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Yocto构建lib-common时HOSTTOOLS无法正确识别ASDF问题排查

Yocto构建lib-common时ASDF依赖错误排查

我正在为目标环境创建构建lib-common的Yocto配方,该库构建依赖waf、poetry、ASDF工具。因为这些仅为构建依赖,我在local.conf中做了如下配置:

HOSTTOOLS+="waf poetry asdf"
export ASDF_DIR="/usr/local/bin/asdf/"

这些工具已安装在/usr/local/bin/目录,并且我把相关路径添加到了/etc/profile

export PATH=$PATH:/usr/local/bin/waf-2.1.5/:/usr/local/bin/adsf/

但运行配方时出现ASDF相关错误,日志显示ASDF无法找到依赖脚本、执行命令失败,而在宿主机直接运行waf configure可以正常执行。我已确认build-raspberrypi-armv8/tmp/hosttools/asdf存在正确的符号链接,也曾考虑在meta-mylayer/recipes-devtools添加构建依赖,但之前配置waf配方遇到困难,因此选择使用HOSTTOOLS。

lib-common.bb配方代码:

SUMMARY = "Intersec libc extension for Linux"
DESCRIPTION = "Provides essential tools for C programming, including containers, event loops, and RPC communication."
HOMEPAGE = "https://github.com/Intersec/lib-common"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${WORKDIR}/git/LICENCE;md5=3b83ef96387f14655fc854ddc3c6bd57"

SRC_URI = "git://github.com/Intersec/lib-common.git;protocol=https;branch=master"
SRCREV = "d890515730026c3a3c19dbf43e7e0db2e1b83790"
PV = "1.0+git${SRCPV}"

S = "${WORKDIR}/git"

# DEPENDS = "glibc llvm libclang openssl flex gperf waf-native poetry-native"
# waf and poetry installed on build machine only required for building
DEPENDS = "glibc llvm openssl flex gperf"

inherit waf

do_configure() {
    echo "Running waf confiure in ${PWD}"
    echo "WORKDIR ${WORKDIR}"
    echo "S ${S}"
    cd ${WORKDIR}/git/
    waf configure --prefix=${D}${prefix}
}

do_compile() {
    waf build
}

do_install() {
    waf install --destdir=${D}
}

FILES_${PN} += "${libdir}/*.so ${includedir}"
FILES_${PN}-dev = "${includedir}"

可能的错误点及修复建议

  • PATH环境变量未在构建环境生效:Yocto构建环境不会自动加载/etc/profile的配置,你在profile里写的路径(还把asdf写成了adsf)在构建过程中读不到。需要在local.conf或者配方中显式设置PATH:

    # 在local.conf中添加
    EXTRA_OECONF += "PATH=${PATH}:/usr/local/bin/waf-2.1.5/:/usr/local/bin/asdf/"
    

    或者在配方的do_configure任务开头添加:

    export PATH=${PATH}:/usr/local/bin/waf-2.1.5/:/usr/local/bin/asdf/
    
  • ASDF_DIR配置错误:你设置的ASDF_DIR=/usr/local/bin/asdf/大概率不对,ASDF的默认安装目录是~/.asdf/usr/local/asdf,需要确认ASDF的实际根目录,修改ASDF_DIR指向正确路径,否则ASDF找不到自身核心脚本。

  • HOSTTOOLS无法满足ASDF的运行需求:ASDF是依赖shell脚本和环境变量的版本管理工具,单纯通过HOSTTOOLS链接宿主机工具到构建环境,无法保证它需要的所有依赖都能在隔离的Yocto构建环境中正常工作。

  • inherit waf后重写任务的冲突:你继承了waf类,又自己重写了do_configuredo_compiledo_install,这会破坏waf类自带的环境配置逻辑。建议删除自定义的这三个任务,让waf类处理构建流程;如果必须自定义,要在任务开头调用base_do_configure等保留原有逻辑。

  • 优先使用native构建依赖:虽然HOSTTOOLS能用,但Yocto更推荐通过DEPENDS添加waf-nativepoetry-native这类native配方来提供构建工具,能保证环境一致性。openembedded-core中已有现成的waf-native.bb,可以直接使用,不用自己从头配置。

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

火山引擎 最新活动