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 更合适。
我有一个自定义的 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 更合适。