create symbolic link in bitbake recipe
Solution 1
Try to avoid usage of absolute paths:
do_install_append() {
install -d ${D}/lib64
cd ${D}/lib64
ln -s ../lib/ld-2.26.so ld-linux-x86-64.so.2
}
Solution 2
The cleanest solution is to use the "-r" flag:
do_install_append() { install -d ${D}/lib64 ln -s -r ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2 }
From the gnu ln man page:
-r, --relative create symbolic links relative to link location
Solution 3
Since Yocto 2.3, lnr
is recommended.
e.g.
do_install_append() {
install -d ${D}/lib64
lnr ${D}/lib/ld-2.26.so ${D}/lib64/ld-linux-x86-64.so.2
}
Alternatively, you can also inherit relative_symlinks
which will turn any absolute symlinks into relative ones, but this is less commonly used than lnr
.
Cf. https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#migration-2.3-absolute-symlinks
Solution 4
I had a look at how other recipes create links in the rootfs, and most seem to do it this way:
ln -sf /data/etc/bluetooth/main.conf ${D}/${sysconfdir}/bluetooth/main.conf
This command in the recipe will create the following link on the device:
/# ls -al /etc/bluetooth/main.conf
lrwxrwxrwx 1 root root 29 Sep 11 15:34 /etc/bluetooth/main.conf -> /data/etc/bluetooth/main.conf
You use the full, Yocto-generated path when creating the link, but you make it point to the "final" location in the rootfs.
This way you can use "absolute" paths and won't have to change the working directory in the recipe.
Bernardo Rodrigues
I'm Ecosystem Success Engineer at Parity Technologies. I help teams building runtimes on Substrate achieve their goals. I'm constantly learning about Substrate and how it evolves, and this account is meant to share the doubts I have during my journey.
Updated on June 11, 2022Comments
-
Bernardo Rodrigues almost 2 years
I have a .bbappend recipe that I need to create a symbolic link in my system.
This is how it looks like now:
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 }
However, only the directory /lib64 is created in the sysroot. The symlink /lib64/ld-linux-x86-64.so.2 is not being generated.
What changes should I make in my recipe in order to have this symlink correctly created?