在 bitbake 配方中创建符号 link

create symbolic link in bitbake recipe

我有一个 .bbappend 配方,我需要在我的系统中创建一个符号 link。

这是现在的样子:

bernardo@bernardo-ThinkCentre-Edge72:~/yocto/genericx86-64-rocko-18.0.0/meta-datavision/recipes-devtools/oracle-java$ cat oracle-jse-jdk_1.7.0.bbappend 
FILES_${PN} += "/lib64/ld-linux-x86-64.so.2"

do_install_append() {
    install -d ${D}/lib64
    ln -s ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

但是,在sysroot 中只创建了目录/lib64。未生成 symlink /lib64/ld-linux-x86-64.so.2。

为了正确创建此 symlink,我应该对我的食谱进行哪些更改?

尽量避免使用绝对路径:

do_install_append() {
    install -d ${D}/lib64
    cd ${D}/lib64
    ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2 
}

最干净的解决方案是使用“-r”标志:

do_install_append() {
    install -d ${D}/lib64
    ln -s -r ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

来自 gnu ln 手册页:

       -r, --relative            create symbolic links relative to link location

我查看了其他方法是如何在 rootfs 中创建 links 的,大多数方法似乎都是这样做的:

ln -sf /data/etc/bluetooth/main.conf ${D}/${sysconfdir}/bluetooth/main.conf

配方中的此命令将在设备上创建以下 link:

/# ls -al /etc/bluetooth/main.conf
lrwxrwxrwx 1 root root 29 Sep 11 15:34 /etc/bluetooth/main.conf -> /data/etc/bluetooth/main.conf

您在创建 link 时使用 Yocto 生成的完整路径,但您使其指向 rootfs 中的 "final" 位置。

这样您就可以使用 "absolute" 路径,而不必更改配方中的工作目录。

你可以这样做:

ln -s ../lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2

或者如果你不需要符号-link直到你的目标系统已经启动(即它不是你正在构建的其他包的依赖)你可以 也做:

ln -s /lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2

ln 不关心您的目标是否有效或在创建符号 -link 时存在。它将在您启动目标系统(或以某种方式将此文件系统挂载到 /)后生效。但确实,相对 link 是推荐的。

自 Yocto 2.3 起,推荐 lnr

例如

do_install_append() {
    install -d ${D}/lib64
    lnr ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 
}

或者,您也可以 inherit relative_symlinks 将任何绝对符号链接转换为相对符号链接,但这比 lnr 更不常用。

比照。 https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#migration-2.3-absolute-symlinks

do_install_append () {
    install -d 0755 ${D}/dir
    install -d 0755 ${D}/dir/subdir
    cd ${D}/dir/subdir
    ln -sf /source_so_the_symbilic_link <name_of_the_symbolic_link>
} 
FILES_${PN} += "/dir" 

自 2022 年 1 月 19 日起,似乎 是让它工作的唯一方法(适应所需的文件名):

do_install() {
    install -d ${D}${libdir}
    install -m 0644 ${S}/libmine.so.0 ${D}${libdir}/
    lnr ${D}${libdir}/libmine.so.0 ${D}${libdir}/libmine.so
}

FILES_${PN} += " \
    ${libdir}/libmine.so.0 \
    ${libdir}/libmine.so \
"

FILES_SOLIBSDEV = ""
INSANE_SKIP_${PN} += "dev-so"