我有一个 .bbappend 配方,需要在我的系统中创建符号链接。
这就是现在的样子:
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。未生成符号链接 /lib64/ld-linux-x86-64.so.2。
为了正确创建此符号链接,我应该在我的配方中进行哪些更改?
最干净的解决方案是使用“-r”标志:
do_install_append() { 安装-d ${D}/lib64 ln -s -r ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 }
来自 gnu ln 手册页:
-r, --relative 创建相对于链接位置的符号链接
对于 Yocto 2.3 至 3.4:
do_install_append() {
install -d ${D}/lib64
lnr ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
}
对于 Yocto 4.0+(或者如果您的主机系统具有 coreutils 8.16+):
do_install:append() {
install -d ${D}/lib64
ln --relative --symbolic ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
}
或者,您也可以
inherit relative_symlinks
lnr
不太常用。比照:
尽量避免使用绝对路径:
do_install_append() {
install -d ${D}/lib64
cd ${D}/lib64
ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2
}
我查看了其他食谱如何在 rootfs 中创建链接,大多数似乎都是这样做的:
ln -sf /data/etc/bluetooth/main.conf ${D}/${sysconfdir}/bluetooth/main.conf
配方中的此命令将在设备上创建以下链接:
/# ls -al /etc/bluetooth/main.conf
lrwxrwxrwx 1 root root 29 Sep 11 15:34 /etc/bluetooth/main.conf -> /data/etc/bluetooth/main.conf
创建链接时使用 Yocto 生成的完整路径,但使其指向 rootfs 中的“最终”位置。
这样您就可以使用“绝对”路径,而不必更改配方中的工作目录。
截至 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"
请注意我写的示例是完全虚构的并且在任何意义上都是绝对异端安装库的方式。如果您正在构建基于 Makefile 的库,请使用 -Wl,-soname,libmine.so.1,然后在 Recipe
中使用do_install() {
install -d ${D}${libdir}
oe_libinstall -so libmine ${D}${libdir}
...
这会自动创建:
libmine.so.1 -> libmine.so.1.0.0
libmine.so.1.0.0
你可以这样做:
ln -s ../lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
或者,如果您在目标系统启动之前不需要符号链接(即它不是您正在构建的其他软件包的依赖项),您也可以这样做:
ln -s /lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
ln
不关心创建符号链接时您的目标是否有效或是否存在。在您启动目标系统(或以某种方式将此文件系统挂载到 /)后,它将变得有效。但确实,建议使用相对链接。