【问题标题】:Yocto: create a symlink in an image recipeYocto:在图像配方中创建符号链接
【发布时间】:2018-09-06 14:28:00
【问题描述】:

我有一个自定义 Yocto 'image' 配方,它使用 IMAGE_INSTALL += "... " 来构造图像,其中还包含 Python 3.5。不幸的是,没有创建常用的/usr/bin/pdb 符号链接,我的用户希望能够从命令行运行pdb。所以我想在图像中为此创建一个符号链接。如果它在目标上运行,它将是这个命令的结果:

ln -s /usr/lib/python3.5/pdb.py /usr/bin/pdb

我知道我可以使用这种构造在图像配方中创建自定义任务

addtask create_pdb_symlink before do_image
do_create_pdb_symlink () {
    ln -s /usr/lib/python3.5/pdb.py ${D}/usr/bin/pdb
}

但这不起作用,因为我猜想使用${D},而且我不认为文件系统是在那个时候上演的。它会生成此错误:

DEBUG: Executing shell function do_create_pdb_symlink
ln: failed to create symbolic link 
'/home/user/project/build/tmp/work/custom-linux/my-image/1.0-r0/image/usr/bin/pdb': No such file or directory
WARNING: exit code 1 from a shell command.

检查文件系统确认/home/user/project/build/tmp/work/custom-linux/ 存在,但/home/user/project/build/tmp/work/custom-linux/my-image 不存在。

custom-linux 目录中有一些目录,其中一个名为rootfs,看起来非常有用,但我不确定我的任务是否应该在my-image 目录下进行。

所以我的问题是:

  • 这是正确的方法吗?
  • 或者我应该创建一个全新的配方来构建这个单一的符号链接?
  • 还是我应该创建一个python3-core.bbappend 来完成这项任务?
  • 或者这不是由 python 配方本身创建的原因吗?

【问题讨论】:

    标签: python yocto pdb bitbake rootfs


    【解决方案1】:

    由于这个符号链接显然与 python3 相关,我建议您使用 bbappend 为该配方创建它。配方名称是 python3_(version).bb,因此要捕获所有版本,请将 bbappend 命名为 python3_%.bbappend。

    这应该可行:

    # Create symlink at the end of do_install
    do_install_append() {
        ln -sf /usr/lib/python3.5/pdb.py ${D}/usr/bin/pdb
    }
    
    # Include the symlink in the python3-debugger package
    FILES_${PN}-debugger += "/usr/bin/pdb"
    

    您也可以创建符号链接作为创建整个 rootfs 的阶段,但在这种情况下,我不建议这样做。但是,如果您在填充整个 rootfs 时有需要做的事情,请考虑使用 ROOTFS_POSTPROCESS_COMMAND。例如。把它放在你的图像配方中:

    my_image_postprocess_function() {
        ln -sf /usr/lib/python3.5/pdb.py ${IMAGE_ROOTFS}/usr/bin/pdb
    }
    
    ROOTFS_POSTPROCESS_COMMAND += "my_image_postprocess_function; "
    

    【讨论】:

    • 请注意,创建绝对路径链接时会收到警告。
    • 配方文件名使用%,因此将捕获所有版本的python3配方,但是在符号链接创建命令中有一个3.5 - 有没有办法提取@987654326的前两部分@ 匹配并在命令中使用它?我会做一些研究,但我怀疑会有一个包含 % 匹配的变量...
    • 看起来原始的 Python 配方定义了PYTHON_MAJMIN,所以我现在将使用它。虽然PV 看起来很有希望,但不确定一般情况。
    【解决方案2】:

    Erik Botö 的 answer 可能是做到这一点的最佳方式,但我想记录下我自己的发现,以防它帮助其他人尝试做类似的事情(在图像配方中创建符号链接,尽管也许没有这个特定的符号链接)。

    在我的图像配方(我在自定义层中称为recipes-core/images/myimage.bb)中添加了以下几行:

    addtask create_pdb_symlink after do_rootfs before do_image
    do_create_pdb_symlink () {
        ln -s /usr/lib/python3.5/pdb.py ${IMAGE_ROOTFS}/usr/bin/pdb
    }
    

    我在这里必须了解的两个关键事项是 IMAGE_ROOTFS 的使用(我通过搜索 bitbake -e 的输出找到),以及任务的顺序:符号链接创建必须在 do_rootfs 之后发生,否则会有${IMAGE_ROOTFS} 中没有任何内容,但显然需要在创建任何图像之前进行。

    但是在这种情况下,我同意在 python3 配方上添加 bbappend 更合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多