Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Yocto:在图像配方中创建符号链接_Python_Yocto_Pdb_Bitbake_Rootfs - Fatal编程技术网

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

Python Yocto:在图像配方中创建符号链接,python,yocto,pdb,bitbake,rootfs,Python,Yocto,Pdb,Bitbake,Rootfs,我有一个自定义的Yocto‘image’配方,它使用image\u INSTALL+=“…”来构造映像,它也包含Python 3.5。不幸的是,经常使用的/usr/bin/pdb符号链接没有创建,我的用户希望能够从命令行运行pdb。因此,我想在图像中为此创建一个符号链接。如果在目标上运行,则将是以下命令的结果: ln-s/usr/lib/python3.5/pdb.py/usr/bin/pdb 我知道我可以用这种构造在图像配方中创建自定义任务: addtask create_pdb_symlin

我有一个自定义的Yocto‘image’配方,它使用
image\u 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
不存在

定制linux
目录中有一些目录,其中一个名为
rootfs
,看起来非常有用,但我不确定我的任务是否应该在
我的图像
目录下四处搜索

因此,我的问题是:

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

由于此符号链接显然与python3相关,我建议您使用bbappend为该配方创建它。配方名称为python3_u3;(version).bb,因此要捕获所有版本,请将bbappend命名为python3_3;%.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"
您还可以创建symlink作为创建整个rootfs的阶段,但在这种情况下,我不推荐使用它。但是,如果在填充整个rootfs时需要做一些事情,请考虑使用。例如,把这个放在你的图像配方中:

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ös可能是最好的方法,但是我想记录下我自己的发现,以防它帮助其他人尝试做类似的事情(在图像配方中创建一个符号链接,尽管可能不使用这个特定的符号链接)

在我的图像配方中(我在自定义层中将其称为
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\u ROOTFS
(我通过搜索
bitbake-e
的输出找到了它),以及任务的顺序:符号链接创建必须在
do\u ROOTFS
之后进行,否则
${IMAGE\u ROOTFS}
中没有任何内容,但显然,在创建任何图像之前,都需要将其包括在内


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

请注意,创建绝对路径链接时会收到警告。配方文件名使用
%
,因此将捕获所有版本的python3配方,但是,符号链接创建命令中有一个
3.5
——是否有方法提取
%
匹配的前两部分并在命令中使用?我会做一些研究,但是我怀疑在某个地方会有一个包含
%
匹配项的变量…看起来像原始Python配方定义了
Python\u MAJMIN
,所以我现在就使用它。虽然
PV
似乎很有希望,但不确定一般情况。