Yocto:在图像配方中创建符号链接

Yocto: create a symlink in an image recipe

我有一个自定义的 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 配方本身创建的原因吗?

由于此符号链接显然与 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; "

Erik Botö 的 可能是最好的方法,但是我想记录下我自己的发现,以防其他人尝试做类似的事情(在图片配方,虽然可能没有这个特定的符号链接)。

在我的图像配方中(我在自定义图层中称之为 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 更合适。