Yocto 2.6 Thud下pipoe生成的pydantic recipe编译报错如何解决
问题根因
Yocto 2.6 Thud版本默认提供的原生Python3版本为3.5,你当前使用的pydantic 1.8.2的setup.py使用了Python3.6才引入的f-string语法,构建阶段调用宿主端python3执行setup.py时触发语法错误。
无需修改源码的解决方案
以下方案均不需要改动pydantic上游源码:
- 方案1:降级pydantic到兼容Python3.5的版本
pydantic 1.5.x是最后一个支持Python3.5的发布分支,仅需修改recipe中的版本、源码地址、校验和字段即可,适配后可完全兼容默认Thud构建环境,修改示例如下:
SRC_URI = "https://files.pythonhosted.org/packages/7a/3c/39d32372771c63f02f60500d62d0c79391a793bfab46ca93869678977c4a/pydantic-1.5.1.tar.gz" SRC_URI[md5sum] = "cf3966776c621b025a8922dbdc803e8f" SRC_URI[sha256sum] = "f00186130c6300bc617c67c9e6e997a351914d974134c657b12c982a560295c3" S = "${WORKDIR}/pydantic-1.5.1"
原有RDEPENDS配置保留即可。
- 方案2:指定构建用高版本Python3
若必须使用pydantic 1.8.2及以上版本,可先将Yocto中的python3-native组件升级到3.6及以上版本,再在现有recipe中添加如下配置,指定构建阶段调用高版本Python执行setup.py:
DEPENDS += "python3-native" SETUPTOOLS3_BUILD_VARS = "PYTHON=${STAGING_BINDIR_NATIVE}/python3"
- 方案3:添加配置钩子自动适配语法
若既不想降级pydantic也不想升级全局Python版本,可在recipe中添加配置钩子,在构建前自动替换setup.py中的f-string为兼容Python3.5的语法,添加如下代码到recipe即可:
do_configure_prepend() { sed -i 's/f'\''.. _#{id}: https://github.com/samuelcolvin/pydantic/issues/{id}'\''/".. _#{}: https://github.com/samuelcolvin/pydantic/issues/{}".format(id, id)/g' ${S}/setup.py }
该钩子仅临时修改构建目录下的代码文件,不会改动原始源码压缩包。
内容的提问来源于stack exchange,提问作者Topper
相关产品推荐
相关产品推荐

