Yocto:在图像配方

时间:2018-03-28 03:07:39

标签: python yocto pdb bitbake rootfs

我有一个自定义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并且看起来非常有用,但我不确定我的任务是否应该在{{1}下面戳}目录。

所以我的问题是:

  • 这是正确的做法吗?
  • 或者我应该创建一个全新的配方来构建这个单个符号链接吗?
  • 或者我应该创建my-image来执行此任务吗?
  • 或者有没有理由为什么这不是由python配方本身创建的?

2 个答案:

答案 0 :(得分: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; "

答案 1 :(得分:0)

ErikBotö的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的输出找到)和任务的顺序:符号链接创建必须在{ {1}}否则do_rootfs中没有任何内容,但显然需要在创建任何图像之前进行包含。

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